セキュリティ プログラミング サーバー 公開日 2026.10.25 更新日 2026.10.25

HTTP2Shellとは?Brotliの脆弱性CVE-2026-111497の影響と確認・更新の手順(Node.js・Python・Bun)

圧縮形式Brotliの展開処理に見つかった重大な脆弱性「HTTP2Shell(Node2Shell)」(CVE-2026-111497)について、影響を受けるNode.js・Bun・Pythonのパッケージ・Envoy、body-parserやfetchが既定で展開する理由、自分の環境の版の確かめ方、修正版への更新とプロセスの入れ替え、暫定策の限界を公式情報をもとに整理します。

先に要点

  • HTTP2Shell(初めは Node2Shell とも)は、圧縮形式 Brotli の展開処理に見つかった脆弱性 CVE-2026-111497 の呼び名です。細工した Brotli のデータを展開させるだけで、メモリを壊してコードを実行されるおそれがあります(CVSS v4.0 で 9.2)。
  • 原因は Google の Brotli ライブラリ(1.0.3〜1.2.0)なので、Brotli を組み込んだソフトが広く影響を受けます。公式に修正版が出ているのは Node.js・Bun・Python の brotli / brotlicffi・Envoy など。
  • Node.js では、Express 5 などが使う body-parser 2.x が Brotli で圧縮された受信データを既定で展開し、fetch も HTTPS では Brotli の応答を既定で受け取ります。特別な使い方をしていなくても対象になりえます。
  • やることは「修正版に上げて、プロセスやコンテナを入れ替える」。Node.js の修正版は 22.23.4・24.22.1・26.12.1 で、サポートが終わった 20・23・25 系には出ていません。

HTTP2Shell(エイチティーティーピー・ツー・シェル)は、Web でよく使われる圧縮形式 Brotli(ブロトリ) の展開処理に見つかった脆弱性の呼び名です。最初は Node.js の問題として「Node2Shell」と呼ばれましたが、原因が Brotli のライブラリそのものにあり、HTTP で Brotli を扱う多くのソフトに影響することから、HTTP2Shell とも呼ばれるようになりました。どちらもセキュリティ企業などが付けた呼び名で、公式の名前は CVE 番号の CVE-2026-111497 です。

この記事では、Brotli・Node.js・Bun・Envoy の公式の告知、CVE の登録情報、各パッケージの変更履歴(2026年10月25日に確認)をもとに、どこが影響を受けるか、自分の環境の確かめ方、更新の手順、すぐに更新できないときの暫定策とその限界を整理します。

HTTP2Shell とは:Brotli の展開処理の不具合

Brotli は、Web ページや API の応答を小さくして送るための圧縮形式です。サーバーが応答を Brotli で圧縮し、ブラウザやプログラムが受け取って展開します。今回の不具合は、この展開する側(デコーダー)にあります。

Node.js の告知によると、壊れた形式のデータを受け取ったとき、本来は「形式の誤り」として止めるべきところを「入力がまだ足りないだけ」と扱ってしまい、内部の小さな作業用の領域(8バイト)の外側にデータを書き込み続けます。その結果、プロセスのメモリが壊れ、異常終了・メモリの中身の漏えい・リモートからのコード実行につながるおそれがあります。

サーバー側の経路 攻撃者が圧縮した データを送りつける クライアント側の経路 アクセス先のサーバーが 細工した応答を返す ライブラリが自動で Brotli を展開 アプリのコードが中身を見る前に起きる メモリが壊れる 異常終了・メモリの漏えい・コード実行 公式の説明をもとにした概略
展開がライブラリの中で自動に行われるため、アプリ側で気づきにくい
項目 内容
呼び名 HTTP2Shell(Node2Shell)
CVE CVE-2026-111497(Brotli のデコーダーの範囲外への書き込み)
深刻度 CVSS v4.0 で 9.2(Critical)。ネットワーク越し・認証不要・利用者の操作なし
影響する Brotli 1.0.3〜1.2.0
Brotli の修正版 1.0.10・1.1.1・1.2.1(2026年10月21日)

修正のコード自体は、Brotli の開発元のリポジトリに2026年2月に入っていましたが、セキュリティの修正として扱われず、修正を含むリリースが出たのは10月21日です。

影響を受けるもの:Brotli を組み込んだソフト

Brotli は多くのソフトにライブラリとして組み込まれています。自分のソフトが Brotli を「使っている」と意識していなくても、HTTP の圧縮の処理で裏で使われていることがあります。公式に告知や修正版が出ているものは次のとおりです。

公式に修正版が出ている主なソフト(2026年10月25日時点)

22.23.4 / 24.22.1 / 26.12.1

Node.js

同梱の Brotli に不具合。node:zlib で Brotli を展開すると影響する。

  • 影響:22.x・24.x・26.x
  • 20・23・25 系はサポート終了で修正なし
  • fetch や body-parser が自動で使う
1.4.4

