HN 日本語サマリー

← 一覧へ戻る
セキュリティ

Node2ShellがHTTP2Shellに進化、多くのHTTPライブラリとアプリに影響するBrotliの脆弱性(CVE-2026-111497)

Node2Shell evolves to HTTP2Shell, blast radius affects many HTTP libs and apps (aikido.dev)

296 pointsby theanonymousone148 コメント

要約

GoogleのBrotli圧縮ライブラリに、メモリリークや任意のコード実行につながる可能性のある脆弱性(CVE-2026-111497、通称Node2Shell)が発見されました。この脆弱性はNode.jsだけでなく、Pythonを含む多くの言語のHTTPライブラリやアプリケーションに影響を及ぼしており、迅速なアップデートまたはBrotliデコードの無効化が推奨されています。OpenAIが2月に発見していたものの、セキュリティ問題としては認識されていなかったことが後に判明しました。

全文翻訳

Node2ShellがHTTP2Shellに進化。Brotliの脆弱性(CVE-2026-111497)の影響範囲は、HTTPを使用する多くのライブラリとアプリに及ぶ。

TL;DR

**⚠️ BrotliはGoogleが開発した広く使われている圧縮ライブラリです。10月21日(水)、NodeJSはCVE-2026-111497(通称「node2shell」)を公開しました。これは、攻撃者が制御するBrotliデータを展開するNode.jsプロセスが、メモリを漏洩させたり任意のコードを実行させられたりする可能性がある脆弱性です。10月22日(木)には、PythonパッケージもCVE-2026-111497に対して脆弱であることが公表されました。

10月23日(金)までに、このCVEがHTTPを使用する他の主要な言語やサービスアプリケーションにも影響を及ぼしており、まだパッチが完全には利用可能でないことが判明しました。

ライブラリ内にBrotliデコードを依存関係として含んでいるか確認してください。より広範な発表に注意を払い、可能な限り早くアップグレードする準備をしてください。影響を受ける可能性のあるライブラリやアプリケーションにパッチが利用できない場合は、パッチが利用可能になるまでBrotliデコードを無効にすることを推奨します。

更新 太平洋時間 午後4時12分:

libbrotli、Python、C++、NodeJS、bun、Envoyなど、多くのライブラリでパッチが利用可能になりました。

更新 太平洋時間 午後4時15分: OpenAIは、彼らがこの脆弱性を2月に発見したと共有しています。根本原因の問題は当時Brotliのソースコードで修正されていましたが、それがセキュリティ脆弱性につながることは知られていませんでした。OpenAIのアドバイザリはこちらです。

‍

[画像:記事のメインビジュアル]

Brotliとは?

BrotliはGoogleが開発したロスレス圧縮アルゴリズムおよびデータ形式です。データを保存したりインターネット経由で送信したりするために小さくする手段です。ソフトウェアは後でそれを展開して元のデータを復元します。HTML、CSS、JavaScriptなどのWebコンテンツを圧縮するために、HTTP圧縮に広く使用されています。

CVE-2026-111497とは?

CVE-2026-111497は、Google Brotliデコーダーにおける境界外書き込みの脆弱性で、すべてのプラットフォームでバージョン1.0.3から1.2.0に影響します。これは数日前に発表されたNode2Shellの背後にある、同じBrotliデコーダーの欠陥です。リモートから認証されていない攻撃者は、細工されたBrotli圧縮ストリームを送信することで、メモリを破損させたり、機密データを漏洩させたり、プロセスをクラッシュさせたり、あるいは任意のコードを実行させたりする可能性があります。CVSS v4.0スコアは9.2(Critical)であり、Node.jsはそのバンドルされたBrotliライブラリを通じて影響を受けます。

バグにより、Brotliデコーダーは拒否すべきデータを受け入れ続けます。これらのバイトは小さなワーキングバッファをオーバーフローさせ、プログラムのメモリを損傷させる可能性があります。攻撃者はその損傷を利用して、自身のコードなどの実行内容を制御できます。

OpenAIはこれを2月に発見しました。これは認証されていないリモートコード実行として報告され、双方向に機能するため、悪意のあるクライアントはパッチが適用されていないサーバーを乗っ取ることができ、悪意のあるサーバーは圧縮された応答を受け入れるパッチが適用されていないクライアントを乗っ取ることができます。

