警戒被害が起きている。または、起きれば重く広い

Brotli の欠陥、Node.js から .NET まで緊急修正が連鎖

Brotli デコーダの CVE-2026-111497 は HTTP2Shell・Node2Shell・Broccoli2Shell と呼ばれる同一の欠陥。Node.js・.NET・Python・PHP に修正が波及した。

要点

  • 圧縮されたデータを元に戻す部品「Brotli」に欠陥が見つかり、細工したデータを読ませるとプログラムのメモリを壊せる。
  • Brotli は Node.js や .NET に組み込まれているほか、Python 向けのパッケージや PHP の一部のビルド・拡張にも入っていて、10月21日から5日のうちに各社の修正が相次いだ。
  • 悪用の報告は本稿時点でない。ただ、自分の会社のどこに Brotli が入っているかを言えないと、直し漏れが残る。

何が起きたか

Brotli は Google が作った圧縮の仕組みだ。Web サイトがデータを小さくして送るときによく使われ、受け取った側はそれを元に戻して(展開して)読む。この「元に戻す部分」(デコーダ)の C 言語版に欠陥があった。番号は CVE-2026-111497 である。

欠陥の中身は取り違えだ。デコーダは「データが壊れている」と「データがまだ届ききっていない」を区別できなかった。細工されたデータを渡されると、続きを待つつもりで小さな置き場の外へ書き込んでしまう。これを境界外書き込みと呼ぶ。

Google は10月21日に修正版を出した。見つけたのは OpenAI Codex Security の Khai Tran と Sylvie Mayer で、red-teaming(攻撃する側に立って弱点を探す検査)の最中に見つかったとされる。

どれだけ危ないかの見方は分かれている。GitHub は10点満点で9.2(いちばん重い区分)、Microsoft は8.1、Red Hat は「Important」とした。Red Hat は、悪用には形を正確に崩したデータを渡す必要があるとして、攻撃の難しさを「高い」と評価している。一方、Imperva の Ron Masas は10月22日、Node.js の公式イメージでコード実行を実証したと報告した。ただし、成功までに何度も試す必要があったとも書いている。確実に通る攻撃ではない、ということだ。

名前が3つあるのも混乱のもとになっている。Node2Shell、HTTP2Shell、Broccoli2Shell は、どれも同じ1件を指す。調べるときは CVE 番号を使うのが確実である。

日本の利用者への影響

JPCERT/CC は10月26日に注意喚起を出し、Node.js、Bun、Python の Brotli パッケージを名指しした。緩和策について JPCERT/CC は、Google からは出ていないと説明している。そのうえで、Brotli を使う製品の対策は、それぞれの開発元の発表で確かめるよう呼びかけている。

広さについては、Wiz が10月25日、Wiz が見ているクラウド環境の91%に影響を受けるものがあるとした。日本に限った数字ではない。

気をつけたいのは、設定を何も変えていなくても当たる場合があることだ。.NET は既定では展開しない。Envoy も、展開する機能を自分で設定したときだけ当たる。ところが Node.js は、外の Web ページを取ってくる標準の機能が Brotli を自動で展開する。URL のプレビューを作る機能や、ほかのサイトを巡回する仕組みを持つサービスは、攻撃者が用意したデータを、欠陥のある部品に渡しうる状態だった。

今すぐやること

  1. 土台のソフトの版を確かめる。 Node.js、.NET、PowerShell、Bun、Python、PHP を使っているなら、修正版になっているかを担当者に確かめてもらう。
  2. 入れた覚えがなくても疑う。 Python では、Brotli が入っていれば、よく使う通信用の部品がそれを使って自動で展開する。Brotli はほかの部品のついでに入ることもある。部品どうしのつながりをたどって、入っていないか確かめる。
  3. 製品の中に埋め込まれたコピーを探す。これがいちばん大事だ。 OS を更新しても、Brotli を自前で抱えている製品は直らない。データベースや圧縮ソフトには、まだ直っていないものもある。使っている製品ごとに発表を確かめる。
  4. コンテナや、ランタイムまで中に固めたアプリは作り直す。 土台を更新しただけでは、中の古いコピーが残る。
  5. すぐ直せないなら、外から来る Brotli データの展開を止め、異常終了が増えていないか見る。 止めるのはつなぎにすぎず、修正の代わりにはならないと各社は書いている。

背景

いちばん気になるのは時間差だ。この欠陥を直すコードは、2026年2月には Brotli のソースに入っていた。セキュリティ上の意味が認識され、修正版と CVE として出たのは8か月後の10月21日である。Oracle の Alan Coopersmith は oss-security のメーリングリストで、Ghostscript は欠陥の公表より前に Google のリポジトリから修正を取り込んでいたようだと指摘した。こうして、気づかないうちに直っていたプロジェクトもある。逆に言えば、2月より前のコピーを固定したままの製品が、いまも残っている。

