先に要点
- HTTP2Shell(初めは Node2Shell とも)は、圧縮形式 Brotli の展開処理に見つかった脆弱性 CVE-2026-111497 の呼び名です。細工した Brotli のデータを展開させるだけで、メモリを壊してコードを実行されるおそれがあります(CVSS v4.0 で 9.2)。
- 原因は Google の Brotli ライブラリ(1.0.3〜1.2.0)なので、Brotli を組み込んだソフトが広く影響を受けます。公式に修正版が出ているのは Node.js・Bun・Python の brotli / brotlicffi・Envoy など。
- Node.js では、Express 5 などが使う body-parser 2.x が Brotli で圧縮された受信データを既定で展開し、fetch も HTTPS では Brotli の応答を既定で受け取ります。特別な使い方をしていなくても対象になりえます。
- やることは「修正版に上げて、プロセスやコンテナを入れ替える」。Node.js の修正版は 22.23.4・24.22.1・26.12.1 で、サポートが終わった 20・23・25 系には出ていません。
HTTP2Shell(エイチティーティーピー・ツー・シェル)は、Web でよく使われる圧縮形式 Brotli(ブロトリ) の展開処理に見つかった脆弱性の呼び名です。最初は Node.js の問題として「Node2Shell」と呼ばれましたが、原因が Brotli のライブラリそのものにあり、HTTP で Brotli を扱う多くのソフトに影響することから、HTTP2Shell とも呼ばれるようになりました。どちらもセキュリティ企業などが付けた呼び名で、公式の名前は CVE 番号の CVE-2026-111497 です。
この記事では、Brotli・Node.js・Bun・Envoy の公式の告知、CVE の登録情報、各パッケージの変更履歴(2026年10月25日に確認)をもとに、どこが影響を受けるか、自分の環境の確かめ方、更新の手順、すぐに更新できないときの暫定策とその限界を整理します。
HTTP2Shell とは:Brotli の展開処理の不具合
Brotli は、Web ページや API の応答を小さくして送るための圧縮形式です。サーバーが応答を Brotli で圧縮し、ブラウザやプログラムが受け取って展開します。今回の不具合は、この展開する側(デコーダー)にあります。
Node.js の告知によると、壊れた形式のデータを受け取ったとき、本来は「形式の誤り」として止めるべきところを「入力がまだ足りないだけ」と扱ってしまい、内部の小さな作業用の領域(8バイト)の外側にデータを書き込み続けます。その結果、プロセスのメモリが壊れ、異常終了・メモリの中身の漏えい・リモートからのコード実行につながるおそれがあります。
| 項目 | 内容 |
|---|---|
| 呼び名 | HTTP2Shell(Node2Shell) |
| CVE | CVE-2026-111497(Brotli のデコーダーの範囲外への書き込み) |
| 深刻度 | CVSS v4.0 で 9.2(Critical)。ネットワーク越し・認証不要・利用者の操作なし |
| 影響する Brotli | 1.0.3〜1.2.0 |
| Brotli の修正版 | 1.0.10・1.1.1・1.2.1(2026年10月21日) |
修正のコード自体は、Brotli の開発元のリポジトリに2026年2月に入っていましたが、セキュリティの修正として扱われず、修正を含むリリースが出たのは10月21日です。
影響を受けるもの:Brotli を組み込んだソフト
Brotli は多くのソフトにライブラリとして組み込まれています。自分のソフトが Brotli を「使っている」と意識していなくても、HTTP の圧縮の処理で裏で使われていることがあります。公式に告知や修正版が出ているものは次のとおりです。
公式に修正版が出ている主なソフト(2026年10月25日時点)
Node.js
同梱の Brotli に不具合。node:zlib で Brotli を展開すると影響する。
- 影響:22.x・24.x・26.x
- 20・23・25 系はサポート終了で修正なし
- fetch や body-parser が自動で使う
Bun
1.4.4 のセキュリティ修正の対象に Brotli が含まれる。
- bun upgrade で更新
- fetch・Bun.serve なども同じリリースで修正
Python の brotli / brotlicffi
入っていると requests(urllib3)や httpx などが Brotli の応答を受け取るようになる。
- pip で更新
- 入っていることに気づきにくい
Envoy
Brotli の展開のフィルターを設定している場合に影響。
- 修正版:1.40.0・1.39.3・1.38.6・1.37.8・1.36.12
- 圧縮(送る側)だけなら対象外
このほか、OS に入っている Brotli のライブラリ(Debian・Ubuntu の libbrotli など)を使うソフトも、OS の更新で直します。Debian はすでに修正(DSA-6582-1)を出しています。Ubuntu の CVE のページは2026年10月25日時点で「調査中(Needs evaluation)」です。ディストリビューションごとの状況は、それぞれのセキュリティ情報で確かめてください。
Node.js で「使っているつもりがなくても」対象になる理由
Node.js では、次の2つが既定の動作のまま Brotli を展開します。
受け取る側
Express の body-parser(2.x)
公式の説明では、すべてのパーサーが gzip・br(Brotli)などで圧縮された受信データを自動で展開し、その設定(inflate)は既定で有効です。外から Content-Encoding: br の付いたリクエストを送られると、アプリのコードに届く前に展開されます。Brotli への対応は 2.0.0 で入ったもので(Express 5 が使う版)、1.x 系は gzip と deflate だけです。
取りに行く側
fetch(undici)
HTTPS のリクエストでは Accept-Encoding に br を含めて送り、相手が Brotli で返した応答を node:zlib で展開します(undici のソースで確認)。アクセス先のサーバーが乗っ取られていたり、悪意のある相手だったりすると、細工した応答を受け取ることになります。
Python でも、urllib3 の公式ドキュメントにあるとおり、brotli か brotlicffi のパッケージが入っていると、Brotli を受け取れることを相手に伝えるようになります。ほかのパッケージの依存として自動で入っていることがあるので、「入れた覚えがない」は安全の理由になりません。
自分の環境を確かめる
まず、どのソフトのどの版が動いているかを確かめます。サーバーに入っているコマンドの版と、実際に動いているプロセスの版が違うことがあるので、両方を見ます(脆弱性スキャナーが緑でも、動いている版が古いことがある)。
# Node.js(修正版:22.23.4 / 24.22.1 / 26.12.1)
node -v
# Bun(修正版:1.4.4)
bun --version
# Python の Brotli のパッケージ(修正版:brotli 1.2.1 / brotlicffi v1.2.1.0)
python -m pip show brotli brotlicffi
# OS のライブラリ(Debian・Ubuntu の例)
dpkg -l | grep -i brotli
コンテナで動かしている場合は、コンテナの中の版を確かめます。手元の node -v が新しくても、本番のコンテナのベースイメージが古いままなら意味がありません。
| どこで動いているか | 確かめ方 |
|---|---|
| サーバーに直接入れた Node.js・Python | 上のコマンド。nvm などで複数の版が入っていれば、サービスが使う版を確かめる |
| Docker のコンテナ | docker exec でコンテナの中で node -v などを実行する。Dockerfile の FROM の版も見る |
| PaaS・サーバーレス | 実行環境の版を管理画面や設定で確かめる。提供元の告知も見る |
| Envoy | envoy --version と、Brotli の展開のフィルターを設定しているか |
更新の手順:上げて、入れ替える
ライブラリの不具合なので、修正版に上げたうえで、動いているプロセスを入れ替えるまで終わらせます。ファイルを新しくしただけでは、古いプロセスがメモリに古い Brotli を持ったまま動き続けます。
HTTP2Shell の対応の順番
Node.js 20・23・25 系はサポートが終わっているため、今回の修正は出ていません。Node.js は告知で「サポートが終わった版は、セキュリティリリースのたびに常に影響を受ける」と明記しています。22 系以降への移行が必要です。サポート期間の読み方は EOLとLTSの違い で整理しています。
すぐに更新できないときの暫定策と、その限界
更新までの間は、Brotli のデータを展開させないようにすると危険を減らせます。ただし、どれも抜け道があるので、更新の代わりにはなりません。
| 暫定策 | 防げるもの | 限界 |
|---|---|---|
| body-parser の inflate を無効にする(例:express.json の設定で inflate: false) | 圧縮されたリクエストの展開。公式の説明では、圧縮されたデータは拒否される | gzip などの圧縮も受け付けなくなる。自分で zlib を使って展開している箇所は防げない |
| リバースプロキシで Content-Encoding が br のリクエストを拒否する | 外からの Brotli のリクエストがアプリに届くこと | 別の経路(内部の通信・別のポート)は防げない |
| fetch に Accept-Encoding を自分で指定し、br を外す | 相手に Brotli で返してもらうことを頼まない | 悪意のある相手は頼まれなくても Brotli で返しうる。undici は受け取った応答を展開する |
| 使っていない brotli / brotlicffi のパッケージを外す | Python の HTTP ライブラリが Brotli を扱うこと | ほかのパッケージが依存していると外せない。外すと動かなくなる処理がないか確認が要る |
リバースプロキシ(nginx など)で拒否する場合の例です。設定を変えるときは、正しい利用者の圧縮されたリクエストまで止めてしまわないかを、検証環境で確かめてから入れます。
# Brotli で圧縮されたリクエストの本文を受け付けない(更新までの暫定策)
if ($http_content_encoding ~* br) {
return 415;
}
攻撃の状況を確かめる
CISA の KEV カタログ(10月23日の更新版)には未掲載。修正の中身は公開済み。Ubuntu は調査中、Debian は修正済み。状況は変わるので、対応の前に各公式の情報を見直してください。
2026年10月25日時点で、米国の CISA が実際に悪用された脆弱性をまとめた KEV カタログ には載っていません(10月23日の更新版で確認)。ただし、深刻度が高く、修正の中身もすでに公開されているため、悪用が確認されてから動くのでは遅いと考えます。
異常に気づくための目安としては、Node.js や Python のプロセスの原因の分からない異常終了が増えていないか、圧縮された大きなリクエストが急に増えていないかを、ログや監視で見ておきます。メモリが壊れる種類の不具合なので、攻撃が失敗するとプロセスが落ちる形で表に出ることがあります。
HTTP2Shell についてよくある質問
Q. フロントエンドの JavaScript(ブラウザ)は影響を受けますか?
A. 今回の公式の告知の対象は、Node.js・Bun・Python のパッケージ・Envoy など、サーバーやプログラムの側で Brotli を展開するソフトです。ブラウザも Brotli の応答を展開しますが、ブラウザ自体の状況は今回の告知の範囲外なので、各ブラウザの更新情報で確かめます。ブラウザは自動で更新されることが多いので、最新の版に保っておきます。
Q. Next.js や Nuxt などのフレームワークを更新すればいいですか?
A. 不具合は Node.js 本体に同梱された Brotli にあるので、直すのは Node.js です。フレームワークを更新しても、動かしている Node.js が古いままでは直りません。Vercel などの PaaS で動かしている場合は、実行環境の Node.js の版と、提供元の告知を確かめます。
Q. 自分のサーバーでは Brotli で圧縮して返しているだけです。影響はありますか?
A. 不具合は展開する側にあるので、圧縮して送るだけなら、その処理は対象外です。たとえば Envoy の告知でも、影響は Brotli の展開のフィルターを設定している場合とされています。ただし、同じサーバーで動く Node.js のアプリが受信データを展開していたり、外部の API を fetch で呼んでいたりすれば、そちらが対象になります。
Q. PHP2Shell とは関係がありますか?
A. 別の脆弱性です。PHP2Shell は PHP 本体の不具合で、HTTP2Shell は Brotli のライブラリの不具合です。どちらも2026年10月21日に修正が公開されたので、両方のサーバーを持っている場合はそれぞれ対応します。PHP2Shell は PHP2Shellとは? で整理しています。
まとめ
- HTTP2Shell(CVE-2026-111497)は、Brotli の展開処理の不具合です。細工したデータを展開させるだけで、メモリを壊してコードを実行されるおそれがあります。
- Brotli を組み込んだ Node.js・Bun・Python のパッケージ・Envoy などが影響を受けます。Node.js では、body-parser 2.x と fetch が既定の動作で Brotli を展開します。
- 対応は「修正版に上げて、プロセスとコンテナを入れ替える」。Node.js は 22.23.4・24.22.1・26.12.1 で、20 系はサポート中の系への移行が必要です。
- 暫定策は展開させないことですが、抜け道があります。更新までのつなぎとして使います。
参考リンク
- Node.js: October 2026 Security Releases
- CVE: CVE-2026-111497
- Brotli: Releases(v1.2.1 / v1.1.1 / v1.0.10)
- Bun: Bun v1.4.4
- Envoy: Out-of-Bounds Write in Brotli Decompressor(GHSA-3wvj-j6qm-62mr)
- brotlicffi: Changelog
- Express: body-parser
- urllib3: urllib3.util(accept_encoding)
- Debian: CVE-2026-111497(Security Tracker)
- Ubuntu: CVE-2026-111497
- CISA: Known Exploited Vulnerabilities Catalog