詳しい解説 · 読了目安 9 分
Brotliデコーダーの脆弱性開示:パッチは稼働中のすべてのコピーに届く必要がある
Node.jsがCVE-2026-111497を説明。導入向けのアドバイザリーは下流の修正版と暫定対策を示す一方、デコード経路とサポート期間に重要な制約がある。
- 当サイトの公開日
- 原典の公開日
- 出典確認日
Node.jsはOpenAI Codex Securityが報告したCVE-2026-111497を文書化しており、PatchthePlanetは下流の修正版と暫定対策を整理している。この事例は、共有ライブラリの修正と、導入済みソフトウェアの保護との隔たりを示している。危険にさらされるかどうかは、信頼できないデータが影響を受けるデコーダーに到達するかに依存する。Brotliを使っているというだけで、すべての導入環境が脆弱だとは証明できない。
ニュースを聴く
この記事を読み上げるか、ニュースを続けて聴けます。
読み上げを準備中…
端末の音声
読み上げはブラウザーまたは端末が処理します。AISubHub は文章を音声 API に送りません。利用できる音声やロック画面での再生は端末によって異なります。
再開時に短い部分を繰り返す場合があります。
要点
- Node.jsは22.23.4、24.22.1、26.12.1を修正版として示している。攻撃者が与えたBrotliデータをアプリケーションが展開すると、この欠陥によってメモリーが破壊される可能性がある。
- 導入向けアドバイザリーはBun、Envoy、Istio、上流Brotliの修正版も示すが、サポート外ブランチの修正済みリリースは、サポートされるアップグレード経路ではないと注意している。
- 暫定対策は、関連するすべての経路で、信頼できないBrotliをデコード前に遮断する必要がある。出力の圧縮を止めたり、Accept-Encodingからbrを除くだけでは不十分だ。
開示と情報源の日付を分ける
Node.jsのアドバイザリーは、Brotliの脆弱性の報告者としてOpenAI Codex SecurityのKhai TranとSylvie Mayerを、修正担当者としてmcollinaとaduh95を挙げている。PatchthePlanetの導入ガイドは、影響を受けるソフトウェアと対応するリリース、暫定対策を整理している。AISubHubの実務的な分析では、保護はコンポーネントのリリース、組み込みランタイム、アプリケーションの再ビルド、利用者環境での実稼働まで届く必要がある。一つのパッケージをインストールしただけでは、対応完了を証明できない。
Node.jsのページの題名は10月21日のセキュリティリリースを示しているが、各CVE項目が追加された日付は示していない。PatchthePlanetの「10月23日更新」は、最初の公開時刻ではない。これらの日付から、すべての下流の修正がいつ利用者に届いたかは判断できない。AISubHubはこれらの公開資料を10月24日に読んだ。アクセス日は、リリースページの題名の日付や更新ラベルとは別のものだ。
8バイトの領域が危険になる仕組み
Node.jsの説明では、不正なブロック切り替えが、恒久的な形式エラーではなく、一時的に追加の入力が必要な状態として扱われた。そのため、ストリーミングデコーダーは8バイトの内部バッファーにデータを追加し続け、範囲外に書き込む可能性があった。node:zlibを通じて攻撃者が制御するデータを展開するアプリケーションでは、クラッシュ、メモリー内容の漏えい、リモートコード実行などが起こり得る。
問題になる境界は、信頼できない入力のデコードであり、リクエスト本文、信頼できないサーバーからのレスポンス、圧縮ファイルなどが該当する。送信データを圧縮するだけでは、影響を受ける証拠にはならない。アドバイザリーは、組み込みランタイム、curl/libcurl、PythonやJavaのバインディング、フォントデコーダー、ファイル読み取り機能も挙げている。ElectronアプリケーションにはChromiumとNode.jsの別々のコピーが含まれる場合があり、一方を修正しても両方が修正済みとは判断できない。
サポートされるコンポーネントのリリースを選ぶ
Node.jsは22.23.4、24.22.1、26.12.1を挙げている。PatchthePlanetは、Brotli 1.2.1を含むBun 1.4.4と、上流Brotliの各ライブラリブランチに対応する1.0.10、1.1.1、1.2.1を示している。これらはコンポーネントごとのリリースであり、デコーダーを組み込むすべてのアプリケーションを一つのバージョン番号で修復できるわけではない。
同じアドバイザリーはEnvoy 1.40.0、1.39.3、1.38.6、1.37.8を列挙している。Envoy 1.36.12にも修正は含まれるが、そのブランチはサポート外だ。Istioの修正版は1.29.9、1.30.6、1.31.2で、1.29はサポート期間を終了している。いずれの例外でも、修正の収録を継続的な保守とみなさず、サポートされるアップグレード経路を検討する必要がある。
デコードの前に入力を遮断する
すぐに修正を適用できない場合、PatchthePlanetは信頼できないデータのBrotliデコードを一時的に無効にすることを勧めている。Expressの例では、すべてのボディーパーサーより前でidentity、gzip、deflateのみを許可し、その他のエンコーディングや重ねたエンコーディングをHTTP 415で拒否する。先にデコードするプロキシには別途対策が必要だ。代替設定のinflate:falseは、gzipとdeflateを含む、圧縮されたすべてのリクエスト本文を拒否する。
取得するレスポンスについては、Accept-Encodingからbrを除くことは希望を示すだけであり、サーバーはなおBrotliを送信できる。Pythonの例は、Content-Encodingを確認するまで本文の読み取りとデコードを遅らせる。この例ではリダイレクトと再試行を無効にしており、それらを追加する場合は各レスポンスの確認が必要になる。通常のfetchや自動読み取りでは、アプリケーションがヘッダーを見る前にデコードされる可能性がある。サイズ制限やWAFルールだけでは、すべての経路を保護できない。
回避策が保護する範囲は限られる
EnvoyとIstio向けには、アドバイザリーはBrotliデコンプレッサーを両方向で無効にし、再び有効にする可能性があるランタイムの上書き設定を削除する。方向の指定を省くと既定で有効になる点にも注意している。独立したgzipやzstdのフィルターは残すべきで、同じフィルター名を使うことは、すべてを削除する理由にはならない。エンコードされたバイト列が下流へ渡る可能性があるため、アプリケーションのデコーダーも保護が必要だ。
Next.jsの回避策は、images.unoptimizedを全体に設定し、再ビルドと再導入を行った後、/_next/imageで組み込みオプティマイザーが動かなくなったことを確認するものだ。カスタムローダー、その他のサーバー側の取得処理、別のデコーダーは保護しない。Istioでは、各ゲートウェイとサイドカーの実効設定を確認する必要がある。一つの設定ファイルを編集しただけでは、稼働中の全インスタンスが変わった証拠にならない。
実際に稼働する導入環境を確認する
アドバイザリーは、ランタイムとイメージの固定バージョンを更新し、それらを組み込んだコンテナーや実行ファイルを再ビルドしたうえで、サービス、ワーカー、定期ジョブ、レプリカを再起動または再導入するよう求めている。実行中のバイナリーやイメージを、そのコンポーネントの修正版と照合する必要がある。パッチのダウンロード、ビルド用ホストの更新、ブラウザー側コンポーネントの修正だけでは、すべてのプロセスが修正済みデコーダーを使うとは証明できない。
AISubHubによる仮定の例として、CDNが送信レスポンスを圧縮する一方、別のワーカーが取得したコンテンツをデコードする構成を考える。CDNの圧縮を止めても、そのワーカーのリスクは変わらず、別のオリジン経路がプロキシの防御を通らない可能性もある。これはアーキテクチャーの説明用の例であり、当サイトのサーバーを調査した結果ではない。検証では関連する経路を網羅し、許可している圧縮が引き続き機能することも確認すべきだ。
注目する理由
実務上の教訓は、デコードが起こる場所を洗い出し、上流の修正を、再ビルドして実際に稼働する導入環境へつなぐことだ。バージョン確認と暫定的な防御は役割が異なる。共有ライブラリの名前だけでも、一度の設定変更だけでも、システム全体の保護は証明できない。
制約と提供状況
当サイトが確認したのは2件の公開アドバイザリーであり、攻撃コード、すべての外部リンク先のリリースノート、顧客の導入システムではない。Node.js以外のバージョン情報は、PatchthePlanetによる10月23日の確認に基づく。当サイトは脆弱性の悪用、ランタイムのアップグレード、サーバー監査を実施しておらず、これらの資料から広範な攻撃や全環境の修復が確認されたわけではない。
出典と根拠
原典の公開日: · 出典確認日:
補足資料
AI を活用した編集記事を、記載した一次情報で確認しています。企業の主張は出典を明示し、掲載は推奨を意味しません。