HTTP2Shell とは何か。先に広まった node2shell(Node.js の Brotli デコーダの RCE・CVE-2026-111497)が「進化した」と報じられましたが、正確には新しい脆弱性ではありません。分かったのは、そのバグが Node.js 固有ではなく、上流の Brotli ライブラリ(google/brotli)にあること、そして HTTP で Brotli を展開する多くのライブラリ・言語に及ぶ、という影響範囲の広さです。この広さを、セキュリティ企業 Aikido が HTTP2Shell と名付けました。名前は node2shell→http2shell の語呂で、HTTP/2 というプロトコルとは関係ありません。依存する部品の問題が横に広がる構図はサプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説にもまとめています。この記事は、何が広いのか・どこが露出するか・何をどこまで上げればよいかを、実機点検つきで整理します。

NODE2SHELL TO HTTP2SHELL何が分かったか

node2shell の正体は上流の Brotliの問題だった

  1. 当初

    node2shell として把握

    Node.js の RCE(CVE-2026-111497)

  2. 正体

    バグは上流 google/brotli

    Brotli 1.0.3〜1.2.0 が影響範囲

  3. 波及

    HTTP で Brotli を展開する全スタックへ

    Node・Bun・Express・Koa・Fastify…

  4. 命名

    Aikido が HTTP2Shell と呼ぶ

    新しい脆弱性でなく影響範囲の広さの呼び名

出典: Aikido・Node.js 告知・CVE 記録(2026-10-24 確認)。HTTP/2 とは無関係の語呂(node2shell→http2shell)

30秒でわかる

  • ・HTTP2Shell とは:node2shell(CVE-2026-111497)の正体=上流 Brotli の問題で、影響が広いことを指す Aikido の呼び名。新しい脆弱性ではない
  • ・どこまで広い:上流 google/brotli(1.0.3〜1.2.0)を同梱・利用する全スタック。Node・Bun・Express・Koa・Fastify…
  • ・直し方:同梱 Brotli を 1.0.10 / 1.1.1 / 1.2.1 以上へ。Node は 22.23.4 / 24.22.1 / 26.12.1 以上
  • ・注意:npm の brotli パッケージは別物。HTTP/2 とも無関係

まずやること

・node --version が 22.23.4 / 24.22.1 / 26.12.1 以上か確認する
・node -p "process.versions.brotli" で同梱 Brotli が 1.0.10 / 1.1.1 / 1.2.1 以上か確認する
・Express 5・Koa・@fastify/compress など、要求ボディの Brotli を展開する箇所を洗い出す

HTTP2Shell とは:node2shell の正体は「上流 Brotli ライブラリ」だった

最初に広まった node2shell は、「Node.js が同梱する Brotli デコーダに境界外書き込みがあり、細工した Brotli でリモートコード実行に至りうる(CVE-2026-111497)」という、Node.js を主役にした捉え方でした。Node2shell の記事でも、fetch や Express 経由の露出と Node の更新を中心にまとめています。

その後にはっきりしたのは、問題の本体が Node.js ではなく、その内部で使っている上流の Brotli ライブラリ(google/brotli)にあることです。影響する Brotli の版は 1.0.3〜1.2.0で、修正版は 1.0.10・1.1.1・1.2.1です。Node.js はこの Brotli を同梱しているので影響を受けましたが、同じ Brotli を同梱・利用するものは Node.js だけではありません。だから「Node の話」から「Brotli を使う HTTP スタック全般の話」へと、見え方が広がりました。これを Aikido が HTTP2Shell と名付けた、という経緯です。深刻度は、Node.js プロジェクトは High としていますが、CVE 記録では Critical(CVSS 3.1 で 9.8)とされています。実環境での悪用は、現時点で報告されていません。

なぜ多くの HTTP ライブラリ・言語に及ぶのか

理由はシンプルで、1つの上流ライブラリを、たくさんのランタイムやライブラリが内部に取り込んでいるからです。これは、1つの認証局のつまずきが各言語に波及したeMudhra の件と同じ「1つの共通部品、大きな影響範囲」の形です。

BLAST RADIUSなぜ広く波及するか

1つの上流ライブラリが多くのスタックに及ぶ

  1. 上流 google/brotli

    1.0.3〜1.2.0 に境界外書き込み

  2. ランタイムが同梱

    Node.js・Bun が内部に持つ

  3. HTTPライブラリが展開

    Express・Koa・Fastify が要求を・fetch が応答を

  4. 各自が上流修正版を取り込む

    Brotli 1.0.10 / 1.1.1 / 1.2.1 以上へ

出典: Aikido・Cycode ほか(2026-10-24 確認)。npm の brotli パッケージは別物(脆弱な部品ではない)
どこ Brotli の持ち方 対応
上流 google/brotli 本体(部品そのもの) 1.0.10 / 1.1.1 / 1.2.1 で修正
Node.js ランタイムに同梱 22.23.4 / 24.22.1 / 26.12.1 以上へ(20以前は修正なし)
Bun ランタイムに同梱 ランタイムの更新で差し替え
Express / Koa / Fastify ランタイムの Brotli を利用 ランタイム更新で解消。ライブラリ側の更新も確認
npm の brotli パッケージ 今回の部品ではない 上げても同梱 Brotli は変わらない

ポイントは、自分のコードに穴が無くても、使っているランタイムやライブラリが同梱・利用する Brotli の問題で露出しうること。そして、同梱しているものがそれぞれ上流の修正版を取り込まないと直らない、という点です。

