2026年1月13日(米国時間)、Node.jsセキュリティチームは全リリースライン(v20.x / v22.x / v24.x / v25.x)を対象としたセキュリティアップデートを公開しました。修正されたCVEは深刻度High 3件・Medium 4件・Low 1件の計8件です。HTTP/2サーバーのクラッシュやBuffer未初期化メモリの漏えいなど、本番環境に直結する問題が含まれるため、該当バージョンを利用中の場合は速やかなアップデートが必要です。

2026年1月セキュリティリリースの経緯

当初のリリース予定日は2025年12月15日でした。しかし、パッチの開発が難航したことから12月18日に延期され、さらに年末休暇シーズンに重大なセキュリティリリースを行うと下流プロジェクトやユーザーの対応が遅れるという判断から、年明け2026年1月7日へ再度延期されました。1月7日にはCIテストの完了待ちで1月8日へ、最終的にはさらに調整が入り1月13日に正式リリースとなっています(出典: 窓の杜)。

当初の発表では修正対象を5件としていましたが、リリース時には3件が追加され計8件となりました(出典: Security NEXT)。延期を繰り返した分、パッチの品質とテスト範囲が十分に確保されたリリースといえます。

修正された全8件のCVE一覧

CVE ID深刻度概要影響バージョン
CVE-2025-55131HighBuffer.alloc / Uint8Arrayのレースコンディションによる未初期化メモリ露出20.x, 22.x, 24.x, 25.x
CVE-2025-55130Highシンボリックリンクを悪用したファイルシステム権限バイパス20.x, 22.x, 24.x, 25.x
CVE-2025-59465High不正なHTTP/2 HEADERSフレームによるサーバークラッシュ20.x, 22.x, 24.x, 25.x
CVE-2025-59466Mediumasync_hooks有効時にスタックオーバーフローがキャッチ不能になるDoS20.x, 22.x, 24.x, 25.x
CVE-2025-59464MediumTLSクライアント証明書処理時のメモリリークによるDoS24.xのみ
CVE-2026-21636MediumUnixドメインソケット経由のパーミッションモデルバイパス25.xのみ
CVE-2026-21637MediumTLS PSK/ALPNコールバック例外がエラーハンドラを迂回20.x, 22.x, 24.x, 25.x
CVE-2025-55132Lowfs.futimes()が読み取り専用パーミッションモデルをバイパス20.x, 22.x, 24.x, 25.x

修正済みバージョンはそれぞれ v20.20.0 / v22.22.0 / v24.13.0 / v25.3.0 です(出典: Node.js公式ブログ)。

深刻度Highの脆弱性を詳しく解説

CVE-2025-55131: Buffer未初期化メモリの露出

vmモジュールのタイムアウトオプション付きでコードを実行する際、Buffer.alloc()TypedArrayのメモリ確保処理が中断されると、ゼロ初期化が完了しないままバッファが返される問題です。未初期化メモリにはプロセス内の機密データ(トークン、パスワード、セッション情報など)が残存している可能性があり、攻撃者がタイミングを制御できる環境では情報漏えいに直結します。

報告者・修正者ともにNikita Skovoroda氏で、Node.jsのメモリ安全性に関する根本的な信頼性を揺るがす脆弱性です。vmモジュールとタイムアウトを組み合わせて使用しているアプリケーション(サンドボックス実行環境、テンプレートエンジンなど)は特に注意が必要です。

CVE-2025-55130: シンボリックリンクによる権限バイパス

Node.jsのパーミッションモデル(--allow-fs-read / --allow-fs-writeフラグ)は、スクリプトがアクセスできるファイルパスを制限する機能です。この脆弱性では、相対パスを含む巧妙なシンボリックリンクチェーンを作成することで、許可されたディレクトリの外にあるファイルへの読み書きが可能になります。

パーミッションモデルを使ってサンドボックス化を行っているアプリケーションでは、意図しないファイルアクセスが発生するリスクがあります。ただし、Node.jsのパーミッションモデルは実験的機能であり、本番環境で有効化しているケースは限定的です。

CVE-2025-59465: HTTP/2サーバーのクラッシュ

不正なHPACKデータを含むHTTP/2 HEADERSフレームをサーバーに送信すると、TLSSocketECONNRESETエラーが未処理のまま発生し、プロセスが異常終了します。HTTP/2を利用している本番サーバーでは、外部からの悪意あるリクエスト1つでサービス全体が停止する可能性があるため、最も実害の大きい脆弱性の一つです。

アップデートが即座に適用できない場合、以下の緩和コードで暫定対処が可能です。

// HTTP/2サーバーのクラッシュを防ぐ緩和策
// secureConnectionイベントでソケットのエラーを明示的にハンドリングする
server.on('secureConnection', socket => {
  socket.on('error', err => {
    // エラーをログに記録し、プロセスのクラッシュを防止
    console.error('TLS socket error:', err.message);
  });
});

このコードを既存のHTTP/2サーバーに追加することで、不正フレーム受信時にもプロセスが維持されます。ただし根本対策はパッチ適用であるため、早期のアップデートを推奨します。

React・Next.jsユーザーへの影響(async_hooks DoS問題)

