Node2Shell:Node.js、Bun、PythonのBrotli RCE(CVE-2026-111497)
CVSS v4.0 9.2と評価されたデコーダーのオーバーフローCVE-2026-111497は、Node.js、Bun、.NET、PythonのBrotliパッケージ、Envoy、Istioに影響します。修正は2026年10月21~25日に提供されました。
要点
- CVE-2026-111497は、Web全体でBrotli圧縮(
Content-Encoding: br)データを展開するC製Brotliデコーダーの境界外書き込みです。細工したストリームがプロセスメモリを破損し、クラッシュ、メモリ漏えい、コード実行を引き起こします。CVEレコードはCVSS v4.0 9.2(CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)と評価しています。Node.jsはHigh、Red Hatは8.1と評価しています。 - バグはGoogle Brotli 1.0.3~1.2.0に存在し、そのコードを同梱するすべてに波及します。Node.js 22.x、24.x、26.x、Bun 1.4.3以前、PyPIのBrotliとbrotlicffi、Brotli展開を有効にしたEnvoyとIstio、cdxgenスタンドアロンビルド、.NETランタイムです。.NETは10月25日に.NET 8から.NET 11リリース候補まで修正されました。
- 危険にさらされる条件は、他者が制御するBrotliデータをデコードすることです。
fetch()レスポンス、Express 5またはbody-parser 2のリクエスト本文、プロキシの展開フィルター、またはパッケージをインストールするとBrotliを自動デコードするPython HTTPクライアントが該当します。 - 実環境での悪用は確認されていません。CISAの10月23日の評価は悪用を「none」と記録しています。ImpervaのRed Teamは未改変のNode.js 24.22.0 ARM64ビルドでコード実行を実証しましたが、エクスプロイトは公開していません。10月22日に登場した公開概念実証は、意図的に弱体化したビルドでのみコード実行に到達し、標準ビルドではクラッシュと限定的なメモリ読み取りを起こします。Red Hatは、コードを実行するための信頼性の高い公開概念実証はないとしています。
- 今すぐデコーダーのすべてのコピーを更新し、サービスを再起動してコンテナーイメージを再ビルドしてください。稼働中のプロセスは再起動まで古いデコーダーを保持します。
影響を受けますか?
次の条件を両方満たす場合、影響を受けます。
- 実行しているソフトウェアが影響対象バージョンのBrotliデコーダーを同梱またはリンクしており、完全には制御できない相手からのBrotliデータをデコードする。素のNode.js HTTPサーバーは自らリクエスト本文をデコードしないため、以下の経路から危険が生じます。
- 特にPythonでは、Brotliまたはbrotlicffiパッケージがインストールされているだけでリスクが生じます。どちらかが存在するとrequests、urllib3、httpx、aiohttpなどのHTTPクライアントが自動的にBrotliレスポンスをデコードするため、アプリケーション自身がBrotliをインポートしなくても危険にさらされる場合があります。
| ソフトウェア | 影響を受けるバージョン | 修正バージョン |
|---|---|---|
| Google Brotli(Cライブラリ) | 1.0.3~1.2.0 | ブランチに応じて1.0.10、1.1.1、1.2.1(2026年10月21日) |
| Node.js 26.x | 26.12.1未満 | 26.12.1(2026年10月21日) |
| Node.js 24.x | 24.22.1未満 | 24.22.1(2026年10月21日) |
| Node.js 22.x | 22.23.4未満 | 22.23.4(2026年10月21日) |
| Node.js 20.x以前 | すべて(サポート終了) | なし。サポート対象系列へ移行 |
| Bun | 1.4.3以前 | 1.4.4(2026年10月22日) |
| .NET 8 | 8.0.0~8.0.32 | 8.0.33(2026年10月25日) |
| .NET 9 | 9.0.0~9.0.21 | 9.0.22(2026年10月25日) |
| .NET 10 | 10.0.0~10.0.13 | 10.0.14(2026年10月25日) |
| .NET 11プレビューとRC | 11.0.0-preview.1~11.0.0-rc.3.26522.147 | 11.0.0-rc.3.26522.148 |
| PyPI Brotli | 1.2.1未満 | 1.2.1 |
| PyPI brotlicffi | 1.2.1.0未満 | 1.2.1.0 |
| Go、andybalholm/brotli | 1.2.7未満 | 1.2.7(2026年10月23日) |
| Envoy | 1.36.11、1.37.7、1.38.5、1.39.2 | 1.36.12、1.37.8、1.38.6、1.39.3、1.40.0 |
| Istio | 1.29.0~1.29.8、1.30.0~1.30.5、1.31.0~1.31.1 | 1.29.9、1.30.6、1.31.2 |
| cdxgenスタンドアロンバイナリとイメージ | 13.4.0以前、12.8.8以前 | 13.5.0、12.8.9 |
| PHP公式Windowsビルド | 2026年10月21日の8.5.12、8.4.27、8.3.36、8.2.35(ビルドのSBOMによればBrotli 1.2.0を同梱) | Brotli 1.2.1を同梱した10月26日の再ビルド、8.5.12-1、8.4.27-1、8.3.36-1、8.2.35-1 |
.NETアドバイザリGHSA-p3jp-9v83-76w9(High、CVSS v3.1 8.1)は、4つのリリース系列にまたがる225のNuGetパッケージを対象とし、プロキシと同じ前提条件があります。ASP.NET CoreとHttpClientはデフォルト設定でBrotliデータを自動展開しないため、.NETアプリケーションが危険にさらされるのは、Brotli展開を有効にするか、攻撃者が制御するデータにBrotliStream、BrotliDecoder、自動展開オプションを明示的に使用する場合だけです。.NET Frameworkは影響を受けません。
デコーダーのGo移植版andybalholm/brotliも、decodeBlockTypeAndLengthに同じ戻り値の混同を含んでいました。Andy Balholmは2026年10月23日、Googleの修正0ed4268を直接移植したコミット33c2a988で修正し、アドバイザリもCVEも付けずにv1.2.7としてリリースしました。影響範囲はCデコーダーより狭くなります。Goのスライスアクセスには境界確認があるため、範囲外のブロック型インデックスは、検出されない境界外書き込みではなくpanicになります。したがってGoでの障害形態は、Cライブラリが許すメモリ破損ではなく、攻撃者の入力によるクラッシュです。それでも、攻撃者由来のBrotliを展開するGoサービスは1.2.7以降へ移行すべきです。
表にないものも含め、独自にデコーダーのコピーをコンパイルするプロジェクトは更新までバグを引き継ぎ、コミュニティのトラッカーが追跡しています。10月24日までに修正されたものは、いずれもBrotli 1.2.1を同梱するRubyのbrotli gem 0.9.1、PHP brotli拡張0.21.1、UEFITool A76と、Brotliフォークに4月に修正を取り込んだMuPDF 1.28.xです。10月27日時点で修正版リリースがなかったものはClickHouse、NanaZip、GraalJS(graal-nodejs)、YDB、libjxlで、mainブランチには修正済みですが最新リリースは影響対象デコーダーを同梱していました。またApache Arrowでは、新しいBrotliバージョンを強制するC++変更のプルリクエスト#55167がまだ未マージでした。
同梱コピーの1つは対応が遅れました。バージョン確認では検出できないため、正確に示す必要があります。10月21日のセキュリティリリース、PHP公式Windowsビルド8.5.12、8.4.27、8.3.36、8.2.35は、ソフトウェア部品表にBrotli 1.2.0を含んでいました。アプリケーションがHTTPレスポンスの自動展開を有効にすると、cURL拡張から到達できます。PHP FoundationによればcURLではデフォルトで無効ですが、アプリケーションやHTTPクライアントライブラリが有効にできます。10月26日、PHPチームは4つすべてをBrotli 1.2.1付きの8.5.12-1、8.4.27-1、8.3.36-1、8.2.35-1として再ビルドしました。PHPソースは変わらないため、php -vは更新前後で同じバージョンを表示し、再ビルドを識別できるのはパッケージ名の-1接尾辞とダウンロードページのSHA-256だけです。Guzzleは初期状態でこの露出条件を満たすクライアントライブラリです。7.16.1と8.3.1のソースによれば、そのcURLハンドラーはdecode_contentオプションがfalseでない限りCURLOPT_ENCODINGを空の値にします。空の値は、対応するすべてのエンコーディングを受け入れて展開するようcURLに指示します。
EnvoyとIstioは、たとえばEnvoy decompressorフィルターを通じてBrotli展開を明示的に有効にした場合に影響を受けます。無効であれば欠陥に到達できません。
ホスト、コンテナー、CIイメージで実行しているものを確認してください。
node --version && node -p "process.versions.brotli" # Node.js: runtime and bundled decoder
bun --version # Bun 1.4.4+ is fixed
python -m pip show Brotli brotlicffi 2>/dev/null | grep -E '^(Name|Version)'
envoy --version # only meaningful with decompression enabled
istioctl version
curl -V | grep -o 'brotli/[0-9.]*' # brotli library linked into curl, e.g. brotli/1.1.0
go list -m all | grep brotli # Go: andybalholm/brotli 1.2.7+ is fixed
Node.jsではロックファイルからは判断できません。アプリケーションはランタイム同梱のデコーダーを使う組み込みnode:zlibモジュールでBrotliをデコードするため、確認対象は上記のNode.jsバージョンです。npmのbrotliパッケージはWOFF2フォント用の別のJavaScript移植版で、Cデコーダーではありません。package-lock.jsonに存在するかどうかは露出と無関係です。Pythonでは、固定されたrequirementsが重要です。
grep -iE '^(brotli|brotlicffi)' requirements.txt
PyPIのBrotliパッケージは月間約8,280万回のダウンロードを記録しており、アプリケーションとCIの構成全体に広く存在する依存関係です。
どう修復しますか?
存在するすべての場所のデコーダーを更新し、プロセスを再起動してコンテナーイメージを再ビルドしてください。稼働中のプロセスは再起動まで古いデコーダーをメモリに保持します。
- Node.js:2026年10月21日のセキュリティリリース26.12.1、24.22.1、22.23.4に更新します。Node.js 20.xはサポート終了済みで修正は提供されないため、該当デプロイメントをサポート対象系列へ移行します。
- Bun:2026年10月22日リリースの1.4.4に更新します。
- Python:
pip install --upgrade Brotli brotlicffiで1.2.1と1.2.1.0へ更新し、いずれかのパッケージを固定するイメージを再ビルドします。 - Go:攻撃者由来のBrotliを展開するサービスでは、andybalholm/brotliを1.2.7以降へ更新します。
- .NET:8.0.33、9.0.22、10.0.14、11.0.0-rc.3.26522.148へ更新します。Brotli展開が明示的に有効、または攻撃者制御データにBrotli APIを使用している場合に露出します。.NET Frameworkは影響を受けません。自己完結型とNativeAOTのデプロイメントは独自のランタイムを持つため、マシンの共有ランタイムを更新しても修正されません。自己完結型アプリケーションは更新済みランタイムで再ビルド・再デプロイし、NativeAOTアプリケーションは修正済みSDKで再発行します。コミュニティのトラッカーによれば、GitHub公開ブランチは内部修正にまだ追い付いておらず、GitHubからのソースビルドは影響を受けたままでした。
- EnvoyとIstio:設定でBrotli展開を有効にしている場合は、表の修正版へ更新します。
- Google Brotliを直接利用してビルドする場合:ブランチに応じて1.0.10、1.1.1、1.2.1へ更新します。
- Windows上のPHP:PHPダウンロードページから-1再ビルド、8.5.12-1、8.4.27-1、8.3.36-1、8.2.35-1をインストールし、SHA-256を確認します。
php -vでは10月21日のビルドと区別できません。再ビルドまではPHP側で自動展開を止める回避策を適用します。CURLOPT_ENCODINGを設定せず、Guzzleではリクエストオプションdecode_contentをfalseにします。これですべての自動デコードが止まり、gzipレスポンスも圧縮されたまま届きます。 - curlなどシステムライブラリにリンクするツール:OSパッケージを更新します。DebianはDebian 13(trixie)のbrotli 1.1.0を2026年10月23日に1.1.0-2+deb13u1として修正しました。Amazon Linux 2023は2026年10月22日時点でbrotliとNode.js 24パッケージを修正待ちとしていたため、使用ディストリビューションの状況を確認してください。
まだ更新できない場合は、信頼できないBrotliのデコードを止めてください。OpenAIの公開ページとAikidoによる推奨事項は次のとおりです。
- プロキシやパーサーが本文をデコードする前に、
Content-Encoding: brを含む受信リクエストを拒否します。 - HTTPクライアントのBrotli自動デコードを無効にし、デコード前にBrotliレスポンスを拒否します。
- PythonではBrotliとbrotlicffiパッケージをアンインストールし、クライアントがgzipとdeflateへフォールバックするようにします。
限界を明確にする必要があります。Accept-Encodingヘッダーからbrを削除するだけでは役立ちません。クライアントの要求に関係なく、サーバーはBrotliを送信できるためです。Node.js自体には一般的な回避策が公開されていないため、唯一の修正はランタイムの更新です。その間に閉じられる受信経路は1つあります。Express 5とbody-parser 2のパーサーをinflate: falseに設定すると、圧縮されたリクエスト本文を展開前に415エラーで拒否します。ただし、fetch()レスポンスやBrotliをデコードする別のコードには効果がありません。Webアプリケーションファイアウォールの効果も限定的です。公開当日にファイアウォールルールを提供したVercelは、ルールが「関数が別のサーバーから取得するレスポンス」を対象にしないと明記しています。この経路を閉じるのはランタイム更新だけです。
根本原因は何ですか?
デコーダーが恒久的な形式エラーを回復可能な「追加入力が必要」という状態として報告し、高速デコード経路はその結果さえ捨てていたため、停止すべき地点を越えてデコードが続き、内部バッファー外に書き込みました。 欠陥はc/dec/decode.cのDecodeBlockTypeAndLengthにあり、Evgenii Kliuchnikovによる2026年2月27日の修正コミット0ed4268から仕組みが分かります。
修正前、関数はライブラリの真偽値型BROTLI_BOOLを返していました。BROTLI_FALSEには、形式不正のストリームと、追加入力で解消できる不完全な読み取りという、まったく異なる2つの意味がありました。
static BROTLI_INLINE BROTLI_BOOL DecodeBlockTypeAndLength(
int safe, BrotliDecoderState* s, int tree_type) {
...
if (max_block_type <= 1) {
- return BROTLI_FALSE;
max_block_type <= 1は、ストリームがブロック型を1つだけ宣言していることを意味します。そのため、この時点のブロック切り替えコマンドは読み取りの一時停止ではなく不正な入力です。呼び出し元は2つのケースを区別できませんでした。Node.jsはストリーミング経路での結果を次のように説明しています。「不正なブロック切り替えが、恒久的な形式エラーではなく一時的な追加入力の必要性として報告されたため、ストリーミングデコーダーは8バイトの内部バッファーへ入力バイトを追加し続けました。」
高速経路では結果が完全に破棄されました。リテラルブロック切り替えのunsafe版はvoidとして宣言されていたため、失敗が呼び出し元に届きませんでした。
-static void BROTLI_NOINLINE DecodeLiteralBlockSwitch(BrotliDecoderState* s) {
- DecodeLiteralBlockSwitchInternal(0, s);
3か所のブロック切り替え呼び出しで使われるBROTLI_SAFEマクロは、投機的なsafeモードでは結果を確認し、unsafeモードでは無視します。修正はそれを明記したコメントを追加しています。「入力が十分にあることが保証されるunsafe実行の場合、結果は無視される」。その保証は正しい形式のストリームでは成立しますが、不正なブロック切り替えを含むものでは成立しません。したがって高速経路は古いブロック型リングバッファーとハフマン木の状態でデコードを続け、後続の書き込みがバッファーの末尾を越えました。GitHubアドバイザリはこの欠陥に戻り値未確認のCWE-252を付けており、オーバーフロー自体は境界外書き込みのCWE-787です。
どのように悪用されますか?
攻撃には、対象が攻撃者制御のBrotliを展開する配信経路が1つと、細工したストリームが1つ必要です。手順は次のとおりです。
- 攻撃者は、対象の木についてブロック型を1つしか宣言していないのに、ブロック切り替えコマンドで
DecodeBlockTypeAndLengthへ到達するBrotliストリームを作成します。 - ストリームは、
fetch()呼び出しへのContent-Encoding: brレスポンス、Express 5またはbody-parser 2が解析するBrotli圧縮リクエスト本文、EnvoyまたはIstioの展開フィルター経由、あるいはBrotli導入済みPython HTTPクライアントが自動デコードするレスポンスとして届きます。 - 不正なブロック切り替えが
BROTLI_FALSEを返します。ストリーミング経路は「さらにバイトを送ってほしい」と解釈し、高速経路は捨てます。どちらもストリームを拒否せずデコードを続けます。 - 古いブロック型状態でのデコードが、内部デコーダーバッファーの末尾を越えて攻撃者の影響下にあるデータを書き込み、隣接するプロセスメモリを破損します。
- 破損がプロセスをクラッシュさせ、メモリを漏えいさせ、または実行をリダイレクトします。作業をNode2Shellと名付けたImpervaのRed Teamは、ARM64 Linux向けの未改変Node.js 24.22.0ビルドで攻撃者提供コードを実行しました。ペイロードは取得レスポンスとExpressリクエスト本文の両方で配信されました。エクスプロイトには数回の試行が必要で、公開されておらず、ほかのビルドではテストされていません。
欠陥を報告したOpenAIのCodex Securityチームは、露出が双方向に成立すると説明しています。「圧縮入力を受け入れる未修正サーバーは悪意あるクライアントに乗っ取られる可能性があり、圧縮入力を受け入れる未修正クライアント(たとえば『curl --compressed』)は悪意あるサーバーに乗っ取られる可能性があります。」
攻撃はどのように進行しますか?
流れは短く、任意のBrotliデコード経路から細工したストリームを送り、混同されたエラーによって不正なブロック切り替え後もデコーダーを動かし続け、その後の書き込みをバッファー外へ到達させます。
細工したBrotliストリーム"] --> B["fetchレスポンス、リクエスト本文、
プロキシフィルター経由で配信"] B --> C["デコーダーが不正な切り替えに到達
入力不足ではなく形式エラー"] C --> D["TRUE/FALSEの真偽値が2つを混同
エラー報告が失敗"] D --> E["高速経路が結果を破棄し
デコードを継続"] E --> F["古いブロック型状態により
バッファー末尾を越えて書き込む"] F --> G["クラッシュ、メモリ漏えい、
またはコード実行"]
攻撃者は何ができますか?
- デコードするプロセスをクラッシュさせられます。ヒープ破損はほかのことが起きる前にクラッシュする場合が多いため、サービス拒否が最も確実な結果です。
- プロセスメモリを漏えいさせられます。破損したデコード結果を通じて、隣接するデコーダー状態やヒープ内容が漏れる可能性があります。
- コードを実行できます。Impervaは1つのNode.jsビルドで実証しました。信頼性はプロセスのヒープ配置に依存するため、実証には数回の試行が必要でした。Red Hatによれば、信頼性の高い公開エクスプロイトが存在しない理由もこれです。
- サーバーだけでなくクライアントも侵害できます。悪意あるサーバーや侵害されたサーバーからのBrotliをデコードする未修正クライアントも同じように危険にさらされます。この経路にはサーバー側の強化策の大半が届きません。
攻撃者に必要な条件は、上記の攻撃者制御Brotliのデコード経路だけです。搬送するHTTPのやり取りを超える認証は不要で、サーバー側デコードではユーザー操作も不要です。
なぜ修正が有効なのですか?
コミット0ed4268「Detect and report invalid stream earlier」はエラー処理を再構築し、2つの状態が1つの真偽値に潰されないようにします。
DecodeBlockTypeAndLengthは成功、回復不能エラー、追加入力が必要という3状態を持つBrotliDecoderErrorCodeを返すようになりました。- 不正なブロック切り替えは、新しい恒久エラー
BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH、エラーコード-17を返します。以前、ヘッダーでは「予約済み」とされていました。 - 不完全な読み取りは別の
BROTLI_DECODER_NEEDS_MORE_INPUTを返すため、ストリーミングループは正当な再開動作を維持します。 - 新しい
BROTLI_SAFE_WITH_STATUSマクロがsafeとunsafeの両経路で状態を確認し、失敗時にsaveStateAndReturnへジャンプします。高速経路もブロック切り替えエラーを無視できなくなります。
+#define BROTLI_SAFE_WITH_STATUS(METHOD) \
+ { \
+ BrotliDecoderErrorCode status; \
+ if (safe) { \
+ status = Safe##METHOD; \
+ } else { \
+ status = METHOD; \
+ } \
+ if (status != BROTLI_DECODER_SUCCESS) { \
+ result = status; \
+ goto saveStateAndReturn; \
+ } \
+ }
3か所のブロック切り替え呼び出しは状態確認マクロを使うようになり、パッチはメタブロック長の不変条件にデバッグアサーションも追加します。この欠陥に対する修正は完全です。不正なブロック切り替えは、すべての経路で報告される恒久エラーになります。
展開に関する教訓はコードと同じくらい重要です。修正は2026年2月27日にgoogle/brotliのソースへ入りましたが、2026年10月21日まで、これを含むBrotliリリースはありませんでした。OpenAIの説明によれば、根本原因は「実際には2月にBrotliのソースコードで修正されていましたが、当時はセキュリティ脆弱性につながると知られておらず、それ以降のBrotliリリースもありませんでした」。10月には各ランタイムとパッケージがそれぞれ修正のコピーを提供する必要があったため、上記の修正版は3日間、8つのエコシステムにまたがっています。
侵害されたかどうかを確認するには?
実環境での悪用は報告されておらず、この欠陥の侵害指標はありません。CISAの2026年10月23日の評価は悪用を「none」、自動化を「no」と記録しています。
それが変わるまで、一般的には次を探してください。Brotliエンコードされたトラフィックを扱うNode.js、Bun、Envoy、Istioプロセスのクラッシュの集中、それらのクラッシュダンプ中のメモリ内容の異常、そしてホストで実際にコード実行が起きていた場合は、予期しない子プロセスや外向き接続という通常のプロセスレベルの痕跡です。Brotliデコード経路でこうしたものが見つかったら、否定されるまで関連するものとして扱うべきです。対応はコード実行が疑われる場合の標準的なもの、すなわち隔離、スナップショット取得、そのプロセスがアクセスできる認証情報のローテーション、クリーンなイメージからの再構築です。
タイムライン
- 2026-02-27:修正コミット
0ed4268がgoogle/brotliに入る。その後リリースはなく、セキュリティ上の影響はまだ認識されていない。 - 2026-10-21:Node.jsが26.12.1、24.22.1、22.23.4を提供し、google/brotliが1.0.10、1.1.1、1.2.1を公開。
- 2026-10-22:CVSS v4.0 9.2の評価でCVE-2026-111497を公開。Bun 1.4.4をリリース。Pythonパッケージ向けGitHubアドバイザリGHSA-9v8h-qqgm-4m35を公開。
- 2026-10-23:ImpervaのNode2Shell実証が報道される。CISAは悪用なしと記録。GitHubアドバイザリがpip brotli 1.2.1未満、brotlicffi 1.2.1.0未満を対応付けるよう更新。Debianがtrixieのbrotliパッケージを修正。PYSEC-2026-4322、PYSEC-2026-4323を追加。Andy Balholmがコミット33c2a988としてGoデコーダーへ修正を移植し、andybalholm/brotli v1.2.7として公開。
- 2026-10-24:エコシステム横断の影響一覧を公開。
- 2026-10-25:Microsoftが.NETアドバイザリGHSA-p3jp-9v83-76w9を公開し、.NET 8、9、10と11リリース候補にまたがる225のNuGetパッケージを修正。コミュニティのトラッカーが10月24日のRuby brotli gem、PHP brotli拡張、UEFIToolの修正を記録。
- 2026-10-26:PHPが公式WindowsパッケージをBrotli 1.2.1付きの8.5.12-1、8.4.27-1、8.3.36-1、8.2.35-1として再ビルド。SBOMにBrotli 1.2.0を含んだ10月21日のビルドから5日後。
- 2026-10-25:本記事。PHP Windows再ビルド、Guzzleの露出条件、Apache Arrowの状況を10月27日に追記。
よくある質問
素のNode.js HTTPサーバーも危険にさらされますか?
素のNode.jsサーバーは自らリクエスト本文をデコードしないため、実証された経路の対象外です。危険が生じるのは、Express 5またはbody-parser 2でBrotliリクエスト本文を解析する、fetch()を呼んでContent-Encoding: brレスポンスをデコードする、または独自コードが信頼できないデータをzlib.brotliDecompress()、zlib.createBrotliDecompress()などのnode:zlib Brotli APIへ渡す場合です。たとえばWebSocketハンドラー、RPCストリーム、ファイル処理パイプラインで起こり得ます。コードにこれらがなくても、予定どおりランタイムを更新する価値はあります。
Accept-Encodingからbrを削除すればクライアントを保護できますか?
いいえ。サーバーはクライアントの要求に関係なくBrotliを送信でき、Pythonクライアントはパッケージが入ると自動的にBrotliをデコードします。クライアント設定でBrotli自動デコードを無効にする、デコード前にBrotliレスポンスを拒否する、またはPythonパッケージをアンインストールしてgzipとdeflateへフォールバックさせてください。
修正がユーザーに届くまで2月から10月までかかったのはなぜですか?
変更は2026年2月27日にgoogle/brotliのソースに入りましたが、プロジェクトはその日から10月のセキュリティ対応までリリースを公開せず、当時その変更のセキュリティ上の影響は知られていませんでした。Node.jsやBunなど、デコーダーを組み込むランタイムは、組み込めるリリースが存在するまで修正を取り込めませんでした。
依存関係スキャナーはPythonパッケージを検出しますか?
GitHubアドバイザリは2026年10月23日に更新され、現在はpip brotli 1.2.1未満とbrotlicffi 1.2.1.0未満を対応付けています。PYSEC-2026-4322とPYSEC-2026-4323も存在するため、データベースを同期するツールなら検出できます。古いツールや隔離環境のツールは更新に遅れる場合があるため、今週の確実な確認は、上記のようにインストール済みバージョンを手動で調べることです。
EnvoyとIstioはデフォルトで危険にさらされますか?
いいえ。いずれも、たとえばEnvoy decompressorフィルターを通じてBrotli展開を明示的に有効にした場合に影響を受けます。設定上Brotliを展開しなければ欠陥には到達できません。展開するなら表の修正版が適用対象です。
curlなどのシステムツールはどうですか?
curlや多くのツールは、Brotliライブラリを同梱せずOSのものにリンクします。curl -Vで、たとえばbrotli/1.1.0のようにリンク済みバージョンを確認できます。ディストリビューション経由で更新してください。Debianは2026年10月23日にtrixieの修正パッケージを提供し、ほかのディストリビューションもそれぞれの予定で提供しています。
攻撃者より先に古いデコーダーを見つける
Ostorlabでリポジトリ、コンテナーイメージ、インターネット公開サービスをスキャンし、2026年10月21日の修正より前のBrotliデコーダーをまだ同梱するすべてのNode.js、Bun、Pythonデプロイメントを可視化してください。
参考資料
- CVSS v4.0 9.2ベクトルと影響範囲1.0.3~1.2.0を含むCVE-2026-111497レコード:https://cveawg.mitre.org/api/cve/CVE-2026-111497 (2026年10月25日確認)
- Node.jsの2026年10月21日セキュリティリリース。欠陥ごとの説明、影響系列、修正版、謝辞を含む(報告者はOpenAI Codex SecurityのKhai TranとSylvie Mayer、修正者はMatteo CollinaとAntoine du Hamel):https://nodejs.org/en/blog/vulnerability/october-2026-security-releases (2026年10月25日確認)
- Evgenii Kliuchnikovによる2026年2月27日の修正コミット0ed4268「Detect and report invalid stream earlier」:https://github.com/google/brotli/commit/0ed4268 (2026年10月25日確認)
- 2026年10月21日公開のgoogle/brotliリリース1.0.10、1.1.1、1.2.1:https://github.com/google/brotli/releases (2026年10月25日確認)
- pip brotliとbrotlicffiを対応付け、CWE-252を示すレビュー済みアドバイザリGHSA-9v8h-qqgm-4m35:https://github.com/advisories/GHSA-9v8h-qqgm-4m35 (2026年10月25日確認。PyPI対応付けは2026年10月23日の更新で追加)
- Bun 1.4.4リリース、2026年10月22日:https://github.com/oven-sh/bun/releases/tag/bun-v1.4.4 (2026年10月25日確認)
- andybalholm/brotli修正コミット33c2a988「Detect and report invalid stream earlier」。Googleの修正を2026年10月23日に移植し、v1.2.7で公開:https://github.com/andybalholm/brotli/commit/33c2a988 および https://github.com/andybalholm/brotli/releases/tag/v1.2.7 (2026年10月26日確認)
- Microsoftの.NETアドバイザリGHSA-p3jp-9v83-76w9、CVE-2026-111497。225のNuGetパッケージを8.0.33、9.0.22、10.0.14、11.0.0-rc.3.26522.148で修正し、自動展開の前提条件と.NET Frameworkは影響なしと明記:https://github.com/dotnet/runtime/security-advisories/GHSA-p3jp-9v83-76w9 および https://github.com/dotnet/announcements/issues/494 (2026年10月26日確認)
- 同梱コピー、10月22日の公開概念実証の状況(標準ビルドではクラッシュと限定メモリ読み取り、意図的に弱体化したビルドだけでコード実行)、各プロジェクトの修正状況を扱うBroccoli2Shellコミュニティトラッカー:https://broccoli2shell.com/ (2026年10月26日確認)
- EnvoyアドバイザリGHSA-3wvj-j6qm-62mr:https://github.com/envoyproxy/envoy/security/advisories/GHSA-3wvj-j6qm-62mr (2026年10月25日確認)
- Istioセキュリティアドバイザリ2026-007:https://istio.io/latest/news/security/istio-security-2026-007/ (2026年10月25日確認)
- cdxgenアドバイザリGHSA-5266-jm88-3grm:https://github.com/cdxgen/cdxgen/security/advisories/GHSA-5266-jm88-3grm (2026年10月25日確認)
- The Hacker News「Brotli Decoder Flaw Behind Node.js RCE Also Affects Bun, Python and Other Widely Used Software」、2026年10月24日。影響一覧、OpenAIの双方向性に関する引用、CISAとRed Hatの評価、回避策を含む:https://thehackernews.com/2026/10/brotli-decoder-flaw-behind-nodejs-rce.html (2026年10月25日確認)
- ImpervaのNode2Shell実証に関するThe Hacker Newsの記事、2026年10月23日:https://thehackernews.com/2026/10/researchers-demonstrate-node2shell-rce.html (2026年10月25日確認)
- OpenAIによる欠陥の公開ページpatchtheplanet.org:https://patchtheplanet.org/brotli (2026年10月24日のThe Hacker News経由で参照。この環境ではページを静的テキストとして表示できない)
- スコア8.1と、信頼できる公開概念実証がないことを記したRed HatのCVE評価:https://access.redhat.com/security/cve/CVE-2026-111497 (2026年10月24日のThe Hacker News経由で参照)
- ファイアウォールルールの限界についてのVercel Node.jsセキュリティ速報:https://vercel.com/kb/bulletin/node-js-security-advisory (2026年10月24日のThe Hacker News経由で参照)
- brotli 1.1.0-2+deb13u1のDebianセキュリティ告知、2026年10月23日:https://lists.debian.org/debian-security-announce/2026/msg00498.html (2026年10月24日のThe Hacker News経由で参照)
- 月間約8,280万回のBrotliのPyPIダウンロード統計:https://pypistats.org/packages/brotli (2026年10月25日確認)
- Pythonパッケージの露出と回避策に関するAikidoの分析:https://www.aikido.dev/blog/python-packages-vulnerable-node2shell-brotli-cve-2026-111497 (2026年10月24日のThe Hacker News経由で参照)
- PHP Foundation「Updated PHP Windows builds for Brotli security fix」、2026年10月26日。Brotli 1.2.1付き8.5.12、8.4.27、8.3.36、8.2.35の-1再ビルド、cURL自動展開の到達性、-1接尾辞の意味:https://www.php.net/archive/2026.php#2026-10-26-1 (2026年10月27日確認)
- The Hacker News「PHP Issues Second Windows Security Update in Five Days to Fix Brotli Code Execution Flaw」、2026年10月26日。10月21日ビルドのBrotli 1.2.0を示すSBOMエビデンス、Guzzle 7.16.1と8.3.1ソースにおけるデフォルト設定の発見、OpenAIの回避策助言を含む:https://thehackernews.com/2026/10/php-issues-second-windows-security.html (2026年10月27日確認)
decode_contentがfalseでない限りCURLOPT_ENCODINGを空にするGuzzle 7.16.1のcURLハンドラーソースsrc/Handler/CurlFactory.php:https://github.com/guzzle/guzzle/blob/7.16.1/src/Handler/CurlFactory.php (2026年10月27日確認)- Apache Arrowプルリクエスト#55167「GH-55165: [C++] Force newer versions of Brotli」。2026年10月27日時点で未完了:https://github.com/apache/arrow/pull/55167 (2026年10月27日確認)