根本原因は2月にBrotliソースコードで修正されましたが、当時はセキュリティ問題として認識されておらず、修正が含まれたリリースは現在まで出荷されていませんでした。これは、Brotliをバンドルしているすべてのプロジェクトが独自のアップデートを出荷する必要があることを意味します。

‍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は脆弱なバージョンをフラグ付けしません。

‍Aikido Intelで追跡している情報は以下の通りです。

影響を受けないソフトウェアとしては、Apacheの標準mod_brotliはBrotliをデコードしません。

CVE-2026-111497については、影響を受けるランタイムまたはBrotliライブラリを更新してください。

  • Node.js: 22.23.4、24.22.1、または26.12.1、または対応するリリースラインの新しいサポート対象リリースにアップグレードしてください。
  • ネイティブBrotli / libbrotli: 1.2.1以降にアップグレードしてください。古いリリースラインの場合は、パッチが適用された1.0.10または1.1.1を使用してください。
  • Pythonパッケージ: インストールされている場所で、Brotliを1.2.1以降、brotlicffiを1.2.1.0以降にアップグレードしてください。
  • curl / libcurl: Brotli依存関係を1.2.1、パッチが適用された古いリリース、またはベンダーのセキュリティ修正済みパッケージに更新してください。バンドルまたは静的にリンクされたコピーは、アプリケーションのビルド更新が必要です。
  • Bun: 1.4.4以降にアップグレードしてください。Bunをバンドルしているコンパイル済み実行ファイルを再ビルドしてください。
  • Envoy: 1.40.0、1.39.3、1.38.6、または1.37.8、またはサポート対象ブランチの新しいリリースにアップグレードしてください。1.36.12にも修正が含まれていますが、1.36ブランチはサポート対象外です。
  • Istio: 修正は1.29.9、1.30.6、および1.31.2に含まれています。対応するラインの新しいサポート対象リリースを使用してください。1.29ブランチはサポート終了です。
  • オペレーティングシステムパッケージ: ベンダーのセキュリティアップデートをインストールしてください。ベンダーはバージョン番号を変更せずに修正をバックポートする場合があります。
  • その他のHTTPサーバー、リバースプロキシ、APIゲートウェイ、HTTPクライアント: 影響を受けるランタイムまたはBrotliライブラリを更新してください。Brotliが製品にバンドルされている場合は、このCVEに明示的に対処している製品ベンダーのリリースをインストールしてください。マネージドサービスの場合は、プロバイダーに修正を確認してください。

依存関係ロックを更新し、影響を受けるアプリケーションとコンテナイメージを再ビルドし、再デプロイしてサービスを再起動してください。実行中のワークロードがパッチ適用済みのコンポーネントを使用していることを確認してください。

‍

修正済みリリース(2026年10月23日レビュー済み)

プロジェクトパッチステータス修正済みバージョン注意事項
Node.jsパッチあり22.23.4 · 24.22.1 · 26.12.1サポート対象のリリースラインを使用してください。
Bunパッチあり1.4.4Brotli 1.2.1が含まれています。
Envoyパッチあり1.40.0 · 1.39.3 · 1.38.6 · 1.37.81.36.12にも修正が含まれていますが、1.36はサポート対象外です。サポート対象ブランチを使用してください。
Istioパッチあり1.29.9 · 1.30.6 · 1.31.21.29はサポート終了のため、サポート対象ラインに移行してください。
Google Brotli (upstream)パッチあり1.0.10 · 1.1.1 · 1.2.1ライブラリブランチに対応する修正済みリリースを選択してください。

まだアップグレードできない場合の対処法

