
2026/10/24 17:06
Node2Shell が HTTP2Shell に進化し、影響範囲が多くの HTTP ライブラリとアプリに及ぶ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese 翻訳:
「node2shell」という名称の重大なセキュリティ脆弱性(CVE-2026-111497)は、数千のシステムを任意の実行コード、深刻なクラッシュ、およびメモリリークという直ちにリスクに晒しています。この欠陥は、Node.js、Python、Envoy、および Istio 全体にわたる Brotli デコンプレッションライブラリ内に存在します。攻撃者は、悪意を持って作成された圧縮された Brotli データをシステムに投入することで、これらの問題をトリガーできます。問題は、
DecodeBlockTypeAndLength() 内の不適切な処理によりデコーダーが過剰なデータを処理してしまう境界外書き込みエラーに起因しており、これにより CVSS v4.0 スコアは 9.2(Critical)という高い深刻度スコアとなっています。
OpenAI は 2 月にこのコードを特定し修正しましたが、パッチの出荷までの遅延により多くのプロジェクトが脆弱なまま残りました。Apache の標準 mod_brotli や Brotli をデフォルトでデコードしない特定のサーバーモジュールは影響を受けませんが、人気の HTTP クライアントは隠れた依存項としてこれらの壊れたバージョンを自動的に読み込む傾向にあります。影響を受けた Python パッケージには、Brotli(バージョン ≤1.2.0)および brotlicffi(バージョン 1.2.0.x)が含まれ、requests、httpx、aiohttp、urllib3、Scrapy など多くのクライアントがこれらを移行型依存項として読み込んでいます。
システムを安全に保つために、管理者は Envoy(≥1.37.8;補正は適用されていますが 1.36 はサポート停止中)や Istio(≥1.29.9;1.29 ブランチはライフサイクル終了済みであることに注意)などのライブラリを緊急にアップグレードする必要があります。Node.js については、バージョン 22.23.4、24.22.1、または 26.12.1(または新しいサポートされているリリース)へのアップグレードが必要です。libbrotli/Google Brotli については、バージョン 1.2.1 以降を推奨します(古いラインではパッチ済み 1.0.10 または 1.1.1 を使用しています)。Python については、Brotli を 1.2.1 に、brotlicffi を 1.2.1.0 にアップグレードした後、コンテナイメージを再構築し、依存関係ロックファイルを再生成する必要があります。Bun については ≥1.4.4 へのアップグレードが必要です。
自動ツールの適切な検出が可能になるまで(例として、pip-audit、Dependabot、Safety は 10 月 23 日時点では脆弱な PyPI パッケージをフラグせず、これは advisory データベースが CVE とのマッピングを行っていないためです)、手動チェック(
pip show)は不可欠です。パッチが利用できない場合の回避策としては、Python で Brotli/brotlicffi をアンインストールする(httpx[brotli] のようなオプション依存項を削除)、Brotli デコーディングを無効化、リバースプロキシ/ロードバランサーで Content-Encoding: br を拒否し、Accept-Encoding ヘッダーから br を削除することが挙げられます。アップストリームによる技術的修正は、Google Brotli のコミット 0ed46268 において、DecodeBlockTypeAndLength() の戻り値の動作を変更し、形式エラーに対して境界外書き込みを引き起こすのではなく、デコーディングを停止させるためのエラーコード BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17) を導入しています。本文
CVE-2026-111497「node2shell」:Brotli デコーダー脆弱性に関する勧告
概要と緊急対応 ⚠️
- Brotli は Google が開発する広く利用されている圧縮ライブラリです。
- 2026 年 10 月 21 日(水): NodeJS において CVE-2026-111497(「node2shell」)が発覚し、Brotli データのデコード時にメモリリークや任意コード実行が可能になることが判明しました。
- 2026 年 10 月 22 日(木): Python のパッケージでも影響が確認されました。
- 2026 年 10 月 23 日(金): NodeJS、Python、C++ など多様な言語および HTTP サーバーに影響し、全環境で即座にパッチが利用可能にはなっていません。
直ちに実施すべき対応
- 依存関係の確認: Brotli をデコードするライブラリやパッケージの存在を確認してください。
- 警戒体制の強化: 脆弱性の影響範囲を広げる報告が続くため、即座にアップグレード可能な準備を完了させてください。
- 緩和策(Mitigation): パッチが入手できない場合は、パッチ適用までの間はBrotli のデコード機能を無効化してください。
更新タイムライン(太平洋時間 PT)
- 4:12 PM PT:
、Python、C++、NodeJS、bun、Envoy などに対してパッチが利用可能になりました。libbrotli- 備考:Apache および Nginx はデフォルトで Brotli をデコードしないため影響はありません。
- 4:15 PM PT: OpenAI から同脆弱性が 2026 年 2 月に発見されていたことが発表されました。当時はソースコード内で修正されたものの、セキュリティ上の問題であるとして認識されていませんでした。
Brotli とは?
- Google が開発したロスレス圧縮アルゴリズムおよびデータ形式です。
- データの保存サイズ削減やインターネット伝送効率化に使用されます。
- HTTP 圧縮において広く利用され、HTML、CSS、JavaScript などのウェブコンテンツを圧縮します。
CVE-2026-111497 の概要
- タイプ: Brotli デコーダーにおけるバウンドアウトオブ(Out-of-bounds)書き込み。
- 影響範囲: 全プラットフォームにおいて、バージョン 1.0.3 から 1.2.0 まで脆弱です。
- 重大度: CVSS v4.0 スコア 9.2(Critical)。
- 悪用可能インパクト: リモートかつ未認証の攻撃者は、改ざんされた Brotli 圧縮ストリームを送信することで以下の行動が可能です。
- メモリ汚染
- 機密データの漏洩
- プロセスの停止(DoS)
- 任意のコードの実行
- 根本原因: 2026 年 2 月のソースコード修正(コミット 0ed468)で解決されましたが、当初はセキュリティ問題として認識されず、脆弱性を公開するまで修正済みリリースが提供されていませんでした。
影響を受ける環境
Brotli 1.2.0 以前 または brotlicffi 1.2.0.x を使用しているあらゆる環境が暴露されています。
- 主要な HTTP クライアント(
、requests
、httpx
)は、これらのパッケージが存在する場合は自動的に読み込みます。aiohttp
是正戦略
- アップグレード: Brotli
または1.2.1
へ移行するか、該当バージョンをバンドルしたコンテナイメージへの再構築が必要です。brotlicffi 1.2.1.0 - ツールの制限: 10 月 23 日時点では、勧告データベースが CVE を特定の PyPI パッケージにマッピングしていない可能性があるため、
、pip-audit
、Dependabot
などのツールで即座に検知されない場合があります。Safety
パッチ状況:修正済みリリース(2026 年 10 月 23 日確認)
| プロジェクト | パッチ状況 | 修正済みバージョン | 備考 |
|---|---|---|---|
| Node.js | ✅ 利用可能 | 、、 | サポートされているリリースラインを使用してください。 |
| Bun | ✅ 利用可能 | | Brotli 1.2.1 を含む。 |
| Envoy | ✅ 利用可能 | 、、、 | も修正を含むが、ブランチはサポート終了(EOL)。 |
| Istio | ✅ 利用可能 | 、、 | 1.29 ブランチは EOL。サポートラインへ移行してください。 |
| Google Brotli (Upstream) | ✅ 利用可能 | 、、 | ライブラリのブランチに対応する修正済みリリースを選択してください。 |
言語/フレームワークごとのアップグレードパス
- Node.js:
、22.23.4
、または24.22.1
へアップグレードしてください。26.12.1- Native Brotli / libbrotli:
以降へのアップグレードが必要です(古いライン:修正済み1.2.1
または1.0.10
を使用)。1.1.1
- Native Brotli / libbrotli:
- Python:
:Brotli
以降へ。1.2.1
:brotlicffi
以降へ。1.2.1.0- バンドル済みまたは静的にリンクされた場合はアプリケーションの再ビルドが必要です。
- curl / libcurl: Brotli 依存関係を
または修正済みリリース、あるいはベンダーからのセキュリティ修正済みパッケージへ更新してください(静的ビルドの場合は再コンパイル必要)。1.2.1 - Bun:
以降へアップグレードし、コンパイル済み実行ファイルを再構築してください。1.4.4 - Envoy / Istio: 上記テーブルのバージョンへ更新してください。
- OS パッケージ: ベンダーのセキュリティアップデート(SUA)を適用してください。
- その他の HTTP サーバー/API ゲートウェイ: ランタイムまたは Brotli ライブラリを更新してください(マネージドサービスの場合は提供元に是正確認を依頼)。
アップグレード後のチェックリスト
- 依存関係ロックファイルの更新。
- 影響を受けるアプリケーションとコンテナイメージの再構築。
- サービスの再デプロイおよび再起動。
- 実行中のワークロードが修正済みコンポーネントを使用しているかの確認。
アップグレード不能場合のための緩和策(ワークアラウンド)
パッチ適用までの間、暴露リスクを低減するための対応です。
Python アプリケーション
- オプショナルな Brotli サポート: 影響を受ける環境から
およびBrotli
をアンインストールしてください。brotlicffi- 依存関係のエキストラ(例:
)を除去し、自動再インストールを防いでください。httpx[brotli] - 依存関係ロックファイルを再生成し、ワークロードを再起動してください。
- 備考:
、HTTPX
、Requests
は Brotli を除外しても gzip/deflate で動作します。ただし、Brotli を送信するサーバーとの通信は破綻する可能性があります。urllib3
- 依存関係のエキストラ(例:
- ワークロードの再起動: 脆弱なデコーダーを使用する入出力(I/O)経路を無効化します。注意: 他のランタイムや製品にバンドルされている別個のデコーダーには影響しません。
入る HTTP リクエスト(リバースプロキシ / ミドルウェア)
- Brotli リクエスト拒否: 構成を変更し、
ヘッダーを含むリクエストを拒否してください。Content-Encoding: br- タイミング: 脆弱なデコーダーがボディを処理する前にチェックを実行してください。
出る HTTP リクエスト(レスポンス)
- Brotli ヘッダーの除去:
ヘッダーからAccept-Encoding
を削除してください。br - 応答の拒否: Brotli 応答デコードを無効化するか、
を持つ応答を拒否してください。Content-Encoding: br- 警告:
の変更だけでは不十分です。悪意のあるサーバーはそれでも Brotli 応答を送信でき、クライアントが強制デコードを行う可能性があります。Accept-Encoding
- 警告:
重要: 影響を受けるコンポーネントがパッチ適用済みで検証されるまで、これらのコントロールを維持してください。ベンダーが確認に従って追加の影響があるか監視してください。
テクニカル詳細:仕組み
- 位置: 欠陥は
にあり、ブロックスイッチ(ストリームがハフマンツリーを変更する箇所)を処理します。DecodeBlockTypeAndLength() - 脆弱な振る舞い: 脆弱なバージョンでは、この関数が単純なブール値を返し、
が「破損」かつ「入力不足」の両方の意味を持ちます。呼び出し元は通常、高速パスでこの戻り値を無視します。BROTLI_FALSE - 悪用: 攻撃者はブロックタイプと長さを宣言し、デコーダーにエラーを強制します。デコーダーはこれを「正常な入力不足」と解釈して処理を続け、バウンドアウトオブ書き込みが発生します。
- 修正(google/brotli コミット 0ed468): 関数は現在エラーコードを返し、
を導入しました。これにより安全かつ高速なパスの両方で形式エラー時にデコードが停止します。BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17)- Brotli 1.2.1 と 1.2.0 の主な違いはバージョンアップとこのデコーダー修正です。
Python 特有:CVE-2026-111497
影響を受けるパッケージ
NodeJS で使用される脆弱なデコーダーをコンパイルする 2 つの PyPI パッケージがあります。
- ダウンロード数:
は月間約8,280 万回ダウンロードされています。Brotli - トリガー: 攻撃者はレスポンス(出る)またはリクエストボディ(入る)を通じてデコーダーに到達できます。HTTP クライアントエキストラ経由で間接的に使用される場合、明示的にインポートしていないアプリケーションも暴露されます。
誰が影響を受けるか?
Python 環境に以下のいずれかがインストールされている場合です:
(PyPI):バージョン 1.2.0 以前Brotli
(PyPI):バージョン 1.2.0.xbrotlicffi
自動的な影響を受けるクライアント(パッケージが存在する場合):
/urllib3requests
(brotli エキストラあり)httpxaiohttp
(および派生版)Scrapy
Python への是正手順
- パッケージのアップグレード:
pip install -U "Brotli>=1.2.1" pip install -U "brotlicffi>=1.2.1.0" - ロックファイルの更新: Poetry、
、またはuv
を使用している場合は、制約を更新しロックファイルを再生成してください。pip-tools - イメージの再構築: これらパッケージをバンドルしたコンテナイメージとホイールを再構築してください。古いイメージは脆弱です。
- 環境の確認: すべての環境(ラップトップ、CI ランナー、サーバー、コンテナ)を確認してください。
検証チェックリスト
- インストール済みバージョンの確認:
pip show Brotli brotlicffi - コンテナイメージの確認:
docker run --rm <image> pip show Brotli brotlicffi - 依存関係の追跡:
pipdeptree -r -p Brotli - ロックファイルでの検索:
grep -i brotli poetry.lock uv.lock requirements*.txt
FAQ: Python 脆弱性について
Q: CVE-2026-111497 を修正するバージョンはどれですか? A:
Brotli 1.2.1 と brotlicffi 1.2.1.0(およびそれ以降)。
Q: コードで Brotli をインポートする必要がありますか? A:いいえ。インストール済みパッケージだけで十分です。HTTP クライアントである
urllib3 および httpx は、これらのパッケージが存在する場合自動的に使用します。
Q: pip-audit や Dependabot でフラグされますか? A:現時点では(10 月 23 日時点)、OSM が PyPI へのマッピング作業を行っているため、まだフラグされない可能性があります。
Q: ワークアラウンドはありますか? A:
Brotli および brotlicffi をアンインストールすると脆弱なデコーダーを除去でき、HTTP クライアントは gzip/deflate にフォールバックします。エッジで Brotli を拒否することは入る暴露を軽減しますが、Brotli を含む出庫応答に対する保護にはなりません。