はじめに
2026 年 3 月 24 日、Node.js プロジェクトは複数のセキュリティ脆弱性を修正するための重要なアップデートを公開しました。
今回のリリースには、プロセスをクラッシュさせてシステムを停止に追い込む 2 件の深刻な DoS(サービス拒否)脆弱性が含まれています。広く利用されているランタイムの基盤部分(TLS 処理や HTTP リクエスト処理)に起因する欠陥であるため、実稼働環境を運用するインフラエンジニアは早急な影響評価と対応が求められます。
本記事では、対象となる脆弱性のメカニズムを客観的に解説し、WAF などを活用した多層防御の視点から、実稼働環境へ安全にパッチを適用するためのアップデート手順について整理します。
- 2026 年 3 月のセキュリティリリースの概要と影響を受けるバージョン
- プロセスを停止させる 2 つの DoS 脆弱性の発生メカニズム
- WAF と Node.js の修正を組み合わせた多層防御アプローチ
- nvm や Volta 等を用いた安全なアップデートと依存関係の確認手順
2026年3月の Node.js セキュリティリリースの概要と影響範囲
今回のアップデートでは、合計 9 件(High: 2 件、Medium: 5 件、Low: 2 件)の脆弱性が修正されました。
対象となるバージョン(20.x〜25.x)と EOL バージョンへの注意喚起
影響を受けるアクティブなリリースラインは、25.x、24.x、22.x、20.x の 4 つです。これらのバージョンを利用している場合、直ちに提供された最新のパッチバージョン(v25.8.2、v24.14.1、v22.22.2、v20.20.2)へアップデートすることが推奨されます。
また、すでにサポートが終了している EOL(End-of-Life)バージョンについても、公式から以下のような重要な警告が発せられています。
参考: Tuesday, March 24, 2026 Security Releases
“It’s important to note that End-of-Life versions are always affected when a security release occurs. To ensure your system’s security, please use an up-to-date version as outlined in our Release Schedule.” (セキュリティリリースが発生した場合、サポート終了(EOL)バージョンは常に影響を受けることに注意することが重要です。システムのセキュリティを確保するために、リリーススケジュールに概説されている最新バージョンを使用してください。)
https://nodejs.org/en/blog/vulnerability/march-2026-security-releases
古いバージョンの Node.js を稼働させ続けている環境は、今回の DoS 攻撃に対してパッチが提供されないため、極めてリスクが高い状態に置かれます。
2 つの「High」レベル脆弱性(CVE-2026-21637、CVE-2026-21710)の概要
今回のリリースで特に警戒すべきは、以下の 2 つの「High(高)」重要度の脆弱性です。
- CVE-2026-21637(TLS 処理におけるリモート DoS)
-
TLS サーバーのエラーハンドリングに関する欠陥です。予期しない入力によって同期的な例外が発生した場合、エラーが捕捉されずに Node.js プロセス全体がクラッシュします。
- CVE-2026-21710(HTTP リクエスト処理における DoS)
-
__proto__という名前の HTTP ヘッダーを含む不正なリクエストを受信した際、アプリケーションが特定のプロパティ(req.headersDistinct)にアクセスすると、捕捉できない TypeError が発生してプロセスが停止します。
どちらの脆弱性も、攻撃者が細工したリクエストを外部から送信するだけで、サーバープロセスを強制終了させることができるという点で、サービスの可用性に直結する致命的な脅威となります。
DoS 攻撃のメカニズムとインフラ層を含む多層防御アプローチ
今回のアップデートで修正された CVE-2026-21637 や CVE-2026-21710 は、アプリケーションコード側の例外処理(try/catch など)をすり抜けて Node.js プロセス自体を終了させてしまう恐れがあります。
TLS エラーハンドリングと __proto__ ヘッダー処理の欠陥を突くクラッシュの手口
CVE-2026-21710 の例では、攻撃者が __proto__ という名前の HTTP ヘッダーを送信し、アプリケーション側で req.headersDistinct を参照した瞬間に問題が発生します。
内部でオブジェクトのプロトタイプが予期せず解決され、配列ではないオブジェクトに対して .push() メソッドが呼び出されることで、同期的な TypeError が発生します。
参考: Tuesday, March 24, 2026 Security Releases
“This exception is thrown synchronously inside a property getter and cannot be intercepted by error event listeners, meaning it cannot be handled without wrapping every req.headersDistinct access in a try/catch.” (この例外はプロパティゲッター内で同期的にスローされ、エラーイベントリスナーによってインターセプトできないため、すべての req.headersDistinct アクセスを try/catch でラップしない限り処理できません。)
https://nodejs.org/en/blog/vulnerability/march-2026-security-releases
アプリケーションの修正と WAF / ロードバランサーを活用した不正リクエストの遮断
根本的な解決には Node.js 本体のパッチ適用が必須ですが、すぐにアップデートを実施できない環境ではインフラ層での緩和策が求められます。
緊急の緩和策として、WAF(Web Application Firewall)や前段のリバースプロキシ(Nginx など)で __proto__ ヘッダーを含む不審なリクエストをドロップ(破棄)するルールを追加するアプローチが極めて有効です。また、TLS 終端(SSL オフロード)を前段のロードバランサーに任せ、Node.js プロセスに直接 TLS 処理を行わせないアーキテクチャにすることで、CVE-2026-21637(TLS 処理の DoS)のリスクをネットワーク層で無効化できます。