Google 側の説明が薄いことも、名前が乱立した一因だ。修正版の説明には CVE 番号と1行の説明があるだけで、詳しい中身は Node.js や各ベンダーの発表を読むことになる。

AI が見つけた欠陥だという点も、受け止め方を分けた。Imperva は、AI が欠陥探しも攻撃コードづくりも速めるので、防御側も同じ速さで直す必要があるとした。一方 CyberScoop の取材に対し、VulnCheck の Caitlin Condon は、AI が複雑な発見を次々に出すことでノイズが増えていると述べた。watchTowr の Jake Knott は、本当の緊急事態と騒がれすぎた欠陥を防御側が見分けられなくなることを心配している。

同じ週、PHP では本体の欠陥(PHP2Shell)が実際に悪用された。Brotli の場合は、修正を当てる先がランタイム、パッケージ、OS、製品の中のコピーに分かれている。点数が9.2か8.1かより、自分の環境に Brotli がいくつあるかを言えるかどうかが、この件の本当の問題である。

技術者向けの詳細
  • 原因: c/dec/decode.c の DecodeBlockTypeAndLength() が真偽値を返し、壊れたストリームと入力不足を区別できなかった。8バイトの内部バッファに書き足し続ける。CWE-252(GitHub)/CWE-787(Microsoft)。対象は Brotli 1.0.3〜1.2.0
  • 評価: GHSA-9v8h-qqgm-4m35 は CVSS v4.0 9.2、Microsoft は CVSS v3.1 8.1、Red Hat は Important(AC:High、ASLR・SELinux が効く)
  • 修正版
    • Brotli 1.0.10 / 1.1.1 / 1.2.1
    • Node.js 22.23.4 / 24.22.1 / 26.12.1(20 以前と 23・25 は EOL で修正なし)
    • .NET 8.0.33 / 9.0.22 / 10.0.14 / 11.0.0-rc.3、PowerShell 7.4.22 / 7.5.13 / 7.6.9、Bun 1.4.4
    • Envoy 1.36.12 / 1.37.8 / 1.38.6 / 1.39.3 / 1.40.0、Istio 1.29.9 / 1.30.6 / 1.31.2
    • Python: Brotli>=1.2.1、brotlicffi>=1.2.1.0
    • PHP Windows 版 8.2.35-1 / 8.3.36-1 / 8.4.27-1 / 8.5.12-1(10月26日の再ビルド。php -v では区別できない。cURL の自動展開が有効なときに当たる)、PHP brotli 拡張 0.21.1
    • 同梱コピーの修正済み: Ruby brotli gem 0.9.1、MuPDF 1.28.0、Go andybalholm/brotli v1.2.7
    • 10月26日時点で未修正(broccoli2shell.com): DuckDB、Apache Arrow、7-Zip-zstd、p7zip、EDK II、woff2 の Makefile ビルド(1.0.3 を同梱。CMake ビルドはシステムのライブラリを使う。修正案は PR #208)
  • 確認(Python の2行は broccoli2shell.com の例)
node -p "process.versions.brotli"
dotnet --list-runtimes; pwsh -v; bun --version
pip show Brotli brotlicffi
pipdeptree -r -p Brotli   # 何が Brotli を引き込んでいるか
dpkg -l | grep -i brotli   # rpm -qa / apk info -v も同様
sudo grep -l brotlidec /proc/*/maps
  • Python(OpenSourceMalware による): Brotli か brotlicffi が入っている環境では、urllib3(とその上の requests)や aiohttp などの HTTP クライアントが Brotli での圧縮を受け入れ、届いた応答をそのまま展開する。httpx は extras の httpx[brotli] で入る。Scrapy も版によっては依存として入れる。10月23日時点で Dependabot と Safety はまだ検出しない
  • Node.js の経路: 組み込み fetch() の自動展開と、Express 5.0.0〜5.3.0 + body-parser 2.0.0〜2.3.0 の受信ボディ展開(Imperva)
  • 緩和: ASP.NET Core の DecompressionProviders から "br" を外す、HttpClientHandler.AutomaticDecompression から Brotli を外す(有効化していた場合のみ)、信頼できない Content-Encoding: br を手前で拒否する(Red Hat)
  • self-contained/NativeAOT の .NET アプリは SDK を上げて再発行し、コンテナは更新後のベースイメージで作り直す(Microsoft)
  • 兆候: Imperva によると、展開中の予期しない異常終了やデコーダのエラーは、どこから調べるかを決める手がかりにはなる。ただし、どちらもそれだけでは悪用の証拠として当てにならない

出典

一次情報

報道

参考

記事は、運営者が生成 AI を活用して作成し、内容を確かめたうえで公開しています。 誤りに気づいたら編集方針の連絡先へ。

次に読む