Bun

1.4.4 のセキュリティ修正の対象に Brotli が含まれる。

  • bun upgrade で更新
  • fetch・Bun.serve なども同じリリースで修正
1.2.1 / v1.2.1.0

Python の brotli / brotlicffi

入っていると requests(urllib3)や httpx などが Brotli の応答を受け取るようになる。

  • pip で更新
  • 入っていることに気づきにくい
1.40.0 / 1.39.3 など

Envoy

Brotli の展開のフィルターを設定している場合に影響。

  • 修正版:1.40.0・1.39.3・1.38.6・1.37.8・1.36.12
  • 圧縮(送る側)だけなら対象外

このほか、OS に入っている Brotli のライブラリ(Debian・Ubuntu の libbrotli など)を使うソフトも、OS の更新で直します。Debian はすでに修正(DSA-6582-1)を出しています。Ubuntu の CVE のページは2026年10月25日時点で「調査中(Needs evaluation)」です。ディストリビューションごとの状況は、それぞれのセキュリティ情報で確かめてください。

Node.js で「使っているつもりがなくても」対象になる理由

Node.js では、次の2つが既定の動作のまま Brotli を展開します。

受け取る側

Express の body-parser(2.x)

公式の説明では、すべてのパーサーが gzip・br(Brotli)などで圧縮された受信データを自動で展開し、その設定(inflate)は既定で有効です。外から Content-Encoding: br の付いたリクエストを送られると、アプリのコードに届く前に展開されます。Brotli への対応は 2.0.0 で入ったもので(Express 5 が使う版)、1.x 系は gzip と deflate だけです。

取りに行く側

fetch(undici)

HTTPS のリクエストでは Accept-Encoding に br を含めて送り、相手が Brotli で返した応答を node:zlib で展開します(undici のソースで確認)。アクセス先のサーバーが乗っ取られていたり、悪意のある相手だったりすると、細工した応答を受け取ることになります。

Python でも、urllib3 の公式ドキュメントにあるとおり、brotli か brotlicffi のパッケージが入っていると、Brotli を受け取れることを相手に伝えるようになります。ほかのパッケージの依存として自動で入っていることがあるので、「入れた覚えがない」は安全の理由になりません。

自分の環境を確かめる

まず、どのソフトのどの版が動いているかを確かめます。サーバーに入っているコマンドの版と、実際に動いているプロセスの版が違うことがあるので、両方を見ます(脆弱性スキャナーが緑でも、動いている版が古いことがある)。

# Node.js(修正版:22.23.4 / 24.22.1 / 26.12.1)
node -v

# Bun(修正版:1.4.4)
bun --version

# Python の Brotli のパッケージ(修正版:brotli 1.2.1 / brotlicffi v1.2.1.0)
python -m pip show brotli brotlicffi

# OS のライブラリ(Debian・Ubuntu の例)
dpkg -l | grep -i brotli

コンテナで動かしている場合は、コンテナの中の版を確かめます。手元の node -v が新しくても、本番のコンテナのベースイメージが古いままなら意味がありません。

どこで動いているか 確かめ方
サーバーに直接入れた Node.js・Python 上のコマンド。nvm などで複数の版が入っていれば、サービスが使う版を確かめる
Docker のコンテナ docker exec でコンテナの中で node -v などを実行する。Dockerfile の FROM の版も見る
PaaS・サーバーレス 実行環境の版を管理画面や設定で確かめる。提供元の告知も見る
Envoy envoy --version と、Brotli の展開のフィルターを設定しているか

更新の手順:上げて、入れ替える

ライブラリの不具合なので、修正版に上げたうえで、動いているプロセスを入れ替えるまで終わらせます。ファイルを新しくしただけでは、古いプロセスがメモリに古い Brotli を持ったまま動き続けます。

HTTP2Shell の対応の順番

  1. 1
    動いている版を確かめる

    Node.js・Bun・Python のパッケージ・Envoy・OS のライブラリの版を、サーバーとコンテナの中で確かめる。

  2. 2
    修正版に上げる

    Node.js は 22.23.4・24.22.1・26.12.1 のどれか。20・23・25 系は修正が出ないので、サポート中の系に移る。Python は pip install -U brotli brotlicffi。OS は apt などでライブラリを更新。

  3. 3
    コンテナを作り直す

    ベースイメージを修正版のものにして、イメージを作り直してから入れ替える。キャッシュで古い層が使われていないかも見る。

  4. 4
    プロセスを再起動する

    systemd や PM2 などで、Node.js・Python・Envoy のプロセスをすべて再起動する。

  5. 5
    版をもう一度確かめる

    再起動のあと、動いているプロセスが修正版になったことを確かめる。

Node.js 20 系のままの場合

Node.js 20・23・25 系はサポートが終わっているため、今回の修正は出ていません。Node.js は告知で「サポートが終わった版は、セキュリティリリースのたびに常に影響を受ける」と明記しています。22 系以降への移行が必要です。サポート期間の読み方は EOLとLTSの違い で整理しています。

