Brotliの脆弱性CVE-2026-111497とは、Node.jsや.NET、Pythonに広がる展開処理のメモリ破壊と更新先
対象の目安: Node.js、.NET、PythonでWebアプリやAPIを開発、運用するエンジニア / 実務


Webの通信で広く使われる圧縮形式Brotliの、Google製の実装(google/brotli)にあるデコーダーに、範囲外書き込みの脆弱性CVE-2026-111497が見つかりました。細工した圧縮データを展開させるだけで、プロセスのメモリを壊し、メモリ内容の漏えいやサービス停止、条件によってはリモートコード実行につながりえます。米国のCISAは2026年10月27日に、この脆弱性を悪用が確認された脆弱性のカタログ(KEV)に追加しました。
この脆弱性はライブラリの中にあるため、Brotliを内部に組み込んだランタイムや製品へそのまま広がります。Node.jsは本体にBrotliを同梱しており、.NETのランタイム、PythonのBrotliパッケージ、プロキシのEnvoyも、それぞれ修正版を出しています。GitHubのアドバイザリには、Node2Shellという通称も付いています。
この記事は、Node.js、.NET、PythonでWebアプリやAPIを開発、運用するエンジニアに向けて、脆弱性の中身、影響が出る経路、製品ごとの修正版、更新できない間の暫定策を、CVEレコード、NVD、各プロジェクトのアドバイザリ、CISAの一次情報で整理します。攻撃を再現する手順やデータは扱いません。事実は執筆時点(2026年11月2日)で確認できた範囲に限ります。
CVE-2026-111497はBrotliデコーダーの範囲外書き込み
Brotliは、Googleが開発したデータ圧縮形式です。HTTPではContent-Encodingの値brとして使われ、Webページや静的ファイルの配信で、gzipに並ぶ圧縮方式として普及しています。google/brotliは、その参照実装のC言語ライブラリです。
CVEレコードによると、CVE-2026-111497はこのライブラリのデコーダー(c/dec/decode.c)にあるバッファオーバーフローで、すべてのプラットフォームが対象です。CVEレコードの影響範囲は、1.0.3以上1.0.10未満、1.1.0以上1.1.1未満、1.2.0以上1.2.1未満の3系統に分けて記載されています。認証のない遠隔の攻撃者が、細工したBrotliの圧縮ストリームを使って、隣り合うデコーダーの状態を壊したり、メモリの内容を漏らしたり、サービスを止めたり、場合によっては任意のコードを実行したりできるとしています。弱点の分類は、NVDとCISAのどちらも、戻り値を確かめない不備(CWE-252)と範囲外書き込み(CWE-787)です。
誤ったデータを「入力待ち」と扱ったことが原因
Node.jsのアドバイザリは、仕組みをもう少し具体的に説明しています。不正なブロック切り替えの指示を含むデータを受け取ったとき、デコーダーはそれを形式の誤りとして処理を止めるべきところを、「入力がまだ足りない」という一時的な状態として返していました。ストリームで展開する処理はその戻り値を信じて入力を足し続け、8バイトしかない内部のバッファの後ろへデータを書き込んでしまいます。
確保した領域の外へ書き込むと、隣にある別のデータが上書きされます。上書きされた値をプログラムが後で使えば、異常終了や情報の漏えい、制御の乗っ取りにつながります。範囲外書き込みがコード実行に至る一般的な仕組みは、次の記事で整理しています。
あわせて読みたい
バッファオーバーフローの仕組みと対策。境界を越えた書き込みがコード実行に至る理由
深刻度の評価は評価者によって異なる
CVSSの値は、評価した組織と版によって違います。前提とした攻撃条件の置き方が違うためです。
| 評価者 | CVSSの版 | スコア | 主な前提 |
|---|---|---|---|
| Google(CNA) | v4.0 | 9.2(Critical) | ネットワーク経由、認証不要、攻撃の成立に条件あり(AT:P) |
| NVD | v3.1 | 9.8(Critical) | ネットワーク経由、認証不要、攻撃の複雑さは低い |
| Microsoft(.NET) | v3.1 | 8.1(High) | 攻撃の複雑さは高い(AC:H) |
Microsoftは攻撃の複雑さを高いと評価しています。これとは別に、.NETでは既定の設定でBrotliの自動展開が有効になっていないと説明しています。自社の環境での深刻度は、スコアの大小より、攻撃者のデータを展開する経路が実際にあるかで判断します。
CISAがKEVに登録し、対応期限を11月10日とした
CISAは2026年10月27日に、CVE-2026-111497をKEVカタログへ追加しました。KEVは、実際に悪用されたことが確認された脆弱性の一覧です。カタログ上の名称はGoogle Brotli Unchecked Return Value Vulnerabilityで、米国の連邦機関に対する対応期限は2026年11月10日です。
カタログの注記は、この脆弱性がオープンソースのコンポーネントやサードパーティのライブラリにあり、さまざまな製品で使われうるものだと明記しています。一方で、ランサムウェアでの利用は「不明」とされ、カタログの記載からは、どの製品が、誰に、どの程度攻撃されたかは読み取れません。執筆時点で確認できたのは、悪用が確認されたという事実と対応期限までです。
KEVへの登録は、対応の優先度を上げる強い根拠になります。KEVとEPSSを使った優先順位の付け方は、次の記事で整理しています。
あわせて読みたい
脆弱性対応の優先順位付け。CVSSだけに頼らないEPSSとCISA KEVの使い方
ライブラリの脆弱性がランタイムや製品へ広がる
Brotliの展開処理は、多くのソフトウェアの内部に組み込まれています。CVE-2026-111497の影響範囲が広いのは、google/brotliそのものを使っていなくても、Brotliを組み込んだランタイムやライブラリを使っていれば同じコードが動くためです。
オープンソースのセキュリティ情報を共有するメーリングリストoss-securityでも、当初はNode.jsの脆弱性として告知されたものの、実体はgoogle/brotliの問題で、それを使うあらゆるソフトウェアに波及するという指摘が出ました。同じスレッドでは、Brotli対応でビルドされたlibcurlを使うGitのHTTPS通信(git-remote-https)も影響を受けると報告されています。第三者がまとめた影響製品の一覧も公開されていますが、製品ごとの影響の有無と修正版は、各ベンダーの公式情報で確かめます。
依存関係の奥にある部品の脆弱性を見つけるには、使っている部品の一覧が手元にあることが前提になります。依存関係の管理とSBOMの活用は、次の記事で整理しています。
あわせて読みたい
2026年版の最小要素で見直すSBOMの作り方と脆弱性管理での使い方
製品ごとの影響範囲と修正版
執筆時点で各プロジェクトの一次情報から確認できた修正版は、次のとおりです。
| 対象 | 影響を受ける版 | 修正版 | 一次情報 |
|---|---|---|---|
| google/brotli(Cライブラリ) | 1.0.3から1.0.10未満、1.1.0、1.2.0 | 1.0.10、1.1.1、1.2.1 | CVEレコード、GitHubリリース |
| Node.js | 22.x、24.x、26.x | 22.23.4、24.22.1、26.12.1 | Node.jsのセキュリティリリース |
| .NET(ランタイム) | 8.0、9.0、10.0、11のプレビュー版 | 8.0.33、9.0.22、10.0.14、11.0.0-rc.3 | Microsoftのアドバイザリ |
| Python brotli / brotlicffi | brotli 1.0.3から1.2.1未満、brotlicffi 1.0.3から1.2.1.0未満 | brotli 1.2.1、brotlicffi 1.2.1.0 | GitHubアドバイザリ |
| Envoy | v1.39.2、v1.38.5、v1.37.7、v1.36.11 | v1.40.0、v1.39.3、v1.38.6、v1.37.8、v1.36.12 | Envoyのアドバイザリ |
google/brotliは2026年10月21日に1.2.1を公開し、リリースノートにCVE-2026-111497の修正を記載しています。CVEレコードの公開は10月22日です。製品ごとの補足は次のとおりです。
Node.jsは本体に同梱したBrotliの更新が必要
Node.jsは2026年10月21日のセキュリティリリースで、22.23.4、24.22.1、26.12.1を公開しました。アドバイザリは、node:zlibでBrotliのデータを展開するアプリケーションに攻撃者がデータを渡せる場合、プロセスのメモリが壊れ、異常終了、メモリ内容の漏えい、リモートコード実行につながりうるとしています。サポートが終わった版は、セキュリティリリースの際は常に影響を受けるものとして扱うよう求めています。
Node.jsは標準のビルドでBrotliを本体のバイナリに静的に組み込んでいるため、OSのlibbrotliを更新してもNode.jsの中のBrotliは古いままです。Node.jsにはビルド時に共有ライブラリのBrotliへリンクする設定もあるため、配布元が独自にビルドしたNode.jsは、配布元の修正情報で確かめます。Node.js自体を修正版に上げ、Node.jsを含むコンテナイメージは作り直します。同じリリースでは、TLS証明書のホスト名検証の回避など、ほかに9件の脆弱性も修正されています。
.NETは既定では自動展開しないが、設定次第で露出する
Microsoftのアドバイザリによると、.NETの影響はBrotliのデコーダーを含むランタイムやNativeAOTのパッケージで、.NET Frameworkは対象外です。修正版のSDKは、8.0系が8.0.133と8.0.427、9.0系が9.0.123と9.0.320、10.0系が10.0.114と10.0.403です。ランタイムを同梱して配布する自己完結型のアプリケーションは、更新したランタイムで再ビルドして配置し直します。NativeAOTのアプリケーションは、実行ファイルにデコーダーが組み込まれているため、マシンの共有ランタイムを更新しても置き換わりません。SDKと明示的に参照しているパッケージを修正版にしたうえで、発行し直して配置します。
ASP.NET Coreの要求の自動展開とHttpClientの応答の自動展開は、既定では有効ではありません。そのためMicrosoftは、影響を受けるパッケージが入っているだけでは露出しないとし、次のいずれかを使う場合に影響を受けるとしています。
- ASP.NET Coreの要求展開ミドルウェアを、Brotli(br)を含めて有効にしている
- HttpClientHandlerやSocketsHttpHandlerのAutomaticDecompressionに、BrotliかAllを指定している
- System.IO.CompressionのBrotliStreamやBrotliDecoderで、外部から来たデータを展開している
PythonとEnvoyは展開を使う設定かどうかで確認する
PythonではPyPIのbrotliとbrotlicffiが対象で、修正版はbrotli 1.2.1とbrotlicffi 1.2.1.0です。これらはC実装のBrotliを内部で使うパッケージで、HTTPクライアントなどが依存関係として入れている場合があります。直接インストールした覚えがなくても、依存関係の一覧で確かめます。
Envoyのアドバイザリは、Brotliのデコンプレッサーを設定しているEnvoyが影響を受けるとしています。サービスメッシュなどでEnvoyを間接的に使っている場合は、採用している製品の修正情報もあわせて確認します。
攻撃者のデータを展開する経路が露出点になる
この脆弱性は、Brotliのライブラリが入っているだけでは成立しません。攻撃者が用意したBrotliデータを、その環境が展開したときに成立します。自社の環境で露出があるかは、外から来たBrotliデータを展開する経路があるかで判断します。
サーバーが受け取る圧縮された要求本文
HTTPでは、クライアントがContent-Encoding: brを付けて圧縮した要求本文を送ることができます。サーバー側のフレームワークがこれを自動で展開する設定なら、認証の前段階で攻撃者のデータがデコーダーに届きえます。
たとえば、Express 5で使われるbody-parserの2.0.0以降は、gzipやdeflateに加えてbrの自動展開に対応しており、展開を有効にするinflateオプションの既定値はtrueです。Node.jsの上でこの構成を使うAPIは、Node.js本体を更新するまで、細工した要求本文を展開してしまう可能性があります。ASP.NET Coreの要求展開ミドルウェアやEnvoyのBrotliデコンプレッサーも、同じ位置づけです。
外部から受け取る応答の自動展開
もう一つの経路は、自社のプログラムが外部へ通信し、応答を自動で展開する場合です。Node.jsに組み込まれたfetchの実装(undici)は、応答のContent-Encodingがbrであれば、zlibのBrotli展開で中身を戻します。libcurlをBrotli対応でビルドした環境のツールや、.NETのHttpClientでBrotliの自動展開を有効にしたアプリケーションも同様です。
この経路が問題になるのは、通信先を利用者が指定できる機能です。Webhookの送信、URLを貼るとページのプレビューを作る機能、指定したURLから画像やフィードを取り込む機能などでは、攻撃者が自分のサーバーを通信先に指定し、細工したBrotliの応答を返せます。要求ヘッダーでbrを求めていなくても、相手のサーバーがそれに従う保証はありません。利用者が指定したURLへサーバーから通信する機能の守り方は、次の記事で整理しています。
あわせて読みたい
SSRFとは何か。サーバーを踏み台にする脆弱性の仕組みと許可リスト方式の防御を解説
運用側がとる初動
KEVに登録され、対応期限も示されているため、露出の確認と更新を並行して進めます。次の順序で手を付けます。
- 1
Brotliを含む部品を洗い出す
Node.jsの版、.NETのランタイムの版、Pythonの依存関係にあるbrotliとbrotlicffi、OSのlibbrotliのパッケージ、Envoyやそれを含む製品を一覧にします。SBOMがあれば、brotliを名前に含む部品を検索します。コンテナイメージは、ベースイメージに含まれる部品も対象にします。
- 2
外部のBrotliデータを展開する経路を特定する
圧縮された要求本文を自動で展開する設定、応答を自動で展開するHTTPクライアント、アップロードされたファイルや外部のデータをBrotliで展開する処理を確認します。インターネットから到達できる経路と、利用者が通信先を指定できる機能を優先します。
- 3
修正版へ更新し、プロセスを再起動する
Node.jsは22.23.4、24.22.1、26.12.1のいずれか、.NETは8.0.33、9.0.22、10.0.14のいずれかのランタイムへ更新し、自己完結型とNativeAOTのアプリケーションは再ビルドして配置し直します。PythonはbrotliとbrotlicffiをGitHubアドバイザリの修正版へ上げ、OSのパッケージは配布元のアドバイザリの修正済みパッケージへ更新します。更新後は、古いライブラリを読み込んだままのプロセスが残らないよう再起動し、コンテナイメージは作り直して入れ替えます。
- 4
更新できない間はBrotliの展開を止める
要求本文の自動展開が不要なら、前段のリバースプロキシでContent-Encoding: brの要求を拒否するか、アプリケーション側の展開を止めます。Microsoftは、すでにBrotliの展開を使っている場合に、要求展開の設定からbrを外す方法と、HttpClientの自動展開の指定からBrotliを外す方法を示しています。ただし、展開を新たに有効にする変更は加えないよう注意しています。
- 5
異常終了と不審な挙動を点検する
Node.jsや.NETのプロセスがメモリ違反で異常終了していないか、展開のエラーが急に増えていないか、Webサーバーのプロセスからシェルが起動されたり、説明のつかない外部への通信が出たりしていないかを確認します。不審な痕跡があれば、サーバーを隔離して証拠を保全し、インシデント対応に切り替えます。
注意
標準のビルドのNode.jsはBrotliを本体に同梱しているため、OSのパッケージ更新だけでは修正されません。npmのレジストリにあるパッケージを更新しても、Node.js本体のzlibは直りません。Node.js自体の版を確認します。
身元の確かでない入力を展開する処理は、今回のような実装の欠陥がなくても、少ない入力が巨大なデータに膨らむ圧縮爆弾の標的になります。展開する側に上限をかける設計は、次の記事で整理しています。
あわせて読みたい
圧縮爆弾(解凍爆弾)の仕組みと対策、展開後のサイズに上限をかけるアップロードとAPIの守り方
依存する部品の脆弱性を継続して追う運用は、次の記事で整理しています。
あわせて読みたい
依存ライブラリ管理とSCA。SBOMで攻撃面を把握する
確認チェックリスト
対応の抜けを防ぐための確認項目を整理します。
- Node.js、.NET、Python、OSのパッケージ、Envoyを含む製品のうち、Brotliを含むものを洗い出したか
- Node.jsを22.23.4、24.22.1、26.12.1のいずれかへ更新し、Node.jsを含むコンテナイメージを作り直したか
- .NETのランタイムを8.0.33、9.0.22、10.0.14のいずれかへ更新したか。.NET 11のプレビュー版はRC3以降にしたか
- 自己完結型とNativeAOTの.NETアプリケーションを、修正版で再ビルドして配置し直したか
- Pythonの依存関係にあるbrotliを1.2.1以降、brotlicffiを1.2.1.0以降にしたか
- OSのlibbrotliを配布元の修正済みパッケージへ更新し、それを読み込むプロセスを再起動したか
- 圧縮された要求本文を自動で展開する設定(body-parser、ASP.NET Coreの要求展開、EnvoyのBrotliデコンプレッサーなど)の有無を確認したか
- 利用者が通信先を指定できる機能で、応答をBrotliで自動展開していないか確認したか
- 更新できないシステムで、不要なBrotliの展開を止める暫定策を入れたか
- プロセスの異常終了、不審なシェルの起動、説明のつかない外部への通信の有無を点検したか
まとめ
CVE-2026-111497は、google/brotliのデコーダーが不正なデータを入力待ちと誤って扱い、内部のバッファの外へ書き込んでしまう脆弱性です。Brotliはランタイムやライブラリの内部に組み込まれているため、Node.js、.NET、Python、Envoyなどへ広がり、CISAはKEVに登録しました。
自社の環境で優先すべきなのは、外部から来たBrotliデータを展開する経路を特定することと、部品ごとの修正版へ更新することです。Node.jsのように本体へ同梱している場合は、OSのパッケージ更新では直らない点に注意します。影響製品の情報は今後も各ベンダーから追加される可能性があるため、利用している製品の公式情報を引き続き確認します。
出典・参考
- CVE Record: CVE-2026-111497
- NVD - CVE-2026-111497
- google/brotli Release v1.2.1(SECURITY: CVE-2026-111497)
- GitHub Advisory GHSA-9v8h-qqgm-4m35: Out-of-bounds write in the Brotli decoder ("Node2Shell") also affects the PyPI Brotli package
- Node.js: October 2026 Security Releases
- Microsoft Security Advisory CVE-2026-111497 | .NET Brotli Decoder Out-of-bounds Write Vulnerability
- Envoy Security Advisory GHSA-3wvj-j6qm-62mr: Out-of-Bounds Write in Brotli Decompressor
- CISA: CISA Adds Two Known Exploited Vulnerabilities to Catalog(2026-10-27)
- CISA: Known Exploited Vulnerabilities Catalog
- oss-security: Brotli CVE-2026-111497 and git-remote-https(2026-10-26)
- expressjs/body-parser(README)
- MITRE CWE-787: Out-of-bounds Write
関連する記事
圧縮爆弾(解凍爆弾)の仕組みと対策、展開後のサイズに上限をかけるアップロードとAPIの守り方
圧縮爆弾は、小さな圧縮データを展開させてメモリやディスクを使い果たさせる攻撃です。ZIPのアップロード、圧縮された要求本文、外部から受け取る応答、画像の読み込みなど、Webアプリで展開が起きる入り口と、展開後のサイズと件数に上限をかける実装を、Node.jsとPythonの例と公式ドキュメントで整理します。
php2shellとは、PHP本体の未認証RCE(CVE-2026-109618とCVE-2026-109619)の影響と対策
php2shellは、PHP本体の脆弱性CVE-2026-109618とCVE-2026-109619の通称です。Webリクエストを処理するPHPで未認証のリモートコード実行につながり、CVSSは9.2です。修正版8.5.12、8.4.27、8.3.36、8.2.35と、mod_phpが最も危険とされる理由、暫定策と影響確認の手順を一次情報で整理します。
依存ライブラリ管理とSCA。SBOMで攻撃面を把握する
自作コードより外部ライブラリのほうが多い時代に、何を使っているかを台帳化するSBOMと、既知の脆弱性を突き合わせるSCAの基本を解説。SPDX/CycloneDXの違い、Dependabot/Renovateによる更新自動化、CI組み込みの判断基準まで実務目線でまとめます。


