node2shell は、2026年10月に公表された Node.js の脆弱性 CVE-2026-111497 に付いた通称です。中身は、Node.js が内部に同梱する Brotli デコーダの境界外書き込み(out-of-bounds write)で、細工した Brotli(圧縮データの形式)を復号させると、デコーダがバッファの外に書き込み、条件によってはプロセスのメモリ開示からプロセスの権限でのコード実行に至りうると報告されています。怖いのは、特別な設定をしていなくても、組み込みの fetch() や Express 5 が攻撃者の Brotli を自動で展開してしまう点です。依存パッケージの脆弱性の取り込み方を含めた全体像は、サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説にまとめています。この記事は、どこから攻撃者の Brotli が入るか・なぜメモリが壊れるのか・PoC の実際・各環境の直し方を、Node.js の告知と研究者の解説で裏を取って整理します。

NODE2SHELL何が起きたか

同梱 Brotli デコーダの境界外書き込みが RCE になりうる

  1. 10/21

    Node.js がセキュリティリリース

    10件修正。最重大が Brotli RCE(CVE-2026-111497・High)

  2. 修正版

    22.23.4 / 24.22.1 / 26.12.1

    22・24・26 系に影響。20系以前は EOL で修正なし

  3. 解説

    Imperva が node2shell を公表

    上流 Brotli の修正を Node が取り込んで対処

  4. PoC

    公式の脆弱版で実行を実証

    修正版は同じ入力を拒否。成功は複数回の試行を要した

  5. 10/22

    実環境での悪用は報告なし

    とはいえ版を上げるのが唯一の確実策

出典: Node.js セキュリティリリース告知(2026-10-21)、Imperva Node2Shell(公式 24.22.0 Linux arm64 イメージで実行、2026-10-23 確認)

30秒でわかる

  • ・何が:Node.js 同梱 Brotli デコーダの境界外書き込み(CVE-2026-111497・High)。メモリ開示〜コード実行の恐れ
  • ・どこから:組み込み fetch() が応答を、Express 5・body-parser が要求ボディを既定で Brotli 展開する
  • ・直し方:Node.js を 22.23.4 / 24.22.1 / 26.12.1 以上へ。同梱分なので Node 本体を上げる
  • ・実際:Imperva が公式の脆弱版で実行を実証(成功は複数回の試行)。実環境の悪用報告は無いが、更新が唯一の確実策

まずやること

・node --version が 22.23.4 / 24.22.1 / 26.12.1 以上か確認し、低ければ更新する
・npm ls express body-parser で Express 5.0〜5.3/body-parser 2.0〜2.3 を使っていないか確認する
・コンテナや CI の各環境にも同じ Node が入る。環境ごとに上げる

Node2shell(CVE-2026-111497)で何が起きたか

Brotli は、HTTP の通信などで使われる圧縮方式のひとつです。Node.js は Brotli の展開機能を標準モジュール(node:zlib)として内蔵しており、その実装に Google の Brotli ライブラリを同梱しています。今回の脆弱性は、この同梱されたデコーダが、壊れた(あるいは細工された)Brotli データを渡されたときに、バッファの範囲を超えて書き込んでしまうものです。

Node.js プロジェクトは2026年10月21日のセキュリティリリースで、この Brotli の境界外書き込みを含む10件を修正しました。報告者は Matteo Collina、修正は上流 Brotli の該当コミットを Node.js が取り込む形で行われています。深刻度は各系の最高で High(Critical ではない)と位置づけられています。

項目 内容 状態
脆弱性 同梱 Brotli デコーダの境界外書き込み(CVE-2026-111497) Node.js 公式・High
影響する系 22.x・24.x・26.x Node.js 公式
修正版 22.23.4 / 24.22.1 / 26.12.1 Node.js 公式
20.x 以前 EOL(修正は出ない) Node.js 公式
実環境での悪用 報告なし(2026-10-22 時点) 報道

別の brotli パッケージを上げても、Node.js が内部に抱えるデコーダは差し替わりません。直すには Node.js 本体を修正版へ上げる必要があります。これは先日の pip をいますぐ26.2.2へ更新(eMudhra 弱鍵CA)と同じ構図で、「ツールが内部に同梱した部品」は、その親ツールを上げないと直りません。

どこから攻撃者の Brotli が入るか:fetch・Express 5・body-parser

