テック技報最新号へ →
セキュリティ

直接使っていない圧縮ライブラリーの脆弱性を見落とさない(Brotli / Node2Shell)

Node2Shell(CVE-2026-111497)は Brotli の展開処理の欠陥で、Python の requests などは Brotli パッケージが入っているだけで圧縮応答を自動で展開する。自分のコードが Brotli を呼んでいなくても、依存関係とコンテナーイメージの中のコピーを探して更新する。

@MalwareBibleJP · 2026-10-27
#supply-chain#dependency#python#nodejs#brotli#container

影響と経路

  • PyPA によると対象は Brotli 1.2.1 未満と brotlicffi 1.2.1.0 未満。細工されたデータでメモリー破壊や任意コード実行に至るおそれがある。Node.js や Python、.NET でも修正が出ている。
  • 攻撃の入口は「外から受け取る Brotli 圧縮データ」。URL プレビューやクローラーが取得先サーバーから受け取る応答、フレームワークが展開する圧縮リクエスト本文の両方が経路になる。
  • 受信リクエストの圧縮を拒否しても、アプリが外部から取得する応答の展開は防げない。

探し方

  1. Python: pip show brotli brotlicffi や pip list | grep -i brotli で確認し、pip-audit で脆弱性を照合する。requests などが optional 依存として引き込んでいないかも見る。
  2. ロックファイル: requirements*.txt、poetry.lock、uv.lock などで Brotli 系の版を検索する。指定している版と、各環境に実際に入っている版の両方を確認する。
  3. ランタイムに同梱されたコピー: Node.js など、ランタイム本体やネイティブモジュールに Brotli が組み込まれていることがある。ランタイムを更新しても、別に同梱されたコピー(Electron アプリ、ネイティブアドオン、静的リンクしたバイナリー)は残る点に注意(Socket の指摘)。
  4. コンテナー: 古い版を含むイメージは、パッケージ更新だけでなくイメージを再作成する(調査元 OpenSourceMalware の推奨)。SBOM やイメージスキャナーで Brotli を検索する。

すぐ更新できないとき

Brotli 対応が任意機能なら、両パッケージを削除するのが一時的な回避策。requests は Brotli がなければ br を要求しない。

追記(2026-11-03):Node.js の自動展開と修正版の確かめ方

  • Node.js 標準の fetch() は、無圧縮を求めても Brotli 圧縮と示された応答を自動で展開する。axios、got、node-fetch も既定で展開する。利用者が指定した URL に接続する Webhook やリンクプレビューが入口になりうる。
  • 受信側では Express 5 や body-parser 2 系などが圧縮リクエストを展開する。認証より前に置くと未認証で届く。素の Node.js HTTP サーバーは受信だけでは展開しない。
  • Node.js の修正版は 22.23.4・24.22.1・26.12.1。サポート終了の系列には修正がない。修正済みの 24.22.1 でも process.versions.brotli は 1.2.0 のままなので、公式配布版は Node.js 自体の版で判断する。
  • Bun で単体実行ファイルにしたものは再ビルド、Java の brotli4j は内蔵ライブラリーなので OS 更新では直らない。Envoy、Istio、.NET も個別に更新する。更新後は全プロセスを再起動する。
  • 展開後のサイズ上限では防げない(約 23MB の入力で出力を出さずに処理が進む、と Datadog)。WAF で受信側を止めても応答側の経路が残る。
  • 検知では、正常な途中切れでも出る Z_BUF_ERROR だけで悪用と判断しない。転送直後の終了コード 139、CPU 占有、送っていないバイトを含む展開結果などをサービス単位で突き合わせる。
  • 出典: @MalwareBibleJP · 2026-11-02 、Datadog securitylabs.datadoghq.com

関連

出典

X の元の投稿を開く