実稼働環境における Node.js アップデートのベストプラクティス
Node.js のアップデートは、アプリケーションの依存パッケージに影響を与える可能性があるため、慎重な手順を踏む必要があります。
バージョン管理ツール(nvm や Volta など)を用いた安全な切り替え手順
インフラエンジニアや開発チームは、OS の標準パッケージマネージャー(apt や yum など)で直接 Node.js を上書きするのではなく、nvm(Node Version Manager)や Volta といったバージョン管理ツールを使用して、環境ごとに安全にバージョンを切り替える運用が推奨されます。
パッチ適用前の依存関係(npm audit)確認と自動テストの重要性
今回のセキュリティリリースには、Node.js 本体の修正だけでなく、内部で利用されている undici などの主要な依存モジュールのアップデートも含まれています。
参考: Tuesday, March 24, 2026 Security Releases
“This security release includes the following dependency updates to address public vulnerabilities: undici(6.24.1, 7.24.4)on 22.x, 24.x, 25.x” (このセキュリティリリースには、公開された脆弱性に対処するための以下の依存関係の更新が含まれています: 22.x、24.x、25.x での undici(6.24.1、7.24.4))
https://nodejs.org/en/blog/vulnerability/march-2026-security-releases
マイナーなパッチバージョンアップであっても、依存関係の変更が予期せぬ動作不良(デグレ)を引き起こすリスクがあります。実稼働環境へデプロイする前に、ステージング環境で nvm install 22.22.2 のようにパッチバージョンを指定して切り替え、npm ci によるクリーンインストールと E2E(End-to-End)テストを実行して、アプリケーションの動作に影響がないことを確実に検証してください。
脆弱性の影響確認とパフォーマンス監視(オブザーバビリティ)
今回のアップデートには、単一のリクエストによるクラッシュ(CVE-2026-21710)だけでなく、大量のリクエストによってリソースを枯渇させる HashDoS やメモリリークの脆弱性も含まれています。
アプリケーションが影響を受ける条件の洗い出しとミニマムな検証アプローチ
すべての Node.js アプリケーションが等しく危険に晒されているわけではありません。例えば、V8(JavaScript エンジン)のハッシュ衝突を利用した HashDoS 脆弱性(CVE-2026-21717)の場合、外部入力をどのように処理しているかが影響の有無を分ける鍵となります。
参考: Tuesday, March 24, 2026 Security Releases
“The most common trigger is any endpoint that calls JSON.parse() on attacker-controlled input, as JSON parsing automatically internalizes short strings into the affected hash table.” (最も一般的なトリガーは、攻撃者が制御する入力に対して JSON.parse() を呼び出すエンドポイントです。JSON の解析により、短い文字列が影響を受けるハッシュテーブルに自動的に内部化されるためです。)
https://nodejs.org/en/blog/vulnerability/march-2026-security-releases
自社のコードベースを検索し、明示的に req.headersDistinct を参照している箇所や、巨大なペイロードに対してバリデーションなしで JSON.parse() を実行している API エンドポイントが存在しないか、静的解析ツール(Linter など)を用いて影響範囲を洗い出すアプローチが有効です。
Node.js プロセスの CPU・メモリ異常を検知するための監視設計
DoS 攻撃は予測不可能なタイミングで発生します。HTTP/2 のメモリリーク(CVE-2026-21714)や HashDoS によるパフォーマンス低下を早期に検知するためには、インフラ層でのオブザーバビリティ(可観測性)の確保が欠かせません。
Datadog や Prometheus などの APM(アプリケーションパフォーマンス管理)ツールを活用し、Node.js のイベントループ遅延(Event Loop Lag)のスパイクや、ヒープメモリの異常な増大を検知した際に、自動的にアラートを発報して該当のコンテナ(Pod)を切り離す監視設計を本番環境へ導入してください。これにより、パッチ適用前であっても被害の拡大を最小限に抑えることが可能になります。
まとめ
本記事では、2026 年 3 月に公開された Node.js の深刻な DoS 脆弱性と、実環境における対策について解説しました。
- EOL を含む古いバージョンは影響を受けるため、20.x 以上の最新パッチへ更新する。
- TLS や HTTP ヘッダー処理の欠陥を突き、プロセスをクラッシュさせる攻撃が存在する。
- WAF やロードバランサーを活用し、インフラ層で不正リクエストや TLS 処理を弾く。
- APM を導入してイベントループ遅延を監視し、nvm などで安全にパッチを適用する。
以上、最後までお読みいただきありがとうございました。
