Node.jsのセキュリティ上の欠陥により、悪意のある圧縮データがリモートコード実行(RCE)につながるおそれがあります。研究者は、改変されていない標準のランタイムに対する攻撃を実証しました。信頼できないBrotliデータを処理するアプリケーションには、懸念が高まっています。
Impervaは2026年10月22日、概念実証「Node2Shell」を公表しました。Linux arm64上で動作するNode.js 24.22.0でコード実行に成功したとしています。この脆弱性はCVE-2026-111497として追跡されており、Node.jsのリリースライン22、24、26が影響を受けます。セキュリティ修正は10月21日に公開されました。
Expressミドルウェアや、Node.js組み込みのfetch() APIを使うアプリケーションは、脆弱なデコーダーを直接呼び出していなくても、そこに行き着く可能性があります。影響の有無は、攻撃者が制御するBrotliデータが該当コードに到達するかどうかで決まります。
Node2Shellの影響範囲は独自の解凍コードにとどまらない
Node2Shellは、Node.jsに同梱されるBrotliデコーダーの境界外書き込みを悪用します。不正な形式の圧縮データを入力すると、メモリが破壊され、クラッシュや情報漏えい、コード実行を招くおそれがあります。関連するメモリ安全性のリスクは、OpenSSLのセキュリティアップデートのきっかけにもなりましたが、脆弱性の仕組みは異なります。
Akamaiの10月26日付の分析によると、CVSS v4.0スコアは9.2(クリティカル)です。一方、Node.jsは重大度を「高(high)」と評価しています。
Impervaの調査によると、影響を受ける経路は次の3つです。
- Express 5のミドルウェア:設定済みのリクエストパーサーが、Brotliでエンコードされたリクエストボディを解凍する場合があります。
- Node.jsの
fetch():信頼できないサーバーから返された悪意あるBrotliレスポンスを、アプリケーションが解凍する場合があります。 node:zlib:攻撃者が制御するBrotliストリームを直接解凍するサービスは、脆弱なデコーダーに到達する可能性があります。
watchTowrのプリンシパル脅威インテリジェンススペシャリストであるYordan Ganchev氏は、「このバグは実装に依存するもので、Node.jsを稼働させているすべてのサーバーが初期状態で影響を受けるわけではありません」と述べています。
Ganchev氏は、依存ライブラリが見落とされがちな解凍経路を持ち込む可能性があると警告しています。同様の依存関係のリスクは、WordPressのHEICアップロード脆弱性でも表面化しました。画像処理ソフトウェアが、サーバーをRCEの危険にさらしたものです。
ImpervaによるLinux arm64での実証には、複数回の試行が必要でした。研究者は、他のプラットフォームで同等のエクスプロイトの信頼性を確認していません。ただし、根本的な脆弱性はLinux arm64に限られたものではありません。
修正済みNode.jsバージョンと優先すべき緩和策
Node.jsのセキュリティアドバイザリは、次の修正版を示しています。
| Node.jsのブランチ | 修正済みの最小バージョン |
|---|---|
| 22.x | 22.23.4 |
| 24.x | 24.22.1 |
| 26.x | 26.12.1 |
組織は、該当するパッチ適用済みリリースか、それ以降の修正版を導入する必要があります。サポート対象外の環境は、サポート対象のブランチへ移行しなければなりません。ExpressやResponse body-parserだけを更新しても、ランタイムの欠陥は解消されません。
セキュリティチームは、次の6つの対策を優先してください。
- 影響を受けるアプリケーションの棚卸し:サーバー、コンテナ、サーバーレスのワークロード全体でNode.jsのバージョンを確認します。Express、
fetch()、node:zlibの解凍経路を洗い出します。 - パッチ適用とデプロイの検証:ランタイムをアップグレードし、影響を受けるコンテナイメージを再ビルドします。本番プロセスがパッチ適用済みのバイナリを使っていることも確認します。
- 不要な解凍の無効化:圧縮されたリクエストボディが不要な場合は、Expressのbody-parserの
inflateオプションをfalseに設定します。 - 信頼できないトラフィックの制限:必要に応じて、受信する
Content-Encoding: brのリクエストを一時的にブロックし、不要な外部向け通信を制限します。受信側のフィルタリングでは、fetch()のレスポンスは保護できません。 - 侵害の影響範囲の限定:サービスを分離し、アプリケーションの権限、ファイルシステムへのアクセス、クラウドの認証情報を制限します。
- 監視とインシデント対応計画のテスト:原因不明のクラッシュ、解凍エラー、想定外の子プロセス、不審な接続を調査します。アプリケーションとネットワークのログを突き合わせ、インシデント対応計画をテストします。
境界でのフィルタリングは、一時的な防御にすぎません。過去のPeopleSoftのWAFバイパス攻撃では、パッチ適用の代わりにフィルタリングに頼ると、脆弱なシステムが危険にさらされたままになることが示されました。
Ganchev氏は、「Decompression failed」を含むログを調べるよう推奨しています。ただし、このようなエラーがあっても、悪用された証拠にはなりません。セキュリティチームは、信頼できないBrotliデータを処理しているアプリケーションを特定し、パッチ適用済みのNode.jsランタイムが本番環境で動作していることを確認する必要があります。
関連記事:10月に2度目となるGitLabの重大なRCEパッチは、以前の修正を適用した後でも、管理者がセキュリティリリースを確認し続けるべき理由を示しています。
翻訳元: https://www.esecurityplanet.com/news/news-node2shell-rce-nodejs-security-patches/