Node.js 脆弱性
概要
Node.js 脆弱性とは、V8 エンジン基盤のサーバーサイド JavaScript ランタイムである Node.js コアと、その上に構築された npm パッケージエコシステム全体で見つかるセキュリティ欠陥の総称である。単一のランタイム欠陥が数百万のサービスに同時に影響し得ること、依存関係グラフが深いためサプライチェーン攻撃に特に脆弱であることが特徴である。したがって、コア更新、依存関係管理、アプリケーションのコーディング慣行という三重の防御が求められる。
主要内容
1. 脆弱性の分類
Node.js 関連の脆弱性は大きく三つの層に分かれる。第一はコアランタイム脆弱性で、Node.js 財団が直接パッチを当て、セキュリティリリースとして配布する。第二はnpm エコシステム脆弱性で、個々のパッケージメンテナーが対応し、推移的依存関係を通じて間接的に流入する。第三はアプリケーションコード脆弱性で、開発者のコーディング慣行に起因し、ランタイム自体は正常に動作する。
2. コアランタイム脆弱性
- HTTP リクエストスマグリングおよび HTTP/2 系攻撃: プロキシとバックエンド間のヘッダー解釈の差異を悪用する。CVE-2023-44487(HTTP/2 Rapid Reset)は多数の Node.js バージョンに影響した代表例である。
- コマンドインジェクション: CVE-2024-27980 は Windows 環境で
child_process.spawnが.bat/.cmdファイルを処理する際、引数検証が不十分で任意コマンド実行が可能だった欠陥である。 - プロトタイプ汚染(Prototype Pollution): オブジェクトマージロジックで
__proto__、constructor、prototypeキーがフィルタリングされず、グローバルプロトタイプが汚染される類型で、コアユーティリティとサードパーティライブラリの双方で繰り返し報告されている。 - パストラバーサル(Path Traversal):
fs、pathAPI の組み合わせで../シーケンスの検証が欠落した際に発生し、静的ファイルサーバー実装で頻繁に見られる。 - ReDoS: V8 の正規表現エンジンの特性上、指数的バックトラッキングが発生するパターンがイベントループを占有し、サービス全体を麻痺させる。シングルスレッドモデルのため影響が特に大きい。
- 権限モデル(Permission Model)の回避: Node.js 20 で導入された実験的権限モデルにおいて、ファイルシステム・子プロセスへのアクセス制御を回避する欠陥が複数回報告された。
3. npm エコシステムとサプライチェーンリスク
npm は数百万のパッケージが絡み合うグラフ構造であり、悪意あるパッケージの配布・タイポスクワッティング(typosquatting)・アカウント乗っ取りを通じたサプライチェーン攻撃の主要な標的である。過去の event-stream 事件、ua-parser-js および colors のアカウント乗っ取り事例、インストールスクリプト(preinstall、postinstall)を利用した認証情報窃取ワームの事例などが代表的である。また、依存関係混同(Dependency Confusion)、無期限に維持される旧バージョンの推移的依存関係、npm audit が検出できないロジックレベルの悪意あるコードも問題として指摘されている。
4. アプリケーションレベルの脆弱性
eval、new Function、vmモジュールの不適切な使用によるコード実行JSON.parseおよび逆シリアル化経路を通じたプロトタイプ汚染の伝播- JWT 検証の欠落、セッション固定、CORS の設定ミス
- イベントループのブロッキングによるサービス拒否(DoS)
http-proxy系ミドルウェアの設定不備による SSRF
5. 検出と対応
npm audit、npm audit fix、SCA(ソフトウェア構成分析)ツール、SBOM 生成、Dependabot・Renovate による自動更新、ESLint セキュリティプラグイン、--frozen-lockfile および lockfile のコミット、CI 段階での脆弱性ゲートが標準的な対応策として定着している。ランタイム面では、最新 LTS バージョンの維持、--experimental-permission(権限モデル)の有効化、コンテナの非 root 実行、--max-old-space-size およびリクエストサイズ制限の設定が推奨される。
最新動向
2024-2025年の最大の変化は権限モデルの成熟とサプライチェーンセキュリティの制度化である。Node.js 20 で実験的に導入された権限モデルが 22・23 ラインで安定化段階に入り、ファイルシステム・ネットワーク・子プロセスへのアクセスを宣言的に制限できるようになった。同時に npm レジストリはプロビナンス(provenance)証明と二要素認証の義務化を拡大し、SLSA フレームワークの導入と署名付きパッケージ配布が推奨事項として定着した。
また、2024年には Windows コマンドインジェクション(CVE-2024-27980)と HTTP/2 系サービス拒否問題が相次いでセキュリティリリースでパッチされ、2025年には悪意ある npm パッケージが大規模に流通し、トークン・認証情報を窃取するワーム型攻撃が報告されたことで、「依存関係の最小化」と「インストールスクリプトのブロック(--ignore-scripts)」が実務標準として強調された。さらに、AI コーディングアシスタントが生成したコードが検証なしに流入するようになり、自動生成コードのセキュリティレビュープロセスが新たな課題として浮上した。
関連トピック
- [[npm]]
- [[サプライチェーン攻撃]]
- [[プロトタイプ汚染]]
- [[ReDoS]]
- [[SBOM]]
- [[JavaScript]]
- [[オープンソースセキュリティ]]