CVE-2025-59466の技術的背景

async_hooks.createHook()が有効な環境でスタックオーバーフローが発生すると、通常のRangeErrorとしてキャッチされず、プロセスが即座に終了コード7で停止します。try-catchprocess.on('uncaughtException')による回復が一切機能しません。

Node.js内部では、async_hooksのコールバック実行時にTryCatchScope::CatchMode::kFatalが設定されており、この状態でスタックオーバーフローが発生すると「回復不能なエラー」として扱われます。これが正常なエラーハンドリングをすべて迂回する原因です。

影響を受ける主要なフレームワークとツール

AsyncLocalStorageを内部的に利用しているフレームワークやAPMツールは、async_hooksを暗黙的に有効化しています。影響範囲は広範です。

  • React Server Components(React 18以降): AsyncLocalStorageでリクエストコンテキストを追跡
  • Next.js: サーバーサイドレンダリングでAsyncLocalStorageを使用
  • APMツール: Datadog、New Relic、Dynatrace、Elastic APM、OpenTelemetry

攻撃者が深くネストしたJSON(50,000階層以上など)をAPIエンドポイントに送信するだけで、再帰処理によるスタックオーバーフローが発生し、サーバーが即座にクラッシュします。

Node.js 24以降では一部影響を回避可能

Node.js 24ではAsyncLocalStorageがV8のAsyncContextFrameを使って再実装されました。これにより、AsyncLocalStorage経由でasync_hooksを使用している場合(React / Next.jsが該当)はJavaScriptコールバックが発生しなくなり、この脆弱性の影響を受けません。

Node.jsバージョンReact / Next.jsAPMツール(createHook直接利用)
v24.x / v25.x影響なしツールの実装に依存
v22.x影響あり影響あり
v20.x影響あり影響あり

ただし、APMツールがasync_hooks.createHook()を直接呼び出している場合はNode.js 24以降でも引き続き影響を受けます。利用中のAPMツールの対応状況を確認してください。

根本的な対策

パッチ適用後も、スタックオーバーフローに依存しない設計が推奨されます。

// 再帰処理に深さ制限を設ける防御的な実装例
function processNestedData(data, maxDepth = 100, currentDepth = 0) {
  if (currentDepth > maxDepth) {
    throw new Error(`再帰の深さが上限 ${maxDepth} を超えました`);
  }
  if (Array.isArray(data)) {
    return data.map(item => processNestedData(item, maxDepth, currentDepth + 1));
  }
  if (typeof data === 'object' && data !== null) {
    const result = {};
    for (const [key, value] of Object.entries(data)) {
      result[key] = processNestedData(value, maxDepth, currentDepth + 1);
    }
    return result;
  }
  return data;
}

外部入力を再帰的に処理する箇所では、深さ制限やイテレーティブな処理への置き換えが有効です。CVE-2025-59466は2025年12月7日に報告され、12月9〜11日にパッチが開発、2026年1月13日にリリースされました(出典: Node.js公式ブログ)。

バージョン別アップデート対応ガイド

アップデート先の一覧

現在のバージョンアップデート先優先度
v25.0.0〜25.2.xv25.3.0高(Currentユーザー)
v24.0.0〜24.12.xv24.13.0最優先(Active LTS)
v22.0.0〜22.21.xv22.22.0最優先(Maintenance LTS)
v20.0.0〜20.19.xv20.20.0最優先(Maintenance LTS、EOL間近)
v18.x以前v24.x LTSへ移行緊急(サポート終了済み)

バージョン切り替えコマンド

Node バージョン切り替えは、使用しているバージョン管理ツールに応じて以下のように実行します。

nvm の場合:

# 最新のLTSセキュリティパッチを取得
nvm install 24.13.0
nvm use 24.13.0
nvm alias default 24.13.0

# プロジェクトの.nvmrcも更新
echo "24.13.0" > .nvmrc

volta の場合:

volta install node@24.13.0
# プロジェクト固定の場合
volta pin node@24.13.0

mise(旧rtx)の場合:

mise install node@24.13.0
mise use --global node@24.13.0

Dockerイメージの更新

# 修正前
FROM node:24.12-slim

# 修正後(セキュリティパッチ適用済み)
FROM node:24.13-slim

CI/CDパイプラインでDockerイメージを固定している場合は、イメージタグの更新を忘れずに行ってください。

Dependabot / Renovateの活用

Node.jsランタイム自体のバージョン更新はDependabotの標準スコープ外ですが、Dockerfileやツールバージョンファイルの監視設定を行うことで、セキュリティリリースの検知を自動化できます。

# .github/dependabot.yml でDockerイメージの更新を監視
version: 2
updates:
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "daily"
    labels:
      - "security"
      - "dependencies"

Node.js LTSサポート状況とEOL計画

本番環境でどのバージョンを選ぶかは、Node.js LTSのライフサイクルを把握した上で判断する必要があります。

バージョンコードネームステータスEOL(サポート終了)
v25なしCurrent2026年4月
v24KryptonActive LTS2028年4月
v22JodMaintenance LTS2027年4月
v20IronMaintenance LTS2026年4月
v18Hydrogenサポート終了済み2025年3月終了

