自社のアプリ、Web サイト、オンラインストア、API が Node.js で開発されているなら(Next.js のサイトや、Express や NestJS で作られたバックエンドを含みます)、今日中に開発者に依頼して Node.js をバージョン 22.23.4、24.22.1、26.12.1 のいずれかに更新し、その後サーバーを再ビルドして再起動してください。Node.js プロジェクトは 2026年10月21日にこれらのバージョンを公開し、Node2Shell(CVE-2026-111497)と呼ばれる脆弱性を修正しました。評価は 10 点満点中 9.2 で、パスワードを一切持たない攻撃者でも、細工した圧縮データを送るだけでサーバー上でコードを実行できます。サウジアラビア国家サイバーセキュリティ庁(NCA)は危険度「非常に高い」の警報を出し、10月27日には米国のサイバーセキュリティ機関 CISA が、この脆弱性が実際の攻撃に悪用されていることを確認しました。
何が起きたのか?
脆弱性は Brotli にあります。Brotli は Web サーバーとブラウザーがやり取りするデータを小さくするための圧縮形式で、Node.js には Google が開発した Brotli デコーダーのコピーが組み込まれています。Node.js のセキュリティ情報によると、不正な形式の圧縮データを受け取ると、デコーダーが内部バッファーの末尾を越えて書き込んでしまい、アプリのクラッシュ、メモリ内容の漏えい、あるいは攻撃者によるコード実行につながるおそれがあります。セキュリティ情報は、この脆弱性の報告者を OpenAI の Codex Security チームとしており、同じリリースでは合計 10 件の脆弱性が修正され、そのうち 4 件の深刻度が「高」でした。
その後の展開は速いものでした。修正の翌日の10月22日、Imperva のレッドチームが、公式の Node.js 24.22.0 イメージ上で、日常的な二つの経路を使ってコードを実行しました。組み込みの fetch() 関数と、Express 5 が処理するリクエストボディです。10月26日には ELLIO が、公開済みの攻撃コードを含む実際の攻撃トラフィックを記録しました。10月27日、CISA はこの脆弱性を、実際に悪用されている脆弱性のカタログに追加しました。
不具合そのものは古いものです。CVE の記録によると、影響を受けるのは Brotli 1.0.3 から 1.2.0 までのバージョンです。OpenAI によれば、根本原因は 2026年2月の時点で Brotli のソースコード上ですでに修正されていましたが、それがセキュリティ上の欠陥だとは誰も気づかず、新しいバージョンも公開されないまま、10月21日に Brotli 1.2.1 が出るまで放置されていました。聞き覚えがあるとすれば、それもそのはずです。先週、私たちは PHP と WordPress のサーバーを開いてしまった脆弱性 PHP2Shell を取り上げました。Node2Shell は、JavaScript で作られたアプリにとって同じ種類のリスクです。
自社のアプリは影響を受けますか?
Node.js は、現代の Web サイト、モバイルアプリのバックエンド、管理画面、API のかなりの部分でサーバー側を動かしています。ここ数年のうちに制作会社やフリーランスの開発者があなたのシステムを作ったのであれば、知らないうちに Node.js 上で動いている可能性は高いでしょう。影響を受けるのは、修正版より前の 22.x、24.x、26.x 系列に加え、サポートが終了した 20.x、23.x、25.x 系列です。Node.js プロジェクトによれば、サポート終了済みの系列は常に影響を受け、修正も提供されません。
Node.js を使っているだけで攻撃を受けるわけではありません。攻撃者のデータを何かがデコーダーに渡す必要があります。研究者は、よくある経路として次の三つを挙げています。
- 外から届く圧縮リクエスト。Express 5、body-parser 2、Koa のリクエストボディ解析機能は、Brotli 形式で圧縮されたボディを、あなた自身のコードが動く前に自動的に展開します。
- サーバーが外部から取得するコンテンツ。リンクのプレビュー、Webhook、クローラー、Web ページを読み込む AI エージェントのように、アプリが外部のリンクを開く場合、悪意あるサイトが細工した圧縮データで応答することができます。Node の組み込み fetch() 関数、axios、Next.js などのフレームワークでのサーバー側リクエストは、それを自動的に展開します。
- ユーザーがアップロードするファイル。顧客や訪問者が送ってきた Brotli データを展開するあらゆるコード。
リスクは Node.js だけにとどまりません。NCA の警報は Python、Bun、Envoy も挙げており、マイクロソフトは10月25日に .NET 8、9、10、11、Visual Studio 2019、2022、2026、PowerShell 7.4 から 7.6 向けの修正を公開し、.NET についてはこの脆弱性を「緊急」と評価したうえで、悪用可能性を「Exploitation More Likely」としています。マイクロソフトは、.NET では Brotli の展開機能が既定で有効になっていないため、影響を受けるのはこの機能を有効にしたアプリだけだと説明しています。
サイトを Vercel でホストしている場合、同社はセキュリティ情報の中で、Node.js が修正を公開したその日のうちに、外から入ってくる攻撃経路を遮断するファイアウォールルールを全プロジェクトに展開し、10月28日以降の新しいデプロイはすべて修正済みの Node.js を使っていると説明しています。既存のプロジェクトは再デプロイが必要で、まだ Node.js 20 を使っているプロジェクトは 22 か 24 に切り替える必要があります。
今日やるべきこと:五つの手順
- 書面で一つ質問する。当社のサーバーと Docker イメージの中では、どの Node.js のバージョンが動いているか。開発者に、node -v コマンドで Node.js のバージョン番号を確認してもらいましょう。Brotli のバージョン表示は当てにしないでください。ELLIO によると、修正済みのビルドでも未修正のビルドでも同じく 1.2.0 と表示されます。
- 修正版に更新する。22.23.4、24.22.1、26.12.1 のいずれかです。20.x、23.x、25.x を使っている場合は、22 や 24 などサポート中の系列に移行し、本番公開の前にテストしてください。
- 再ビルドして再起動する。実行中のプロセスは古いコードのまま動き続けます。修正済みのベースイメージでコンテナイメージを再ビルドしてください。24.22.0 に固定された Dockerfile は、誰かがその行を書き換えるまで脆弱なビルドを配布し続けるからです。ステージングサーバー、ビルドパイプライン、サーバーレス関数も確認しましょう。
- ほかのコピーも更新する。Python の Brotli と brotlicffi パッケージ(バージョン 1.2.1 と 1.2.1.0)、Bun、Envoy、お使いの Linux ディストリビューションの Brotli ライブラリ、そしてマイクロソフトの10月25日の更新による .NET です。
- ログとクラッシュファイルを確認する。異常に大きな Brotli 圧縮リクエストや、プロセスの繰り返しのクラッシュがないか調べてください。ELLIO は、失敗した攻撃の多くがプロセスをクラッシュさせること、そしてクラッシュファイルに訪問者のセッション Cookie や鍵が残る可能性があることを警告しています。クラッシュファイル(core dumps)を読める人と保存期間を制限しましょう。
今日更新できない場合
一時的な対策として、アプリに必要がなければ、フロントエンドのサーバーやファイアウォールで Content-Encoding: br ヘッダーが付いた受信リクエストを遮断してください。Vercel と Imperva はこの脆弱性向けのファイアウォールルールを追加しましたが、Vercel 自身も、ファイアウォールではサーバーが他のサイトから取得する応答までは防げず、その経路を閉じられるのは Node.js の更新だけだと強調しています。どんな防御層も、更新の代わりではなく、時間を稼ぐ手段だと考えてください。
Origami の見解
一か月のうちに Web の土台で二つの重大な脆弱性、まず PHP2Shell、続いて Node2Shell が見つかったことは、はっきりした教訓を示しています。チームが書いたコードに問題がなくても、その下で動く実行環境が開いたままになっていることがあるのです。Node2Shell の修正は、それがセキュリティ上の問題だと誰かが理解するまで、約八か月も Brotli のソースコードの中に眠っていました。そして詳細が公開されると、研究者は一日で公式ビルド上でコードを実行してみせました。多くの企業で私たちが目にするのは、何年も前に納品され、更新の担当者がおらず、Node.js が実際にどこで動いているかの一覧もないアプリです。もし当てはまるなら、今日その一覧づくりから始めてください。Origami は Web アプリやシステムを開発しており、その多くが Node.js や Next.js で動いています。私たちは初日からその実行環境の更新を見守っています。アプリの点検や、停止なしでの Node.js のアップグレードをご希望なら、お問い合わせください。
出典
- サウジアラビア国家サイバーセキュリティ庁(NCA):Brotli 警報 第 2026-7959 号
- Node.js:2026年10月21日のセキュリティリリース
- GitHub の Google Brotli:バージョン 1.2.1 のリリースノート
- CVE.org:CVE-2026-111497 の記録、影響を受けるバージョンと評価 9.2
- CISA:悪用されている脆弱性二件をカタログに追加、2026年10月27日
- マイクロソフト セキュリティ レスポンス センター:CVE-2026-111497
- Vercel:Node.js に関するセキュリティ情報
- Imperva レッドチーム:Node2Shell、Brotli データからコード実行まで
- ELLIO:実際の攻撃における Node2Shell の悪用
- SecurityWeek:マイクロソフト、Node.js、Python パッケージでの修正
よくある質問
会社のサイトが Next.js で作られている場合、Node2Shell の影響を受けますか?
受ける可能性があります。Next.js は Node.js の上で動き、サーバー側のリクエストは脆弱なデコーダーを通ります。Vercel では10月28日以降の新しいデプロイが修正済みの Node.js を使うため、再デプロイすれば十分です。自社でホストしている場合は、Node.js を 22.23.4、24.22.1、26.12.1 のいずれかに更新してください。
Node2Shell を修正した Node.js のバージョンはどれですか?
2026年10月21日に公開された 22.23.4、24.22.1、26.12.1 です。20.x、23.x、25.x 系列はサポートが終了しており修正は提供されないため、22 か 24 に移行してください。
自社のアプリがどの Node.js のバージョンで動いているか、どうすれば分かりますか?
開発者に、サーバー上と各 Docker イメージの中で node -v を実行し、結果を書面で送ってもらってください。Brotli のバージョン表示は当てにしないでください。修正済みでも未修正でも同じく 1.2.0 と表示されます。
更新の代わりに Web アプリケーションファイアウォール(WAF)で十分ですか?
いいえ。WAF は外から届く悪意ある圧縮リクエストを遮断できますが、サーバーが他のサイトから取得する応答までは防げません。Vercel と Imperva はこの脆弱性向けの WAF ルールを追加しましたが、両社とも顧客に Node.js の更新を求めています。
GoogleでOrigamiをフォロー
Origamiを優先ソースに追加すると、Google検索やトップニュースで私たちの記事が優先的に表示されます。