node2shell の実害を左右するのは、「攻撃者が制御できる Brotli データを、アプリが知らないうちに展開するか」です。ここが、脆弱性そのものより重要な実務上の分かれ目になります。

ATTACK SURFACE攻撃者のBrotliが入る経路

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

  1. 攻撃者が細工した Brotli

    応答 or 要求ボディに仕込む

  2. fetch() が自動展開

    組み込み fetch は Brotli 応答を既定で復号

  3. Express5・body-parser も

    Express 5.0〜5.3/body-parser 2.0〜2.3 は要求ボディを復号

  4. 同梱デコーダが境界外書き込み

    不正な内部状態のまま続行→メモリ開示〜コード実行

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

主な露出経路は次の2つです。

・組み込みの fetch():Node.js の組み込み fetch は、応答の Brotli を既定で展開します。外部 API や、攻撃者が内容に影響を与えられる URL を fetch しているアプリは、応答経由で細工 Brotli を踏みえます
・Express 5・body-parser:Express 5.0.0〜5.3.0、および body-parser 2.0.0〜2.3.0 は、要求ボディの Brotli を展開します。攻撃者が Content-Encoding: br を付けた細工ボディを送るだけで、サーバー側で展開が走ります

逆に、素の Node HTTP サーバー(フレームワークなしで http を使うだけ)は、受信した Brotli ボディを自動展開しません。この経路では露出しません。つまり「fetch を使っているか」「Express 5 系・body-parser 2 系でボディを受けているか」が、自分の露出を見分ける最初の問いになります。

なぜ Brotli データでメモリが壊れるのか:仕組みの要点

攻撃の再現ではなく、「なぜ壊れるのか」の要点だけを押さえます。Imperva の解説によると、問題のデコーダは、Brotli ストリームの構造上は起こり得ないはずのブロックの切り替わりを越えて処理を続けてしまいます。本来ならそこで「入力の構造がおかしい」と判断すべきところを、デコーダは「入力がまだ足りない要求」とみなして、不正な内部状態のまま先へ進みます。その結果、想定したバッファの範囲を超えて書き込みが起き、これが境界外書き込みになります。

WHY IT BREAKSなぜメモリが壊れるか

あり得ない切り替わりを「入力不足」と誤認して続行する

  1. あり得ないブロック切替

    ストリーム構造上は起こらないはず

  2. 「入力不足」と誤認

    エラーにせず処理を続ける

  3. 不正な内部状態のまま

    デコードを先へ進める

  4. バッファ外へ書き込み

    境界外書き込み=メモリ破壊

出典: Imperva の解説。修正版は不正フォーマットを検出して呼び出し元に返す(2026-10-23 確認)

メモリ破壊そのものは、まずプロセスのメモリの開示(本来読めない領域の内容が漏れる)や、プロセスのクラッシュとして現れます。そこからさらに書き込みを制御できれば、プロセスの権限でのコード実行につながりうる、という段階構造です。修正は、この「起こり得ない切り替わりで続行してしまう」挙動を上流 Brotli 側で正し、それを Node.js が取り込んだものです。修正版は、同じ不正な切り替わりをフォーマットエラーとして検出し、処理を止めて呼び出し元に返します。

自分が影響を受けるか確認して直す

確認は版の比較が中心です。コンテナ・CI・本番でそれぞれ別の Node.js が入るので、環境の数だけ見ます。

# Node.js の版が修正版以上か(22.23.4 / 24.22.1 / 26.12.1 以上なら対応済み)
node --version

# Brotli 要求ボディを展開する版の Express / body-parser を使っていないか
npm ls express body-parser 2>/dev/null

修正版以上で、Express 5.0〜5.3/body-parser 2.0〜2.3 に該当しなければ、この経路の心配はほぼありません。これは判定ではなく構成の確認で、この結果だけでは安全とは言えません。fetch を間接的に使うライブラリや、独自に node:zlib で Brotli を展開している箇所までは、この2コマンドでは分かりません。確実なのは、各環境で Node 本体を修正版へ上げ切ることです。

WHAT TO DO対応