すぐに更新できないときの暫定策と、その限界

更新までの間は、Brotli のデータを展開させないようにすると危険を減らせます。ただし、どれも抜け道があるので、更新の代わりにはなりません。

暫定策 防げるもの 限界
body-parser の inflate を無効にする(例:express.json の設定で inflate: false) 圧縮されたリクエストの展開。公式の説明では、圧縮されたデータは拒否される gzip などの圧縮も受け付けなくなる。自分で zlib を使って展開している箇所は防げない
リバースプロキシで Content-Encoding が br のリクエストを拒否する 外からの Brotli のリクエストがアプリに届くこと 別の経路(内部の通信・別のポート)は防げない
fetch に Accept-Encoding を自分で指定し、br を外す 相手に Brotli で返してもらうことを頼まない 悪意のある相手は頼まれなくても Brotli で返しうる。undici は受け取った応答を展開する
使っていない brotli / brotlicffi のパッケージを外す Python の HTTP ライブラリが Brotli を扱うこと ほかのパッケージが依存していると外せない。外すと動かなくなる処理がないか確認が要る

リバースプロキシ(nginx など)で拒否する場合の例です。設定を変えるときは、正しい利用者の圧縮されたリクエストまで止めてしまわないかを、検証環境で確かめてから入れます。

# Brotli で圧縮されたリクエストの本文を受け付けない(更新までの暫定策)
if ($http_content_encoding ~* br) {
    return 415;
}

攻撃の状況を確かめる

2026年10月25日時点の状況

CISA の KEV カタログ(10月23日の更新版)には未掲載。修正の中身は公開済み。Ubuntu は調査中、Debian は修正済み。状況は変わるので、対応の前に各公式の情報を見直してください。

2026年10月25日時点で、米国の CISA が実際に悪用された脆弱性をまとめた KEV カタログ には載っていません(10月23日の更新版で確認)。ただし、深刻度が高く、修正の中身もすでに公開されているため、悪用が確認されてから動くのでは遅いと考えます。

異常に気づくための目安としては、Node.js や Python のプロセスの原因の分からない異常終了が増えていないか、圧縮された大きなリクエストが急に増えていないかを、ログや監視で見ておきます。メモリが壊れる種類の不具合なので、攻撃が失敗するとプロセスが落ちる形で表に出ることがあります。

HTTP2Shell についてよくある質問

Q. フロントエンドの JavaScript(ブラウザ)は影響を受けますか?

A. 今回の公式の告知の対象は、Node.js・Bun・Python のパッケージ・Envoy など、サーバーやプログラムの側で Brotli を展開するソフトです。ブラウザも Brotli の応答を展開しますが、ブラウザ自体の状況は今回の告知の範囲外なので、各ブラウザの更新情報で確かめます。ブラウザは自動で更新されることが多いので、最新の版に保っておきます。

Q. Next.js や Nuxt などのフレームワークを更新すればいいですか?

A. 不具合は Node.js 本体に同梱された Brotli にあるので、直すのは Node.js です。フレームワークを更新しても、動かしている Node.js が古いままでは直りません。Vercel などの PaaS で動かしている場合は、実行環境の Node.js の版と、提供元の告知を確かめます。

Q. 自分のサーバーでは Brotli で圧縮して返しているだけです。影響はありますか?

A. 不具合は展開する側にあるので、圧縮して送るだけなら、その処理は対象外です。たとえば Envoy の告知でも、影響は Brotli の展開のフィルターを設定している場合とされています。ただし、同じサーバーで動く Node.js のアプリが受信データを展開していたり、外部の API を fetch で呼んでいたりすれば、そちらが対象になります。

Q. PHP2Shell とは関係がありますか?

A. 別の脆弱性です。PHP2Shell は PHP 本体の不具合で、HTTP2Shell は Brotli のライブラリの不具合です。どちらも2026年10月21日に修正が公開されたので、両方のサーバーを持っている場合はそれぞれ対応します。PHP2Shell は PHP2Shellとは? で整理しています。

まとめ

  • HTTP2Shell(CVE-2026-111497)は、Brotli の展開処理の不具合です。細工したデータを展開させるだけで、メモリを壊してコードを実行されるおそれがあります。
  • Brotli を組み込んだ Node.js・Bun・Python のパッケージ・Envoy などが影響を受けます。Node.js では、body-parser 2.x と fetch が既定の動作で Brotli を展開します。
  • 対応は「修正版に上げて、プロセスとコンテナを入れ替える」。Node.js は 22.23.4・24.22.1・26.12.1 で、20 系はサポート中の系への移行が必要です。
  • 暫定策は展開させないことですが、抜け道があります。更新までのつなぎとして使います。

参考リンク

あとで見返すならここで保存

読み終わったあとに残しておきたい記事は、お気に入りからまとめて辿れます。