OWN NEWS GATHER
← 戻る
The Hacker News

Node.jsのBrotli処理に深刻な脆弱性、公式標準環境でのリモートコード実行が実証される

要点

  • セキュリティ企業Impervaが、公式Node.js環境で任意のコードを実行できる実証手法「Node2Shell」を公開した。

  • 脆弱性(CVE-2026-111497)は同梱のBrotliデコーダーに存在し、22.x、24.x、26.x系統が影響を受ける。

  • Express 5のリクエスト本文展開や組み込みfetchなど、HTTP通信の送受信双方から攻撃が成立することが確認された。

  • Node.jsプロジェクトは10月21日に修正版をリリース済みであり、ランタイム内の回避策はないため速やかな更新が推奨されている。

  • セキュリティ企業のImpervaは、公式配布されているNode.js環境において、細工されたBrotli圧縮データを介して遠隔から任意のコードを実行できる実証手法「Node2Shell」を発表した。この問題はNode.jsに標準で組み込まれているBrotliデコーダーの欠陥(CVE-2026-111497)に起因するもので、Node.jsプロジェクトは2026年10月21日に修正版を公開している。過去の検証と異なり、意図的な弱体化やデバッガを用いない標準的な実行環境でコード実行が再現されたという。

公式イメージ上で再現された「Node2Shell」

公開された概念実証(PoC: 脆弱性の悪用可能性を示す検証手法)「Node2Shell」は、Linux arm64(64ビットARMアーキテクチャ)向けの公式Node.js 24.22.0イメージ上で実行された。デバッガの接続やテスト用のビルド改変などを一切行わない標準環境に対し、細工したBrotli(Googleが開発した高効率なデータ圧縮形式)データを読み込ませることで、攻撃者が指定したコードの実行に成功したと報告されている。

実証テストにおいてコード実行は毎回確実に成功したわけではなく、成立までに数回の試行を要したとされる。また、検証は特定の単一構成のみで行われており、他のCPUアーキテクチャや別ラインでの動作はテストされていない。修正版として公開された24.22.1では同一データが正常に拒絶され、コード実行は発生しなかったという。先行する他者の検証では意図的にセキュリティを弱めたテスト環境でしかコード実行に至らず、標準環境では異常終了や部分的なメモリ読み取りにとどまっていたため、今回の実証は標準ビルドに対する攻撃可能性をより具体的に示した。なお、10月22日時点で実環境での悪用は報告されていないと説明されている。

影響を受けるバージョンと通信の侵入経路

今回の欠陥は同梱されているBrotliデコーダーそのものに存在するため、テストされた単一のビルドだけでなく、Node.js 22.x、24.x、26.xの各サポートライン全般が影響を受ける。

デコーダーへ到達する経路は、HTTP通信の送受信における双方向で想定されている。1つはNode.js組み込みの fetch() などを利用して外部から取得したBrotli圧縮レスポンスを読み込む経路、もう1つはミドルウェアを介してBrotli圧縮されたリクエスト本文を展開する経路である。標準のHTTPサーバー自体は受信した圧縮データを自動展開しないが、広く使われているWebフレームワーク「Express 5」の各種ボディパーサー(本文解析機能である express.json() や express.urlencoded() など)はBrotliの自動展開に対応している。Impervaは、Express 5.0.0〜5.3.0およびbody-parser 2.0.0〜2.3.0の環境において、リクエストとレスポンスの双方の経路からコード実行が可能であることを確認したとしている。

ストリームの誤認によるバッファ外書き込み

Impervaの分析によると、脆弱性の原因はBrotliストリーム処理における異常状態の取り扱いにある。データ構造上あり得ない不正なブロック変更を含む入力を受け取った際、脆弱なデコーダーがこれを「追加データの要求」と誤認し、無効な状態のまま処理を継続してしまったという。

メモリ検査ツールを用いた検証では、この無効な状態から処理を強行した結果、あらかじめ確保された領域を越えて書き込みを行う「バッファ外書き込み(Out-of-bounds write)」が発生することが判明した。これが任意のコード実行につながる要因となった。Node.js開発チームは、アップストリームであるGoogleのBrotliリポジトリからパッチを取り込み、該当箇所で処理を継続せずフォーマットエラーとして中断するよう修正を施した。

修正版への更新と暫定的な防御対応

脆弱性を解消するための手段は、パッチ適用済みのバージョン(24.22.1など)へ更新することである。Node.js内部に代替となる回避策は用意されておらず、サポート終了済みの20.x以前にはパッチが提供されないため、サポート対象ラインへの移行が必要となる。また、パッケージ一覧で見落とされがちなコンテナイメージ内のバイナリなどにも更新の適用が求められる。

即時更新が困難な場合の暫定措置として、Impervaは信頼できないBrotliトラフィックの制限を提案し、自社のWebアプリケーションファイアウォール(WAF)に防御ルールを追加した。また、Vercelも受信リクエストに含まれる攻撃パターンを遮断するルールを10月21日に導入したが、外部から取得するレスポンスの展開までは保護されないと説明している。

補足

Node.jsに組み込まれた低レイヤーの展開処理であっても、標準APIやフレームワーク経由で外部入力が到達すれば重大な攻撃経路となり得る。

元URL