深刻なBrotliデコーダーの脆弱性がNode.js、Python、HTTPサービスに影響
CVE-2026-111497により、主要なランタイムにおいて細工されたBrotliストリームを介したリモートコード実行が可能になります。Node.js、Python、Bun、Envoy向けの修正パッチが提供されています。
英語の原文から自動翻訳されました。
GoogleのBrotli圧縮ライブラリにおける重大な脆弱性(CVE-2026-111497として追跡)により、主要なソフトウェアランタイムがリモートコード実行のリスクにさらされています。2026年10月23日に公開されたこの欠陥は、Node.js、Python、Bun、およびEnvoyやIstioなどのインフラストラクチャコンポーネントに影響します。開発者は、サーバー侵害の可能性を防ぐため、影響を受けるライブラリを直ちにパッチ適用するか、Brotliデコーディングを無効にする必要があります。
何が起きたか
当初「Node2Shell」と呼ばれていたこの脆弱性は、Node.jsによって10月22日に公開されましたが、ソフトウェアエコシステム全体により広範な影響があることが判明しました。これはBrotliデコーダー内のメモリセーフティエラーに起因しており、認証されていない攻撃者がプロセスメモリを破損させることを可能にします。特別に細工された圧縮データストリームを送信することで、攻撃者はサービスをクラッシュさせ、機密情報を漏洩させ、または任意のコードを実行できます。共通脆弱性評価システム(CVSS)v4.0では、この問題の評価スコアは9.2であり、「クリティカル」レベルと判定されています。
OpenAIは、根本原因を2026年2月に発見したことを明らかにしました。基盤となるバグはその時点でBrotliソースコード内で修正されていましたが、セキュリティ脆弱性として認識されていなかったため、今回まで修正リリースは発行されませんでした。この遅延により、独自のコピーでBrotliライブラリをバンドルしているすべてのプロジェクトが数ヶ月間、危険な状態のまま放置されていました。2023年10月23日時点では、libbrotli、Python、C++、Node.js、Bun、Envoy向けのパッチがリリースされており、他の依存アプリケーション向けの追加アップデートも予定されています。
仕組み
Brotliは、HTML、CSS、JavaScriptなどのWebコンテンツのサイズをHTTP転送中に削減するために広く使用されている可逆圧縮アルゴリズムです。脆弱性は、デコーダー内のDecodeBlockTypeAndLength()関数に存在します。この関数は、データストリームが解凍に使用するハフマンツリーを変更する際に発生するブロックスイッチを処理します。影響を受けるバージョン(1.0.3から1.2.0)では、この関数は単純なブール値を返しますが、不正なストリームと追加の入力データの要求を区別できません。
高速デコーディングパス上の呼び出し側はこの戻り値を破棄するため、停止すべき状況でもデコーダーが処理を継続してしまう状態が発生します。攻撃者は、ブロックの長さを消費し、無効なスイッチを強制するストリームを作成することでこれを悪用できます。その後、デコーダーは範囲外書き込みを実行し、小さな作業バッファをオーバーフローさせて隣接するメモリを破損させます。修正プログラムでは、特定の错误コードBROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCHを導入し、このようなフォーマットエラーを検出した際にデコーダーが直ちに停止するようにしています。
主な詳細
- 影響を受けるバージョン: すべてのプラットフォームでのBrotli 1.0.3から1.2.0。
- 修正済みバージョン: Brotli 1.2.1、1.1.1、および1.0.10; brotlicffi 1.2.1.0。
- ランタイムパッチ: Node.js 22.23.4、24.22.1、26.12.1; Bun 1.4.4; Envoy 1.40.0、1.39.3、1.38.6、1.37.8。
- Pythonへの影響: バージョン1.2.0以下がインストールされている場合、パッケージ
Brotliおよびbrotlicffiが脆弱です。 - 検出ギャップ: アドバイザリデータベースはまだこのCVEをPyPIパッケージにマッピングしていないため、Dependabotなどのツールは自動的にフラグを立てない可能性があります。
- 攻撃ベクトル: 悪意のあるBrotliデータを含む細工されたHTTPリクエストまたはレスポンスを介した、リモートからの認証なしのアクセス。
なぜ重要なのか
この脆弱性は、現代のソフトウェアサプライチェーンにおける推移的依存関係に関連するリスクを浮き彫りにします。多くの開発者はコード内でBrotliを明示的にインポートしていませんが、Pythonのrequests、httpx、urllib3などの人気HTTPクライアントや、Node.jsの組み込みfetchは、存在する場合に自動的に読み込みます。つまり、ソースコード内でライブラリを直接参照していなくても、アプリケーションが脆弱になる可能性があります。これらの依存関係の自動的な性質により、依存関係ツリーの深い検査を行わない限り、露出度を評価することが困難になります。
ネットワーク化されたサービスを構築しているチームにとって、その影響は深刻です。なぜなら、攻撃対象領域には受信トラフィックと送信トラフィックの両方が含まれるからです。悪意のあるクライアントは、圧縮されたリクエストボディを送信することでサーバーを標的にでき、悪意のあるサーバーは、圧縮されたレスポンスを返すことでクライアントを標的にできます。この双方向の脅威モデルは、内部マイクロサービスや外部向けAPIを含む、HTTPトラフィックを処理するすべてのサービスの包括的なパッチ適用を必要とします。2月の修正がセキュリティ上の意味を持つことに気づくまでの遅延は、上流ライブラリの変更に対する厳格な監視の必要性をさらに強調しています。
対応策
- ランタイムのアップグレード: Node.jsを22.23.4、24.22.1、または26.12.1に更新し、Bunを1.4.4以降に更新してください。
- Pythonパッケージの更新: すべての環境で
pip install -U "Brotli>=1.2.1"およびpip install -U "brotlicffi>=1.2.1.0"を実行してください。 - コンテナの再ビルド: ロックファイルを再生成し、コンテナイメージを再ビルドして、パッチ適用済みのバージョンがデプロイされたアーティファクトに含まれていることを確認してください。
- デコーディングの無効化: 即時のパッチ適用が不可能な場合は、
Accept-Encodingヘッダーからbrを削除し、プロキシレベルで受信Content-Encoding: brリクエストを拒否することにより、Brotliデコーディングを無効にしてください。 - 依存関係の確認:
pipdeptreeなどのツールを使用して、どのライブラリが推移的依存関係としてBrotliを引き込んでいるかを特定してください。 - アドバイザリの監視: OSパッケージに関するベンダー固有のセキュリティ公告を確認してください。上流のバージョン番号を変更せずに修正をバックポートしている場合があります。