これらの回避策は、アップグレード準備中にリスクを軽減します。

  • Pythonアプリケーション: Brotliサポートがオプションである場合、影響を受ける環境からBrotliとbrotlicffiの両方をアンインストールしてください。httpx[brotli]などの依存関係の追加や、それらを再インストールする可能性のあるその他の要件を削除し、依存関係ロックを再生成してワークロードを再ビルド/再起動してください。HTTPX、Requests、urllib3は、これらのオプションパッケージなしでもgzipとdeflateのサポートを維持します。ただし、Brotliを送信するサーバーは、読み取れない応答やアプリケーションエラーを生成する可能性があります。自動フォールバックは保証されません。
    • 両方のPythonパッケージをアンインストールしてワークロードを再起動すると、これらのパッケージが提供する送受信データ用のデコードパスが削除されます。他のランタイム、ライブラリ、または製品にバンドルされている個別のBrotliデコーダーは削除されません。
  • 受信HTTPリクエスト: 脆弱なデコーダーがボディを処理する前に、リバースプロキシ、ロードバランサー、またはアプリケーションミドルウェアで、Content-Encodingにbrが含まれるリクエストを拒否してください。brを大文字小文字を区別せずに一致させ、エンコーディングリスト内でも同様に処理してください。
  • 送信HTTPリクエスト: Accept-Encodingからbrを削除してください。また、Brotli応答のデコードを無効にするか、デコードが開始される前にContent-Encodingにbrが含まれる応答を拒否してください。このチェックが、クライアントが応答をダウンロードしてデコードした後の自動ボディ処理よりも前に行われることを確認してください。これは遅すぎます。

Accept-Encodingの変更だけでは不十分です。悪意のあるサーバーはクライアントの広告に関係なくBrotli応答を送信でき、urllib3は応答のContent-Encodingヘッダーからデコーダーを選択します。

影響を受けるコンポーネントがパッチ適用され、検証されるまで、これらの制御を維持してください。ベンダーが追加の影響を受けるコンポーネントまたは攻撃パスを確認したら、カバレッジを見直してください。

AikidoがCVE-2026-111497でどのように役立つか

Aikidoは、リポジトリ、コンテナイメージ、および依存関係(推移的な依存関係として含まれる場合も含む)で、Brotliとbrotlicffiの脆弱なバージョンをフラグ付けします。ダッシュボードには、どのサービスがまだ脆弱なバージョンを実行しているかが表示されるため、外部サーバーに接続するサービスや圧縮されたリクエストボディを受け入れるサービスから優先的にアップグレードできます。

アップグレード後、Aikidoは問題が解消されたかを確認します。

タイムライン

BrotliはGoogleが開発した広く使われている圧縮ライブラリです。10月22日(水)、NodeJSはCVE-2026-111497(通称「node2shell」)を公開しました。これは、攻撃者が制御するBrotliデータを展開するNode.jsプロセスが、メモリを漏洩させたり任意のコードを実行させられたりする可能性があるというものです。ユーザーは、アプリまたはライブラリが悪意のあるBrotliデータを展開する場合(例: built-in fetch(), body-parser)に影響を受けました。

翌日、Pythonは同じ欠陥を修正するセキュリティアップデートをリリースしました。PythonパッケージもCVE-2026-111497に対して脆弱でした。Brotliの欠陥は、ライブラリがダウンストリームで広く統合されていることを考えると、さらに多くの言語やサービスアプリケーションに影響を与える可能性があります。OpenAIが2月にこれを発見していたことが判明しました。

CVE-2026-111497の技術的詳細

この欠陥はDecodeBlockTypeAndLength()にあり、これはブロックスイッチ(Brotliストリームがハフマンツリーを変更するポイント)を処理します。脆弱なバージョンでは、この関数は単純なブール値を返しますが、BROTLI_FALSEは「ストリームが不正である」または「入力がさらに必要」のいずれかを意味する可能性があります。呼び出し元は両者を区別できず、高速パスではデコーダーは戻り値を完全に無視します。

細工されたストリームは、単一のブロックタイプを宣言してからそのブロックの長さを使い果たすことができ、これは成功しないスイッチを強制します。デコーダーは、完了したストリームに対してさらに入力が必要であると報告するか、すでに持っていたブロック状態でデコードを続行します。後者のパスが境界外書き込みにつながります。

アップストリームの修正であるgoogle/brotli commit 0ed4268は、関数がエラーコードを返すようにし、新しいエラーBROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (-17)を追加します。デコードは現在、安全パスと高速パスの両方でフォーマットエラー時に停止します。OSMはBrotli 1.2.0と1.2.1のソース配布をdiffし、1.2.1はバージョン番号の変更と、そのコミットからのデコーダーの変更のみが異なることを発見しました。

