HTTP2Shell:Brotliの脆弱性がPython、Bun、Envoyにも波及
Brotliデコーダーの脆弱性CVE-2026-111497は、HTTP2Shellと呼ばれるようになりました。深刻度スコアは9.2で、Pythonのrequestsやhttpxを支えるパッケージ、Bun、Envoy、Istioにも及びます。
4 分で読めます

数字で見る
- CVSS v4.0 score, rated critical
- 9.2
- Brotli versions with the bug
- 1.0.3-1.2.0
- monthly downloads of Python's Brotli package
- 82.8M
GoogleのBrotliの展開処理にあるメモリのバグに、覚えやすい名前が付き、影響範囲も広がりました。CVE-2026-111497は、2026年10月21日に「Node2Shell」としてNode.jsで最初に修正されました。10月23日遅く(UTC)からは「HTTP2Shell」と呼ばれています。新しい名前は、影響がどこまで広がるかを表しています。PythonのHTTPライブラリー、ランタイムのBun、プロキシのEnvoyとIstioは、いずれも影響を受けるコードを含んでいます。
セキュリティ企業のAikidoは、深刻度の標準的な尺度であるCVSS v4.0で、10点満点中9.2(緊急)と評価しています。Brotliは、Webサーバーやブラウザーがデータを縮めるために使う圧縮形式です。見知らぬ相手から届いたBrotliデータを展開するプログラムは、どれも攻撃を受けるおそれがあります。
1つのバグに2つの名前
HTTP2Shellは2つ目の脆弱性ではありません。脅威インテリジェンス企業のBrandefenseは、自社の追跡ページで「CVEは1つであり、2つ目の脆弱性ではない」と書いています。同じBrotliデコーダーのバグに、新しい名前が付いたものです。
Tech AI Wireは、最初の修正をNode.jsの10月のセキュリティリリースの記事で取り上げました。その後に変わったのは、影響を受けるプロジェクトの一覧です。
バグの仕組み
この脆弱性は、Brotliのバージョン1.0.3から1.2.0にあります。Node.jsのセキュリティ告知が仕組みを説明しています。圧縮ストリーム内の不正な「ブロック切り替え(block switch)」が、形式のエラーではなく、一時的に入力が足りない状態として扱われていました。その結果、デコーダーは8バイトの内部バッファーに書き込み続け、その終端を越えてしまいました。
バッファーの終端を越えて書き込むと、プログラムのクラッシュやメモリの漏えいが起きることがあります。最悪の場合は、攻撃者がコードを実行できてしまいます。Brotli自身のリリースノートには、「範囲外書き込みによりリモートコード実行が可能になる」とあります。
Node.jsの告知は、OpenAIの自動コードレビューツールであるOpenAI Codex Securityを報告者として挙げています。Aikidoによると、OpenAIはこのバグが双方向に働くことを突き止めました。悪意のあるクライアントは未修正のサーバーを攻撃でき、悪意のあるサーバーは未修正のクライアントを攻撃できます。
Aikidoはさらに、根本原因は2月にBrotliのソースコードで修正済みだったと説明しています。誰もそれをセキュリティ修正として示さなかったため、10月21日まで、その修正を含むリリースはありませんでした。
Pythonアプリが影響を受ける理由
多くのPythonアプリは、Brotliを一度もimportせずに使っています。Aikidoによると、urllib3とrequests、httpx、aiohttp、Scrapyはいずれも、Brotliがインストールされていれば自動的に使います。PythonのBrotliパッケージは、月に8,280万回ダウンロードされています。
落とし穴はもう1つあります。Aikidoの報告では、10月23日の時点で、CVEレコード、OSVデータベース、GitHubのアドバイザリーデータベースのいずれも、このCVEをどちらのPythonパッケージにも結び付けていませんでした。そのため、pip-audit、Dependabot、Safetyは脆弱なバージョンを検出しません。
修正版
| プロジェクト | 修正版 |
|---|---|
| Google Brotli(Cライブラリー) | 1.0.10、1.1.1、1.2.1 |
| PyPIのBrotli | 1.2.1 |
| PyPIのbrotlicffi | 1.2.1.0 |
| Node.js | 22.23.4、24.22.1、26.12.1 |
| Bun | 1.4.4 |
| Envoy | 1.40.0、1.39.3、1.38.6、1.37.8 |
| Istio | 1.29.9、1.30.6、1.31.2 |
修正が出ないバージョンもあります。Node.js 20.x、25.x、18.xはサポート終了を過ぎています。BrandefenseはVercelの言葉として、Node 20は「この修正を受け取らない」と引用しています。Brandefenseはまた、Debianの新しいBrotliパッケージにはまだ修正版がないとしています。Aikidoによると、Apacheのmod_brotliとNginxは、初期設定ではBrotliをデコードしません。
悪用されているのか
Brandefenseによると、10月23日22時(UTC)の時点で、実際の攻撃は報告されていませんでした。この脆弱性は、CISAの「既知の悪用された脆弱性」のリストには載っていません。
実際にどれほど深刻かは、まだ意見が分かれています。研究者のRon Masas氏は、自身のチームがログインなしでリモートコード実行を再現したと述べています。Brandefenseは、公開済みの概念実証(PoC)コードはほとんどがクラッシュを起こすだけで、サービス拒否(DoS)しか起こせないとする分析もあると指摘しています。
開発者にとっての意味
まずパッチを当て、そのうえでロックファイルを手作業で確認してください。スキャナーがPythonのパッケージを検出しない可能性があるため、依存関係の一覧でBrotliとbrotlicffiを検索し、1.2.1または1.2.1.0に更新してください。
標的はサーバーだけだと考えないでください。コードがrequests、httpx、aiohttpで外部のサーバーからデータを取得している場合、悪意のあるサーバーが不正なストリームを送ってくる可能性があります。Aikidoは「Accept-Encodingを変更するだけでは不十分だ」と警告しています。このヘッダーは、サーバーに圧縮しないよう求めるだけだからです。
Node.jsでは、使っているフレームワークが何をデコードするかを確認してください。Brandefenseの見立てでは、Express 5は初期設定でBrotliのリクエスト本文をデコードし、Express 4はデコードしません。Masas氏はリスクを端的にこう述べています。「app.use(express.json())だけで十分だ」。
EnvoyやIstioをサービスメッシュとして運用している場合は、プロキシも更新してください。Brotliのコピーを独自に同梱しているソフトウェアは、システムの更新だけでなく再ビルドが必要です。まだパッチがない場合、AikidoはBrotliのデコードを無効にするよう勧めています。
今週初めには、別のPHPの脆弱性であるPHP2Shellが、公表前に攻撃の試みを受けていました。今回の脆弱性にも、同じ速さで対処してください。
出典
- Node2Shell Brotli vuln (CVE-2026-111497) evolves to HTTP2Shell, as libraries and apps using HTTP are affected - Aikido Security
- Node2Shell: Fixed Node.js Versions and Check - Brandefense
- Wednesday, October 21, 2026 Security Releases - Node.js
- google/brotli releases - GitHub (google/brotli)
関連記事

Python 3.15.1、3.14.9、3.13.17がpip 26.2.2を同梱
Python 3.15.1、3.14.9、3.13.17が2026年10月21日に公開されました。pip(ピップ)26.2.2とcertifi 2026.10.19を同梱し、認証局eMudhraを信頼しないようにします。

Rejetto HFS CVE-2026-61500、解説公開の翌日に悪用が始まる
HFS(HTTPファイルサーバー)3.0.0から3.2.0は、ログインの署名にMath.random()を使っています。AnthropicのMythosが見つけた欠陥です。攻撃は解説公開の翌日、10月3日に始まりました。3.2.1で修正されています。

Python 3.10がサポート終了、5つのリリースで8件のCVEを修正
Python 3.10.22が3.10の最後のリリースです。Python(パイソン)3.10は2026年10月1日にサポート終了を迎え、3.11から3.14には最大8件のCVEの修正が届きました。