出典: Node.js公式リリースページ

推奨バージョンの選定指針

新規プロジェクト: Node 24 LTS(Krypton)を選択するのが最善です。Active LTSとして2028年4月までサポートが継続し、AsyncContextFrameによる性能改善やasync_hooks関連の脆弱性耐性も備えています。

既存のv20.xプロジェクト: セキュリティパッチを適用した上で、v24への移行計画を策定してください。v20は2026年4月にEOLを迎えるため、残り約2か月しかありません。

既存のv22.xプロジェクト: v22のEOLは2027年4月です。当面はセキュリティパッチの適用で対応可能ですが、長期的にはv24への移行を検討してください。

v18を使い続けている環境: Node 18 EOLは2025年3月に到達済みです。セキュリティパッチの提供が停止しているため、今回の8件のCVEを含め、すべての脆弱性が未修正のまま残存します。商用サポートが必要な場合はOpenJS Ecosystem Sustainability Programを検討してください。

npm依存パッケージの脆弱性もチェック

Node.jsランタイム本体の脆弱性対応だけでなく、npmパッケージの脆弱性にも注意が必要です。2026年1月には、バイナリデータ解析ライブラリbinary-parserにコードインジェクションの脆弱性(CVE-2026-1245、CVSS 6.5)が公表されています。パーサー定義にユーザー入力を渡している場合、Functionコンストラクタ経由で任意のJavaScriptが実行される可能性があります。v2.3.0で修正済みです(出典: NVD)。

また、今回のNode.jsセキュリティリリースでは依存ライブラリの更新も含まれています。

  • c-ares: 1.34.6(DNS解決ライブラリ)
  • undici: 6.23.0 / 7.18.0(HTTPクライアント)

プロジェクト全体の脆弱性をスキャンするにはnpm auditを定期的に実行してください。

# 脆弱性の検出
npm audit

# 自動修正可能なものを一括修正
npm audit fix

# 修正にメジャーバージョンアップが必要なもの含め強制修正
npm audit fix --force

npm auditの結果はCI/CDに組み込むことで、脆弱なパッケージの混入を継続的に防止できます。

OpenSSL関連の脆弱性評価

2026年1月にはOpenSSLプロジェクトからも12件のCVEを含むセキュリティアドバイザリが公開されました。Node.jsセキュリティチームによる評価の結果、Node.jsに影響するのは3件(深刻度Low〜Moderate)です(出典: Node.js公式ブログ)。

3件すべてがPFX(PKCS#12)証明書ファイルの処理に関する問題で、TLS接続のpfxオプションを使用する場合にのみ影響します。PFXファイルは通常ローカルの信頼できるソースから読み込むため攻撃面は限定的であり、専用のセキュリティリリースではなく通常リリースに含める対応となっています。

  • CVE-2025-11187: PBMAC1 MAC検証時のスタックバッファオーバーフロー(Moderate、v22以降に影響)
  • CVE-2025-69421: PKCS12_item_decrypt_d2iでのNULLポインタ参照(Low、全バージョンに影響)
  • CVE-2026-22795: PKCS#12パース時の型混同(Low、全バージョンに影響)

セキュリティコミュニティの動向

今回のリリースでは、報告から修正までの期間が比較的短い脆弱性が多く、Node.jsのGitHubリポジトリとHackerOneによる脆弱性報告プログラムが機能していることがわかります。

注目すべき点として、CVE-2025-59466(async_hooks DoS)はReactやNext.jsのエコシステムを通じて極めて広い範囲に影響を及ぼす脆弱性でした。Node.jsセキュリティチームが専用の緩和ガイドを公開したのは、フレームワークの普及度を考慮した異例の対応です。

Endor Labsの分析によると、今回の脆弱性群は攻撃の前提条件が限定的であるため、React2Shellのような大規模な悪用が発生するリスクは低いと評価されています(出典: Endor Labs)。ただし、HTTP/2クラッシュ(CVE-2025-59465)のように前提条件が緩い脆弱性もあるため、一律にリスクを低く見積もるべきではありません。

まとめ

2026年1月13日のNode.jsセキュリティアップデートでは、High 3件を含む計8件のCVEが修正されました。対応の優先順位は以下の通りです。

  1. HTTP/2を使用している場合: CVE-2025-59465の影響で外部から1リクエストでサーバーがクラッシュするため、最優先でアップデートしてください
  2. React / Next.js / APMツールを利用中の場合: CVE-2025-59466によるDoSリスクがあります。v22以前では特に注意が必要です
  3. vmモジュールをタイムアウト付きで使用している場合: CVE-2025-55131によるメモリ情報漏えいのリスクがあります
  4. v20を本番運用中の場合: 2026年4月のEOLまでに、Node 24 LTS(Krypton)への移行計画を立ててください。v22(EOL 2027年4月)も早期の移行検討を推奨します

修正済みバージョン(v20.20.0 / v22.22.0 / v24.13.0 / v25.3.0)へのアップデートが最も確実な対策です。公式のセキュリティ情報はNode.js Vulnerabilityページとnodejs-secメーリングリストで配信されています。