‍

‍

PythonライブラリにおけるBrotliの脆弱性(CVE-2026-111497)

Node2Shell(CVE-2026-111497)の背後にあるBrotliの欠陥はPythonに影響します。2つのPyPIパッケージ、Brotliとbrotlicffiは、Node.jsがバンドルしているのと同じ脆弱なBrotliデコーダーをコンパイルしています。公式アドバイザリがGitHubに投稿されました。Brotliは月間8280万ダウンロードを誇ります。

実行しているPython環境にBrotli 1.2.0以前、またはbrotlicffi 1.2.0.xがインストールされている場合、あなたは影響を受けます。requestsやhttpxなどの一般的なHTTPクライアントは、これらが存在する場合にこれらのパッケージを自動的にロードします。Scrapyなどの一部のパッケージはBrotliを依存関係として自動的にインストールしますが、他のパッケージは明示的な指定が必要です。攻撃者は、アプリが行うリクエストに対して悪意のあるBrotli応答を送信するか、アプリにBrotliで圧縮されたリクエストボディを送信することによって、脆弱なデコーダーに到達できます。これは、アプリがコード内でBrotliをインポートしていなくても、影響を受ける可能性があることを意味します。これは一般的な推移的依存関係であるため、システムを確認してください。

修正するには、パッチが適用されたリリースにアップグレードしてください。

  • Brotli -> 1.2.1
  • brotlicffi -> 1.2.1.0

両方の修正済みバージョンのリリースノートにはCVEに関する言及がありません。10月23日現在、アドバイザリデータベースはCVEをいずれのPyPIパッケージにもマッピングしていないため、pip-audit、Dependabot、Safetyはこれらのバージョンをフラグ付けしません。

PythonでCVE-2026-111497の影響を受けるのは誰ですか?

以下のいずれかのパッケージがインストールされているPython環境がある場合、あなたは影響を受けます。

パッケージ影響を受けるバージョン修正済みバージョン
Brotli (PyPI)1.2.0以前1.2.1
brotlicffi (PyPI)1.2.0.x1.2.1.0

あなたのコードがどちらかのパッケージをインポートする必要はありません。これらのHTTPクライアントは、Brotliまたはbrotlicffiがインストールされている場合にBrotliまたはbrotlicffiを自動的に使用し、アプリが呼び出す任意のサーバーからのBrotli応答をデコードします。

  • urllib3(したがってrequests): Brotliまたはbrotlicffiがインストールされている場合
  • httpx: brotliエクストラ付き
  • aiohttp: Brotliがインストールされている場合
  • Scrapy、および上記のクライアント上に構築されたものすべて

攻撃者のデータは2つのルートでデコーダーに到達する可能性があります。

  • 送信リクエスト: あなたのアプリが、攻撃者が制御するサーバーからBrotli応答を取得する場合(Webhook配信、URLプレビュー、クローラー、「URLを取得」機能などを介して)。
  • 受信リクエスト: あなたのフレームワークまたはミドルウェアが、Content-Encoding: brで送信されたリクエストボディをデコードする場合(これはNode.jsのExpress 5ケースのPython版です)。
PythonでCVE-2026-111497を修正する方法

修正はパッケージのアップグレードであり、4つのステップが必要です。

  1. インストールされているパッケージをpip install -U "Brotli>=1.2.1"またはpip install -U "brotlicffi>=1.2.1.0"でアップグレードします。Poetry、uv、またはpip-toolsを使用している場合は、ロックファイル内の制約を更新し、ロックファイルを再生成します。
  2. これらのパッケージのいずれかをバンドルしているコンテナイメージと、すべてのホイールを再ビルドします。脆弱なバージョンでビルドされたイメージは、再ビルドされるまで脆弱なままです。
  3. ラップトップ、CIランナー、サーバー、コンテナなど、実行しているすべての環境を確認します。多くのプロジェクトはHTTPクライアントのエクストラを介してBrotliを取り込むため、完全な解決済み依存関係ツリーを確認してください。
  4. 現時点では手動チェックに依存してください。CVEレコードがPyPIパッケージにマッピングされるまで、pip-audit、Dependabot、およびSafetyはこれを報告しません。OSMはGitHubアドバイザリのためにPYSECエントリとPyPIパッケージマッピングを提出しています。

