Signal
📡 Signal|Brotli の脆弱性、Node.js と Python で遠隔コード実行のおそれ
Brotli 1.0.3〜1.2.0 の展開処理にメモリ範囲外書き込み (CVSS 9.2)。fetch() や requests の自動展開で、外へ取りに行く側も狙われる。修正版は Node.js 22.23.4 / 24.22.1 / 26.12.1、Python の Brotli 1.2.1。

Google が開発した圧縮形式 Brotli の展開処理に、メモリの範囲外へ書き込む脆弱性 CVE-2026-111497 が見つかった。対象は Brotli 1.0.3〜1.2.0 で、CVE を登録した Google は共通の深刻度指標 CVSS 4.0 で 9.2 (緊急) と評価した。Node.js は10月21日に修正版を出し、Python 向けのパッケージも22日に修正版 1.2.1 が公開された。
細工した圧縮データを展開させるだけで、ログインなしにプロセスのメモリを壊せる。サーバーだけでなく、外部のサイトへデータを取りに行く側のプログラムも狙われる。取引ボットや AI エージェントのように、知らない相手から届く応答を自動で読むソフトほど、この経路に近い。
8 バイトの領域に書き続ける展開処理
Node.js の公式アドバイザリによると、欠陥の中身はこうだ。不正なブロックの切り替えを「形式の誤り」として止めず、「入力がまだ足りない」と扱っていた。そのため展開処理は入力を待ち続け、届いたバイトを 8 バイトしかない内部の領域に足し続ける。攻撃者は、この領域の外のメモリを書き換えられる。結果として起こりうるのは、プロセスの停止、メモリ内容の漏えい、遠隔からのコード実行 (RCE) だ。
根本の修正は、Brotli の公開コードに2月27日の時点で入っていた (「不正なストリームを早めに検出して報告する」というコミット)。Aikido によると、当時はセキュリティの問題として扱われず、修正を含む版は出ていなかった。Google が修正版 1.2.1・1.1.1・1.0.10 を公開したのは、8 か月後の10月21日 (協定世界時) だ。Node.js のアドバイザリは、報告者として OpenAI Codex Security と 2 人の研究者を挙げている。
待ち受ける側と、取りに行く側
攻撃は 2 つの方向から届く。
1 つは待ち受ける側、つまりサーバーへの攻撃だ。The Hacker News と Aikido によると、Node.js の Web フレームワーク Express 5 と body-parser 2.x は、Content-Encoding: br が付いたリクエストの本文を、gzip などと同じく自動で展開する。誰でもこのリクエストを送れる。Node.js の素の HTTP サーバーは、受け取った Brotli を自分では展開しない。
もう 1 つは取りに行く側、つまりクライアントへの攻撃だ。Node.js の fetch() は、Brotli で圧縮された応答を自動で展開する。Python では requests (内部の urllib3) と aiohttp が、Brotli のパッケージが入っていれば同じように自動で展開し、httpx も Brotli を追加で入れた場合に展開する。攻撃者が用意したサイト、または乗っ取られたサイトが細工した応答を返せば、読みに行った側のプロセスに届く。Aikido はこの広がりを受けて、当初の「Node2Shell」を「HTTP2Shell」と呼び直した。
取りに行く側の経路は、サーバーの手前に置く防御が効かない。The Hacker News によると、Node.js を顧客に提供する Vercel は10月21日、攻撃を含むリクエストを止める firewall のルールを入れた。だが、アプリが外へ取りに行った応答はこのルールを通らない。Web を巡回して情報を集めるプログラム、取引所の API や価格データを読み続ける取引ボット、利用者が渡した URL を開く AI エージェントは、知らない相手の応答を毎日大量に展開している。AI エージェントが自分で Web を読みに行く使い方が増えるほど、この型の脆弱性の重みは増す。
Aikido によると、Apache と Nginx は標準の設定では Brotli を展開しないため、この経路の対象外だ。影響は Node.js と Python のほか、Bun、Envoy、Istio、Brotli を組み込んで作った curl にも及ぶ。Envoy は10月23日、Brotli の展開機能を設定している環境を対象に、同じ 9.2 の評価で修正版を出した。
公式ビルドでのコード実行と、悪用の現状
セキュリティ企業 Imperva の研究チームは10月22日、手を加えていない公式の Node.js 24.22.0 (Linux arm64 のイメージ) で、細工した Brotli データからコードを実行できたと報告した。デバッガーも特別なビルドも使っていない。リクエストの本文と、取りに行った応答の両方の経路で再現した。ただし、実行には何度かの試行が要り、毎回は成功しなかった。試したのはこの 1 つのビルドで、ほかの CPU や 22 系・26 系は試していない。修正版の 24.22.1 は同じ入力を拒否した。Imperva は攻撃コードそのものは公開せず、実演の動画を示した。
The Hacker News によると、それより前に公開された検証コードは、わざと弱くしたテスト用のビルドでしかコードを実行できなかった。実際の攻撃での悪用は、10月22日時点で報告されていない。
深刻度の見方は分かれている。Google は CVSS 4.0 で 9.2 (緊急) とし、Node.js 自身は一段下の「高」とした。Python 側では、Aikido が紹介した検証でメモリ破壊やコード実行までは試されていない。Brotli 1.2.0 が約 23MB の不正なストリームを拒否せずに読み続け、1.2.1 は拒否した、という確認にとどまる。
見落としやすいのは、自動の検査に頼れない点だ。Aikido によると、10月23日時点で pip-audit、Dependabot、Safety は、脆弱な版の Python パッケージを検出しない。脆弱性のデータベースで、この CVE が PyPI のパッケージにまだ結び付いていないためだ。
修正版
- Node.js: 22.23.4 / 24.22.1 / 26.12.1。サポートが終わった 20 系以前などの版には修正が出ない
- Python: Brotli 1.2.1 (10月22日公開) / brotlicffi 1.2.1.0 (同日公開)
- Brotli 本体: 1.2.1 / 1.1.1 / 1.0.10
- Envoy: 1.40.0 / 1.39.3 / 1.38.6 / 1.37.8
- Bun: 1.4.4 (Aikido による)
Linux のディストリビューションが配る Node.js や Brotli は、システムの Brotli を使うことがあり、修正を取り込んでも版番号が変わらない場合がある。コンテナのイメージは、古いタグに固定したままだと修正が入らない。Python で今すぐ版を上げられない場合、Brotli のパッケージを外すと、requests などは Brotli の圧縮を要求しなくなる。
次に見るもの
確認先は、GitHub Advisory Database の Brotli (PyPI) の項目だ。この CVE が PyPI の Brotli と brotlicffi に結び付けば、pip-audit や Dependabot が脆弱な版を自動で指摘し始める。それまでは、pip show brotli などで手元の版を自分で見る必要がある。Linux で配布版の Node.js を使っている場合は、利用中のディストリビューションのセキュリティ告知で、Brotli の修正が取り込まれたかを確かめたい。
ことば
- Brotli — Google が開発した圧縮形式。Web の通信で gzip より小さく圧縮でき、ブラウザやサーバー、HTTP のライブラリが広く使う。応答に
Content-Encoding: brと書かれていれば Brotli で圧縮されている。 - 範囲外書き込み — プログラムが確保したメモリの領域を越えて書き込んでしまう欠陥。隣り合うデータを壊し、条件がそろうと攻撃者の命令を実行させる足がかりになる。今回は 8 バイトの領域が越えられた。
- CVSS 4.0 — 脆弱性の深刻度を 0〜10 で表す共通の指標の最新版。9.0 以上が「緊急」。ネットワーク越しに認証なしで突けるかどうかなどで点が上がる。
🔗 一次ソース
- CVE-2026-111497 (CVE 公式レコード/採番は Google・CVSS 4.0 で 9.2・対象 1.0.3〜1.2.0 を確認)cve.org
Node.js: October 2026 Security Releases (10月21日/欠陥の内容・修正版 22.23.4 / 24.22.1 / 26.12.1・深刻度「高」・報告者を確認)nodejs.org
GitHub google/brotli: v1.2.1 リリース (10月21日/CVE-2026-111497 の修正を確認)GitHub
GitHub google/brotli: 修正コミット 0ed4268 (2月27日/不正なストリームの早期検出)GitHub
PyPI: Brotli 1.2.1 (10月22日公開を確認)PyPI
PyPI: brotlicffi 1.2.1.0 (10月22日公開を確認)PyPIEnvoy セキュリティアドバイザリ GHSA-3wvj-j6qm-62mr (10月23日/対象と修正版を確認)GitHub
Imperva: Node2Shell — From Brotli Data to Remote Code Execution (10月22日/公式 Node.js 24.22.0 でのコード実行)Blog- The Hacker News: Researchers Demonstrate Node2Shell RCE Exploit (10月23日/10月22日時点で悪用の報告なし・Vercel の対策)
- Aikido: Node2Shell が HTTP2Shell へ — Python ほかへの影響 (10月23日時点の検査ツールの状況)
- Aikido: Node.js 向けの解説と修正版