Brotli は HTTP の圧縮方式として広く使われているため、理屈のうえでは Node.js や Bun に限らず、攻撃者が制御できる Brotli を展開するあらゆる HTTP クライアント・サーバーが対象になりえます。だからこそ Aikido は「多くのライブラリとアプリケーションに影響する」と表現し、HTTP2Shell と呼びました。とはいえ、実際に露出するかは「そのコードが信頼できない Brotli を展開しているか」で決まるので、名前の派手さに引きずられず、自分の経路を落ち着いて確かめることが大切です。なお、影響を受ける全てに修正が出そろっているわけではない段階なので、使っている部品の更新情報は継続して追う必要があります。

どこで攻撃者の Brotli が展開されるか

実害を左右するのは、「攻撃者が制御できる Brotli を、アプリが知らないうちに展開するか」です。

WHERE IT DECODES攻撃者のBrotliが入る所

要求ボディや応答を自動で展開する入口

  1. 1.Express 5 / body-parser 2.x

    json・urlencoded・text・raw が要求ボディを展開

  2. 2.Koa のボディパーサ

    要求ボディの Brotli を展開

  3. 3.@fastify/compress(要求展開)

    要求の展開を有効にしている場合

  4. 4.組み込み fetch()

    応答の Brotli を既定で展開(外向きも対象)

出典: Cycode・Aikido(2026-10-24 確認)。素の Node HTTP サーバーは受信 Brotli を自動展開しない

・Express 5・body-parser 2.x:json()・urlencoded()・text()・raw() が、要求ボディの Brotli を展開します
・Koa のボディパーサ:要求ボディの Brotli を展開します
・@fastify/compress:要求の展開を有効にしている場合に対象です
・組み込み fetch():応答の Brotli を既定で展開します。攻撃者が内容に影響できる URL を取得しているコードも対象です

逆に、素の Node HTTP サーバー(フレームワーク無しで http を使うだけ)は、受信した Brotli を自動展開しません。「要求や応答で Brotli を自動展開しているか」が、露出を見分ける最初の問いです。

直す:Brotli を上流の修正版へ(npm の brotli ではない)

FIX THE RIGHT THING勘違いしやすい点

直すのは同梱の上流 Brotli、npm の別物ではない

こう思いがち

実際は

こう思いがち: npm の brotli パッケージを上げれば直る

実際は: それは別物。バグは同梱の上流 Brotli。ランタイム/ライブラリの更新で

こう思いがち: どれか1つ直せば全部安全

実際は: 同梱する各コンシューマ(Node・Bun・各ライブラリ)が個別に更新

こう思いがち: HTTP/2 の脆弱性だ

実際は: HTTP/2 とは無関係。HTTP で Brotli を展開する所が入口という語呂

出典: Aikido・Cycode(2026-10-24 確認)。Brotli の修正版は 1.0.10 / 1.1.1 / 1.2.1

直す対象は、ランタイムやライブラリが同梱・利用している上流の Brotliです。Node.js なら本体を 22.23.4 / 24.22.1 / 26.12.1 以上へ上げれば、同梱 Brotli が修正版に差し替わります。いちばん間違えやすいのが、npm にある brotli という名前のパッケージを上げてしまうことです。これは今回の脆弱な部品ではなく、上げてもランタイムの同梱 Brotli は変わりません。確認は版の比較で、環境ごとに見ます。

# Node の版(修正版 22.23.4 / 24.22.1 / 26.12.1 以上か)
node --version

# Node が同梱する Brotli の版を直接見る(1.0.10 / 1.1.1 / 1.2.1 以上なら対応済み)
node -p "process.versions.brotli"

これは判定ではなく構成の確認で、この結果だけでは安全とは言えません。利用しているライブラリが独自に Brotli を展開している場合など、この2つだけでは拾い切れないからです。確実なのは、各環境でランタイムを修正版へ上げ切ることです。

当サイトで確かめたこと(2026-10-24)

この記事を書いた環境の Node.js は v22.22.0 で、修正版 22.23.4 より前でした。さらに node -p "process.versions.brotli" を実行すると 1.1.0 と表示され、影響範囲 1.0.3〜1.2.0 の内側かつ修正版 1.1.1 より前、つまり同梱の上流 Brotli も脆弱な版でした。ここで大事なのは、脆弱な部品は npm の brotli パッケージではなく、ランタイムが内部に持つ上流 Brotliであり、その版は process.versions.brotli で直接確かめられる、という点です。脆弱性を発動させる細工した Brotli は一切作っていません。

まとめ:1つの上流ライブラリ、大きな影響範囲

HTTP2Shell という派手な名前がついていますが、中身は「node2shell と同じ Brotli のバグが、Node.js だけでなく、その Brotli を同梱・利用する多くの HTTP スタックに及ぶ」という話です。新しい脆弱性でも、HTTP/2 の問題でもありません。重要なのは、1つの上流ライブラリを多くのものが取り込んでいると、その1つの不具合が一気に広がること、そして同梱している各自が上流の修正版を取り込まないと直らないことです。

やることは派手ではなく、ランタイムとライブラリを修正版へ上げ切ること、そして影響を受ける部品の更新情報を追い続けることです。同じ「ランタイムの処理が入口になる」構図はNode2shellやRuby の Onigmo の件とも地続きで、使っている基盤を最新に保つことが、結局いちばん効く備えになります。

参照ソース

・Node2Shell evolves into HTTP2Shell(Aikido) — HTTP2Shell の命名と影響範囲(研究元・2026-10-24 確認)
・node2shell (CVE-2026-111497): What to Patch and How to Find Exposed Services(Cycode) — 影響する Brotli の版・Express/Koa/Fastify の露出・npm の brotli は別物
・Node.js October 2026 Security Releases(公式ブログ) — CVE-2026-111497 と Node の修正版
・Node2shell(Node.js 同梱 Brotli デコーダのRCE・当サイト) — Node を主役にした捉え方と fetch/Express の露出