Python BrotliバインディングがPyPIではなくLinuxディストリビューションパッケージから提供された場合、修正はディストリビューションを通じて提供されるため、そのセキュリティアドバイザリも確認してください。

PythonにおけるBrotliの脆弱性(CVE-2026-111497)とは何ですか?

Python Brotli脆弱性とは、CVE-2026-111497、すなわちNode2Shellとして知られるBrotliデコーダーの欠陥が、PyPI上のPythonパッケージに影響を与えることを指します。CVEレコードはCWE-252(未チェックの戻り値)とCWE-787(境界外書き込み)をペアにしています。

PythonにとってCVE-2026-111497はどの程度深刻で、悪用されていますか?

CVEレコードはこの欠陥にCVSS 4.0スコア9.2を与えており、Node.jsはこれを高深刻度と評価しています。OSMはBrotli 1.2.0と1.2.1をAddressSanitizerでビルドし、細工されたストリームを両方で実行しました。バージョン1.2.0は約23MBのストリーム全体を消費し、ストリームが一括で届いたか、1バイトのような小さなチャンクで届いたかに関わらず、さらに入力が必要であると報告し続けました。バージョン1.2.1は毎回エラー-17でストリームを拒否しました。

OSMはPython拡張に対するメモリ破損やコード実行を追求しませんでした。デコーダーコードは、Impervaなどが報告したように、改変されていないNode.js 24.22.0ビルドに対して研究者が悪用したのと同じコードです。Node.jsについては、The Hacker Newsは10月22日現在、実環境での悪用はないと報告しています。

それでも緊急として扱ってください。このバグは信頼されていないネットワーク入力を処理するコンポーネントにおけるメモリ安全性に関する欠陥であり、修正は通常のバージョンアップです。外部サーバーに接続するサービスや圧縮されたリクエストボディを受け入れるサービスが最優先されるべきです。

Pythonアプリがどのように影響を受けるかを確認する方法
  1. 各環境でpip show Brotli brotlicffiを使用し、各コンテナイメージでdocker run --rm <image> pip show Brotli brotlicffiを使用してインストールされているバージョンを確認します。
  2. パッケージをプルしているものを特定します。pipdeptree -r -p Brotliを実行して、どの依存関係がそれを必要としているかを確認し、ロックファイル(Poetry、uv、requirements*.txtなど)でgrep -i brotliを使用して検索します。
  3. 制御下にないサーバーへのアウトバウンドHTTP呼び出し、およびContent-Encoding: brリクエストボディをデコードするエンドポイントをリストアップします。
  4. ステップ3に一致するサービスから優先的にアップグレードし、次に残りをアップグレードします。

Pythonでバグを再現している場合、brotli.decompress()はどのエラーコードが発火したか分からない汎用的なbrotli.error: decoder failedを発生させます。Decompressor()に細工されたストリームを段階的に供給しても、1.2.0では完了しません。

FAQ

‍
PythonでCVE-2026-111497を修正するバージョンはどれですか?

Brotli 1.2.1およびbrotlicffi 1.2.1.0、およびそれ以降のバージョンです。

影響を受けるためにコードでBrotliをインポートする必要がありますか?

インストールされているパッケージがあれば十分です。urllib3、requests、httpx、aiohttpは、どちらかが存在する場合にBrotliまたはbrotlicffiを自動的に使用し、アプリが呼び出す任意のサーバーからのBrotli応答をデコードします。

pip-auditまたはDependabotはこれをフラグ付けしますか?

まだです。10月23日現在、CVEレコード、OSV、およびGitHub Advisory DatabaseはいずれのPyPIパッケージもリストしていません。OSMは、ツールがこれを拾えるように、GitHubアドバイザリのためにPYSECエントリとPyPIパッケージマッピングを提出しています。

回避策はありますか?

Brotliとbrotlicffiをアンインストールすると、脆弱なデコーダーが削除され、HTTPクライアントはgzipとdeflateにフォールバックします。エッジでBrotliエンコードされたリクエストを拒否すると、受信側のリスクは軽減されますが、アプリが取得するBrotli応答に対する保護にはなりません。