【超緊急】深刻な脆弱性HTTP2Shellが報告、CVSS v4.0で9.2と評価【要対応】
今すぐ対応してください
2026.10.25
圧縮形式「Brotli」の展開処理に、深刻な脆弱性が見つかりました
Brotli は、ウェブの通信を小さく圧縮するために広く使われている技術です
そのため影響は Node.js、Python、Bun、Envoy、Istio など多くのソフトウェアに広がっています
脆弱性は CVE-2026-111497 として識別されており、「HTTP2Shell」や「Node2Shell」という通称で呼ばれています
深刻度は、CVE の登録情報で CVSS v4.0 の 9.2(Critical)と評価されています
シンガポールの CSA(サイバーセキュリティ庁)は、CVSS v3.1 で 9.8 と案内しています
前回の PHP の脆弱性とは違い、今回はすでに修正版が公開されています
公開されている検証コード(PoC)も既に存在するため、修正版への更新が必要です
脆弱性の概要
現時点で報告されている情報は、以下のとおりです
| 項目 | 内容 |
|---|---|
| 対象 | Google Brotli のデコーダー(圧縮データを展開する部分) 1.0.3~1.2.0 |
| 脆弱性の識別番号 | CVE-2026-111497 |
| 通称 | HTTP2Shell、Node2Shell、Broccoli2Shell |
| 脆弱性の種類 | 境界外書き込み(CWE-787)、戻り値の確認漏れ(CWE-252) |
| 深刻度 | CVSS v4.0 で 9.2(CVE 登録情報) |
| 想定される被害 | サービス停止、メモリ内の情報の漏えい、条件によってはリモートコード実行(RCE) |
| 悪用状況 | 10月24日時点で、実際の攻撃での悪用は報告されていない |
| 修正状況 | Brotli 本体、Node.js、Python のパッケージ、Bun などで修正版が公開済み |
名前に「HTTP2」と付いていますが、HTTP/2 という通信の仕組みそのものの欠陥ではありません
問題があるのは、Brotli で圧縮されたデータを展開する処理です
どんな仕組みの脆弱性なのか
攻撃者が細工した Brotli の圧縮データを、脆弱なデコーダーで展開すると、プログラムのメモリが壊れます
その結果、プログラムが停止したり、メモリ内の情報が漏れたり、条件によっては攻撃者のコードが実行されたりするおそれがあります
Brotli を使っているだけで、すぐに外部から攻撃されるわけではありません
攻撃が成立するのは、攻撃者が用意した圧縮データを展開してしまう経路がある場合です
受信側:外から届いたデータを展開する
ウェブサーバーが、Brotli で圧縮されたリクエスト(Content-Encoding: br)を自動で展開する場合、たとえば Express 5 系(body-parser 2 系)は、初期設定で Brotli のリクエストを展開します
送信側:外から取ってきたデータを展開する
Node.js の fetch() や Python の HTTP クライアントなどが、Brotli で圧縮されたレスポンスを自動で展開する場合、「指定された URL のページを取得する」ような機能は、攻撃者が用意したサーバーに接続させられる可能性があります
リンクのプレビュー、Webhook、画像の取り込み、RSS の取得など、取得先を外部から指定できる機能は特に注意が必要です
直接:プログラムの中で展開する
zlib.brotliDecompress() などで、外部から受け取ったデータを展開している場合
そのほかの攻撃対象
| 対象 | 内容 |
|---|---|
| プロキシ | Brotli の展開機能を有効にしている Envoy や Istio など |
| クライアント | 修正前の Node.js や Python で動く CLI ツールやスクリプト、デスクトップアプリに同梱された Node.js(後述)、更新していないブラウザ |
攻撃対象にならないもの
| 対象 | 理由 |
|---|---|
| Brotli で圧縮して返すだけのサーバー | CDN やウェブサーバーで Brotli 圧縮を有効にしているだけなら、展開はしないので対象外です |
| Brotli のリクエストを受け付けない設定のサーバー | Express 4 系は、初期設定では Brotli のリクエストを拒否します |
「Brotli を使っているもの全部」ではなく、「外から来たデータを展開するもの全部」が対象です
どこまで危険なのか
ログインしていなくても狙われる可能性がある
リクエストの本文の展開は、多くの場合ログインの確認より前に行われます
そのため Brotli を展開する設定のサーバーであれば、ログインしていない攻撃者でも不具合を起こさせることができます
WAF で防げるのは受信側だけ
外から届くリクエストであれば、WAF やリバースプロキシで Content-Encoding: br を拒否することで防げます
一方で、自分のサーバーが外へ取りに行った応答は WAF の検査を通らないため、送信側の経路は WAF では守れません
現時点で確実なエクスプロイトは「サービス停止」
公開されている検証コードで確実に引き起こせるのは、プログラムを強制終了させるサービス停止です
リモートコード実行は、研究者の検証環境で特定の条件のもとで成功した報告があるものの、毎回成功するわけではありません
ただし、今後検証コードが改良されれば、より深刻な攻撃が可能になるおそれがあります
対応しなかった場合に起こりうること
本番環境だけ更新すれば安全、というわけではありません
リモートの検証環境やローカルの開発環境は守りが手薄になりがちで、むしろ狙われやすいです
本番環境
- サービス停止: 細工したデータを送られるたびにプログラムが落ち、サービスが止まります
- 情報の漏えい: プログラムのメモリには、ログイン中の利用者の情報、API キー、データベースの接続情報などが載っています
- サーバーの乗っ取り: リモートコード実行に至った場合、データの盗み出しや改ざん、不正なプログラムの設置につながります
検証環境(ステージング)
- 本番と同じ構成、本番に近いデータ: 本番のデータをコピーして使っていれば、漏れる情報は本番と変わりません
- 守りが手薄: 認証が簡易的、監視されていない、使い終わっても公開されたまま、ということが少なくありません
- 本番への足がかり: 本番と同じ API キーやパスワードを使い回していると、検証環境を破られただけで本番に入られます
開発環境(開発者の PC、CI/CD)
- 開発者の PC: 外部の URL からデータを取得するスクリプトや、Node.js で動く CLI ツール、開発支援ツールが攻撃の経路になります
- 同じネットワークからの攻撃: 開発サーバーを社内やカフェの Wi-Fi など、同じネットワーク全体に公開した状態で起動していると、同じネットワークにいる人から狙われます
- CI/CD: ビルドやテストの途中で外部からデータを取得する処理があれば、その経路から狙われます
- 盗まれるものが大きい: 開発環境には、クラウドの認証情報、デプロイ用の鍵、ソースコードへのアクセス権、パッケージの公開用トークンが集まっています。ここを破られると、自社だけでなく利用者や取引先まで巻き込む被害(サプライチェーン攻撃)につながります
本番、検証、開発のすべてで、Node.js などを修正版に更新してください
修正版の一覧
| ソフトウェア | 修正版 |
|---|---|
| Google Brotli | 1.0.10、1.1.1、1.2.1 |
| Node.js 22(LTS) | 22.23.4 以降 |
| Node.js 24(LTS) | 24.22.1 以降 |
| Node.js 26 | 26.12.1 以降 |
| Node.js 20、23、25 以前 | 修正版なし(サポート終了) |
| Bun | 1.4.4 以降 |
Python の Brotli パッケージ | 1.2.1 |
Python の brotlicffi パッケージ | 1.2.1.0 |
| Envoy | 1.40.0、1.39.3、1.38.6、1.37.8、1.36.12 |
| Istio | 1.31.2、1.30.6、1.29.9 |
※ Python は、Python 本体ではなく Brotli などのパッケージを更新します
※ Linux の libbrotli は、各ディストリビューションのセキュリティ情報を確認してください
※ デスクトップアプリに同梱されている Node.js は、アプリの更新でのみ修正されます
※ .NET や PHP(ext-brotli)などに同梱されているものは、10月24日時点で修正版が確認できていません
Node.js 20 はサポートが終了しているため、修正版は提供されません
Node.js 20 で動いているシステムは、Node.js 22 以降への移行が必要です
古いバージョンに依存していて、すぐに更新できないシステムは、外部からのデータを受け付ける機能を一時的に止めるなど、リスクを抑える判断が必要になります
既に公開されている検証コードがある
今回の脆弱性には、既に検証コード(PoC)が公開されています
1. 既に攻撃の手がかりが出回っている
検証コードが公開されているため、攻撃側は一から脆弱性を調べる必要がありません
攻撃用AIツールを使えば、検証コードを元に攻撃の仕組みを組み立てることも容易です
2. 更新していないサーバーや開発用PCが狙われる
現時点では実際の攻撃は報告されていませんが、検証コードが改良され、実用的な攻撃手法が確立されれば状況は一変します
今すぐ確認すること
確認しておくこと
| 確認事項 | 確認内容 | コマンド |
|---|---|---|
| Node.js のバージョン | 本番サーバー、検証環境、開発者の PC、コンテナ、CI/CD のすべてで確認する | node --version |
| Python のパッケージ | Brotli や brotlicffi が入っていないか確認する | pip show Brotli brotlicffi |
| Express のバージョン | Express 5 系を使っている場合は、Brotli のリクエストを受け付けていないか確認する | npm ls express body-parser |
| 外部の URL からデータを取得する機能 | ユーザーが URL を指定できる機能は特に注意する | - |
| ホスティング事業者の対応 | Vercel などのマネージドサービスは、各社のお知らせを確認する | - |
アプリに同梱されている Node.js にも注意
VS Code など、Electron で作られたデスクトップアプリの多くは、アプリの中に Node.js を同梱しています
PC に入れた Node.js を更新しても、アプリの中の Node.js は更新されません
| ポイント | 内容 |
|---|---|
| アプリが最新でも、中の Node.js が修正前のことがある | アプリの開発元が修正版を取り込んで更新を出すまでは、古いままです |
| アプリの更新を確認する | 修正版を含む更新が出たら、すぐに適用してください |
| バージョンを確認する | アプリの「バージョン情報」などで、同梱されている Node.js のバージョンを確認できる場合があります |
| すぐに更新が出ない場合 | 信頼できない拡張機能を入れない、外部のデータを読み込む機能を必要以上に使わない、といった対応でリスクを減らせます |
更新するときの注意
| 注意点 | 内容 |
|---|---|
| 更新後は、プログラムを再起動する | 動いたままのプログラムは、古いデコーダーを使い続けます |
| コンテナは作り直す | 古いイメージのままでは修正が反映されません |
| 公開されている検証コードを本番環境で試さない | 確認は隔離した環境で行ってください |
すぐに更新できない場合の一時的な対策
- リバースプロキシや WAF で、
Content-Encoding: brのリクエストを拒否する(受信側の対策のみ) - 使っていない Python の
Brotliやbrotlicffiを削除する - 外部の URL を取得する機能を止める、または取得先を制限する
※ Accept-Encoding から br を外すだけでは、対策になりません
攻撃者のサーバーは、求められていなくても Brotli で圧縮したデータを返せるからです
本記事は、2026年10月25日時点で公開されている情報に基づいています
影響範囲や修正状況については、各ソフトウェアの公式発表を確認してください
- Node.js 公式: October 2026 Security Releases
- CVE: CVE-2026-111497
- GitHub Advisory: GHSA-9v8h-qqgm-4m35
- Google Brotli: v1.2.1 リリース
- シンガポール CSA: AL-2026-154