Node 本体を上げ、自動展開する入口を点検する

  1. 1.Node.js を修正版へ

    22.23.4 / 24.22.1 / 26.12.1 以上。20系以前は保守版へ移行

  2. 2.Express・body-parser を確認

    Express 5.0〜5.3/body-parser 2.0〜2.3 なら更新

  3. 3.同梱 Brotli は単体更新では直らない

    別の brotli ライブラリを上げても Node 同梱分は変わらない

  4. 4.WAF・経路制限は時間稼ぎ

    更新までの緩和であって、更新の代わりにはならない

出典: Node.js 告知、Imperva・Vercel の緩和案内(2026-10-23 確認)

直す順番は図のとおりです。Node 本体を修正版へ上げるのが本筋で、EOL の20系以前は保守中の系へ移行します。すぐに上げ切れない間は、WAF で既知の攻撃パターンを弾く、該当経路で信頼できない Brotli トラフィックを制限する、といった緩和で時間を稼げますが、これらは更新の代わりにはなりません。依存の更新を日頃から回す仕組みは、RenovateとDependabotで依存の供給経路を守るにまとめています。

node2shell の PoC と実環境の悪用:どこまで確実か

「どこまで確認されたか」を、研究元の一次情報で押さえます。Imperva Red Team は、公式の脆弱な Node.js 24.22.0(Linux arm64)イメージを使うアプリで、Brotli データに乗せたコードを実際に実行できたと報告しています。デバッガや計装(instrumented)バイナリは不要で、素の公式イメージが対象でした。同じ入力を修正版 24.22.1 に与えると拒否され、コードは実行されず、サーバーも動き続けたとしています。原因の調査にはメモリサニタイザを別途使ったものの、それは「なぜ境界外書き込みが起きるか」を説明するためで、コード実行の実証自体には使っていない、と明記しています。

POC RESULT脆弱版と修正版の挙動

同じ入力で、脆弱版は実行・修正版は拒否

脆弱な 24.22.0

修正版 24.22.1

脆弱な 24.22.0: fetch 応答のコードが実行された

修正版 24.22.1: 同じ入力を拒否・実行なし

脆弱な 24.22.0: Express 5/body-parser 経由でも実行

修正版 24.22.1: 拒否。サーバーは動作を継続

脆弱な 24.22.0: デバッガや細工バイナリは不要

修正版 24.22.1: マーカーファイルは作られない

出典: Imperva Node2Shell(公式 24.22.0 Linux arm64 イメージ。成功は複数回の試行を要した、2026-10-23 確認)

検証は、組み込み fetch() が受け取る応答と、Express 5.0.0〜5.3.0/body-parser 2.0.0〜2.3.0 が受け取る要求ボディの両経路で行われ、どちらでも実行に至ったとされています。ただし Imperva 自身が、実行は毎回成功したわけではなく、成功までに複数回の試行を要したこと、検証は特定の Linux arm64 ビルドとアプリ構成に限ること、すべての Node ビルドやアプリを試したわけではないことを断っています。つまり「公式の脆弱版で実行は実証されたが、どんな環境でも一発で通るわけではない」というのが正確な読み方です。なお実環境での悪用は、2026年10月22日時点で報告されていません。

影響範囲としては、修正前の 22.x・24.x・26.x で、攻撃者の Brotli を展開する経路(fetch・Express 5・body-parser)を持つアプリが対象です。実行されるコードはプロセスの権限で動くため、Node を特権で動かしている環境ほど影響は大きくなります。調査の手がかりとして、復号中の不自然なプロセス終了やデコーダのエラーは着目点になりますが、それ単体では悪用の証拠にはならないので、動いている Node の版・アプリのログ・圧縮データの出所と突き合わせて判断します。実証済みの実行経路がある以上、修正は軽い(版を上げるだけ)のだから、待つ理由はありません。

参照ソース

・Node.js October 2026 Security Releases(公式ブログ) — CVE-2026-111497 を含む修正と対象版(2026-10-23 確認)
・Node2Shell: From Brotli Data to Remote Code Execution(Imperva) — 公式の脆弱版での実行の実証・根本原因・修正版での拒否(研究元の一次情報)
・Node.js Brotli Decoder Bug Could Allow Remote Code Execution(The Hacker News) — 公表の経緯と概要
・Node2shell: Node.js Brotli RCE(Aikido) — 露出経路と上流 Brotli 修正コミット
・Node.js 脆弱性|2026年10月セキュリティリリースのまとめ(当サイト) — 同リリース10件の全体と版の上げ方