T-CREATOR

<div />

【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説

【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説

2026年1月13日、Node.js チームは複数バージョンに影響する 8件のセキュリティ脆弱性 を修正したアップデートをリリースしました。本記事では、各脆弱性の詳細・影響範囲・実務での対策を、初学者から実務者まで理解できる形で解説します。

「Node.js の脆弱性対策」「セキュリティアップデートの判断」「バージョンアップの優先度」を知りたい方に向けた記事です。

脆弱性の比較表(2026年1月リリース)

#CVE深刻度概要影響バージョン実務での緊急度
1CVE-2025-55131HIGHメモリ初期化不備による情報漏洩20.x〜25.x即時対応
2CVE-2025-55130HIGHシンボリックリンクによる権限バイパス20.x〜25.x即時対応
3CVE-2025-59465HIGHHTTP/2 不正フレームによるクラッシュ20.x〜25.x即時対応
4CVE-2025-59466MEDIUMasync_hooks でのスタックオーバーフロー20.x〜25.x高(APM利用時)
5CVE-2025-59464MEDIUMTLS 証明書処理でのメモリリーク20.x〜24.x中〜高
6CVE-2026-21636MEDIUMUnix ドメインソケット権限バイパス25.x のみ中(25.x利用時)
7CVE-2026-21637MEDIUMTLS コールバック例外のバイパス複数
8CVE-2025-55132LOWfutimes() 権限チェック不備20.x〜25.x

この表は即答用です。各脆弱性の詳細な影響と対策は後段で解説します。

検証環境

  • OS: macOS Sonoma 14.x / Ubuntu 22.04 LTS
  • Node.js: 22.21.0(脆弱性確認)→ 22.22.0(修正確認)
  • TypeScript: 5.7.x
  • 主要パッケージ:
    • undici: 6.23.0
    • c-ares: 1.34.6
  • 検証日: 2026年1月14日

背景:なぜ今回のセキュリティリリースが重要なのか

この章でわかること

  • 今回の脆弱性が発生した技術的背景
  • 実務で問題になる理由
  • 過去の類似事例との違い

技術的背景

Node.js は V8 エンジンをベースに、サーバーサイドで JavaScript を実行するランタイムです。今回の脆弱性は、以下の3つの領域に集中しています。

  1. メモリ管理: Buffer やTypedArray の初期化処理
  2. 権限モデル: --permission フラグによるサンドボックス機能
  3. 非同期処理: async_hooks と HTTP/2 の内部実装

特に、Node.js 20.x で導入された実験的な権限モデル(Permission Model)に関連する脆弱性が3件含まれており、サンドボックス環境を信頼している場合は 即時対応が必要 です。

実務的背景

今回の脆弱性が実務で深刻な理由は、以下の点にあります。

  • React Server Components / Next.js が内部で使用する AsyncLocalStorage が影響を受ける
  • すべての主要APMツール(Datadog、New Relic、OpenTelemetry など)が async_hooks を使用している
  • HTTP/2 を採用したAPIサーバー が外部から DoS 攻撃を受ける可能性がある

実際に検証したところ、Next.js アプリケーションに深くネストした JSON を送信するだけで、プロセスがクラッシュする状態を確認しました。

つまずきポイント

  • 「自分のアプリは async_hooks を直接使っていないから大丈夫」と考えがちですが、フレームワークやAPMが内部で使用しているケースが多いです
  • Permission Model を使っていない場合でも、HIGH 評価の脆弱性(CVE-2025-55131、CVE-2025-59465)は影響します

課題:各脆弱性の詳細と実務での影響

この章でわかること

  • 各脆弱性の技術的な仕組み
  • 攻撃が成立する条件
  • 放置した場合のリスク

CVE-2025-55131:メモリ初期化不備(HIGH)

脆弱性の仕組み

vm モジュールでタイムアウトオプションを使用した際、Buffer.alloc()Uint8Array の初期化処理が中断されると、未初期化のメモリ領域がそのまま返される問題です。

以下の図は、正常なメモリ初期化と、脆弱性発生時の動作の違いを示しています。

mermaidflowchart LR
  subgraph normal["正常な動作"]
    A1["Buffer.alloc(1024)"] --> A2["メモリ確保"]
    A2 --> A3["ゼロ埋め"]
    A3 --> A4["安全なBuffer"]
  end

  subgraph vuln["脆弱性発生時"]
    B1["Buffer.alloc(1024)<br/>+ タイムアウト"] --> B2["メモリ確保"]
    B2 --> B3["ゼロ埋め中断"]
    B3 --> B4["未初期化メモリ<br/>(前回のデータ残存)"]
  end

図の補足:正常時はメモリがゼロで初期化されますが、タイムアウトで中断されると前回のプロセスが使用したメモリ内容(トークンやパスワードなど)が残ったまま返される可能性があります。

攻撃シナリオ

javascript// 攻撃者が制御可能な入力でタイムアウトを発生させる
const vm = require("vm");
const script = new vm.Script("Buffer.alloc(10000)");

// タイムアウトが発生すると、未初期化メモリが露出する可能性
const result = script.runInNewContext({}, { timeout: 1 });

実務での影響

  • マルチテナント環境で、他ユーザーの機密データが漏洩する可能性
  • サーバーサイドで vm モジュールを使用している場合は 即時対応が必要
  • トークンやAPIキーがメモリに残っている場合、情報漏洩に直結

つまずきポイント

  • Buffer.allocUnsafe() だけでなく、Buffer.alloc() も条件次第で影響を受けます
  • 「タイムアウトを使っていないから大丈夫」と思いがちですが、ライブラリが内部で使用しているケースがあります

CVE-2025-55130:シンボリックリンク権限バイパス(HIGH)

脆弱性の仕組み

Node.js の Permission Model(--permission フラグ)で、--allow-fs-read--allow-fs-write によるファイルシステム制限を設けていても、相対パスのシンボリックリンクを経由して制限外のファイルにアクセスできる問題です。

mermaidflowchart TD
  subgraph sandbox["許可されたディレクトリ"]
    allowed["/app/data/"]
    symlink["/app/data/link<br/>→ ../../../etc/passwd"]
  end

  subgraph protected["保護されたファイル"]
    target["/etc/passwd"]
  end

  allowed --> symlink
  symlink -.->|"バイパス"| target

図の補足:シンボリックリンクを使って、サンドボックス外のファイルにアクセスできてしまいます。

実務での影響

  • Permission Model を使用したセキュアな実行環境が 無効化 される
  • サードパーティのコードを制限付きで実行している場合、任意のファイルを読み取られる可能性
  • コンテナ環境でも、ホストファイルシステムへのアクセスに悪用される可能性

つまずきポイント

  • Permission Model は実験的機能ですが、本番環境で採用しているケースもあります
  • 「シンボリックリンクを作成できない環境だから大丈夫」と思っても、既存のシンボリックリンクを悪用される可能性があります

CVE-2025-59465:HTTP/2 HEADERS フレームによるクラッシュ(HIGH)

脆弱性の仕組み

不正な形式の HTTP/2 HEADERS フレーム(特に、オーバーサイズの無効な HPACK データ)を受信すると、TLSSocket で ECONNRESET エラーが発生し、適切なエラーハンドラーがない場合にプロセス全体がクラッシュします。

mermaidsequenceDiagram
  participant Attacker as 攻撃者
  participant Server as Node.js サーバー
  participant Process as プロセス

  Attacker->>Server: 不正な HTTP/2 HEADERS フレーム
  Server->>Server: HPACK デコードエラー
  Server->>Process: 未処理の ECONNRESET
  Process->>Process: クラッシュ(終了コード1)

図の補足:攻撃者が不正なフレームを送信するだけで、サーバーをダウンさせることができます。

脆弱なコードと修正例

javascript// 脆弱なコード:エラーハンドラーなし
const http2 = require("http2");
const server = http2.createSecureServer({
  /* TLS設定 */
});

server.on("secureConnection", (socket) => {
  // エラーハンドラーがない
});

server.listen(443);
javascript// 修正後:エラーハンドラーを追加
const http2 = require("http2");
const server = http2.createSecureServer({
  /* TLS設定 */
});

server.on("secureConnection", (socket) => {
  socket.on("error", (err) => {
    console.error("TLS Socket error:", err.message);
    // 接続を安全に閉じる
  });
});

server.listen(443);

実務での影響

  • HTTP/2 を採用した API サーバーが リモートからの DoS 攻撃 を受ける
  • 認証不要で攻撃可能なため、外部公開しているサーバーは即時対応が必要
  • ロードバランサー配下でも、個別の Node.js インスタンスがクラッシュする

つまずきポイント

  • 「HTTP/2 を使っていないから大丈夫」と思っても、リバースプロキシとの通信で使用しているケースがあります
  • フレームワーク(Fastify、Koa など)が内部で HTTP/2 を使用している場合も影響します

CVE-2025-59466:async_hooks スタックオーバーフロー(MEDIUM)

脆弱性の仕組み

async_hooks.createHook() が有効な状態で、再帰処理によりスタック領域が枯渇すると、通常の try-catch でエラーをキャッチできず、プロセスが即座にクラッシュします。

javascriptimport { createHook } from "node:async_hooks";

// async_hooks を有効化(APMツールが自動的に行う)
createHook({ init() {} }).enable();

function recursive() {
  new Promise(() => {}); // 非同期コンテキスト作成
  return recursive();
}

try {
  recursive();
} catch (err) {
  // このブロックは実行されない
  console.log("Caught:", err);
}
// → 終了コード 7 でクラッシュ

なぜこれが危険なのか

この脆弱性が特に危険な理由は、ほとんどの本番環境が影響を受ける 点にあります。

  • React Server Components / Next.js: 内部で AsyncLocalStorage を使用
  • すべての主要APMツール: Datadog、New Relic、Dynatrace、Elastic APM、OpenTelemetry が async_hooks を使用
  • 多くのロギングライブラリ: リクエストコンテキストの追跡に使用
mermaidflowchart TD
  subgraph affected["影響を受けるシステム"]
    nextjs["Next.js<br/>App Router"]
    react["React Server<br/>Components"]
    datadog["Datadog APM"]
    newrelic["New Relic"]
    otel["OpenTelemetry"]
  end

  subgraph root["根本原因"]
    als["AsyncLocalStorage"]
    hooks["async_hooks"]
  end

  nextjs --> als
  react --> als
  datadog --> hooks
  newrelic --> hooks
  otel --> hooks
  als --> hooks

図の補足:多くのフレームワークとツールが async_hooks に依存しており、影響範囲が非常に広いです。

攻撃シナリオ

javascript// Next.js API ルートの例
export default async function handler(req, res) {
  try {
    const data = req.body;
    const result = processNestedData(data); // 深いネストでクラッシュ
    res.json({ success: true, result });
  } catch (err) {
    // このキャッチブロックは実行されない
    res.status(500).json({ error: "Processing failed" });
  }
}

function processNestedData(data) {
  if (Array.isArray(data)) {
    return data.map((item) => processNestedData(item));
  }
  return transform(data);
}

攻撃者が50,000レベル以上にネストした JSON を送信すると、サーバーがクラッシュします。

つまずきポイント

  • 「自分のコードで async_hooks を使っていない」と思っても、APMツールやフレームワークが使用しています
  • 「try-catch で守っているから大丈夫」という認識は、この脆弱性では 誤り です

CVE-2025-59464:TLS 証明書メモリリーク(MEDIUM)

脆弱性の仕組み

OpenSSL との統合部分で、X.509 証明書フィールドを UTF-8 に変換する際にメモリリークが発生します。socket.getPeerCertificate(true) を呼び出すたびにメモリが解放されません。

javascript// 脆弱なコード:繰り返し呼び出すとメモリリーク
server.on("secureConnection", (socket) => {
  const cert = socket.getPeerCertificate(true); // リーク発生
  // 処理...
});

実務での影響

  • TLS 接続を大量に処理するサーバーで、メモリ枯渇によるクラッシュ
  • 攻撃者がリモートから TLS 接続を繰り返すことで、意図的にメモリを枯渇させられる
  • 長時間稼働するサーバーで徐々にメモリ使用量が増加

つまずきポイント

  • メモリリークは即座にクラッシュしないため、発見が遅れがちです
  • 負荷テストでは発見できても、本番環境で長期間経過後に問題が顕在化するケースがあります

その他の脆弱性(CVE-2026-21636、CVE-2026-21637、CVE-2025-55132)

CVE-2026-21636:Unix ドメインソケット権限バイパス(MEDIUM)

  • 影響: Node.js 25.x のみ
  • 内容: --permission 有効時に、Unix ドメインソケット接続がネットワーク制限をバイパス
  • 対応: 25.x を使用し、Permission Model を有効にしている場合のみ対応が必要

CVE-2026-21637:TLS PSK/ALPN コールバック例外バイパス(MEDIUM)

  • 内容: pskCallbackALPNCallback で同期例外が発生すると、標準のエラーハンドリングがバイパスされる
  • 対応: TLS のカスタムコールバックを使用している場合は対応が必要

CVE-2025-55132:futimes() 権限チェック不備(LOW)

  • 内容: fs.futimes() が書き込み権限チェックを行わない
  • 対応: Permission Model を使用している場合のみ影響。優先度は低い

解決策と判断:バージョンアップの優先度と対策

この章でわかること

  • どのバージョンにアップデートすべきか
  • 即時対応が必要なケース
  • アップデート以外の一時的な対策

修正バージョン一覧

現行バージョン推奨アップデート先リリース日
Node.js 20.x20.20.02026年1月13日
Node.js 22.x22.22.02026年1月13日
Node.js 24.x24.13.02026年1月13日
Node.js 25.x25.3.02026年1月13日
Node.js 18.x 以下サポート終了・即時移行推奨-

即時対応が必要なケース

以下のいずれかに該当する場合は、即時アップデートを推奨します。

  1. HTTP/2 を使用している API サーバー(CVE-2025-59465)
  2. APM ツールを導入している(CVE-2025-59466)
  3. Next.js / React Server Components を使用している(CVE-2025-59466)
  4. Permission Model を有効にしている(CVE-2025-55130、CVE-2026-21636)
  5. vm モジュールでタイムアウトを使用している(CVE-2025-55131)

アップデート以外の一時的な対策

すぐにアップデートできない場合の暫定対応です。

HTTP/2 クラッシュ対策(CVE-2025-59465)

javascript// エラーハンドラーを追加
server.on("secureConnection", (socket) => {
  socket.on("error", (err) => {
    console.error("TLS error handled:", err.message);
  });
});

スタックオーバーフロー対策(CVE-2025-59466)

javascript// 再帰深度を制限
function processNestedData(data, depth = 0, maxDepth = 100) {
  if (depth > maxDepth) {
    throw new Error("Maximum recursion depth exceeded");
  }

  if (Array.isArray(data)) {
    return data.map((item) => processNestedData(item, depth + 1, maxDepth));
  }
  return transform(data);
}

入力データのバリデーション

javascript// JSON のネスト深度を制限
function validateJsonDepth(obj, maxDepth = 50, currentDepth = 0) {
  if (currentDepth > maxDepth) {
    throw new Error("JSON nesting too deep");
  }

  if (typeof obj === "object" && obj !== null) {
    for (const value of Object.values(obj)) {
      validateJsonDepth(value, maxDepth, currentDepth + 1);
    }
  }
  return true;
}

つまずきポイント

  • 「開発環境だから後回しで良い」と思いがちですが、ローカルでも APM や Next.js を使用していれば影響します
  • 暫定対策は 根本解決ではない ため、できるだけ早くアップデートしてください

脆弱性比較まとめ(実務判断用・詳細)

この章でわかること

  • 各脆弱性の優先度判断
  • 自分の環境に該当するかの確認方法
  • 対応スケジュールの目安

詳細比較表

CVE深刻度攻撃条件リモート攻撃影響範囲対応優先度
CVE-2025-55131HIGHvm モジュール + タイムアウト条件付きで可能メモリ情報漏洩即時(該当環境)
CVE-2025-55130HIGHPermission Model + シンボリックリンク不可ファイルシステム即時(該当環境)
CVE-2025-59465HIGHHTTP/2 + TLS可能DoS最優先
CVE-2025-59466MEDIUMasync_hooks + 深い再帰可能DoS最優先
CVE-2025-59464MEDIUMTLS + getPeerCertificate可能DoS(メモリ)
CVE-2026-21636MEDIUMPermission Model + UDS不可権限バイパス中(25.x のみ)
CVE-2026-21637MEDIUMTLS カスタムコールバック可能DoS
CVE-2025-55132LOWPermission Model + futimes不可タイムスタンプ改ざん

環境別の対応判断

Web アプリケーション(Next.js / Express / Fastify など)

  • 最優先: CVE-2025-59466(async_hooks)、CVE-2025-59465(HTTP/2)
  • 理由: APM やフレームワークが自動的に async_hooks を使用するため

API サーバー

  • 最優先: CVE-2025-59465(HTTP/2)、CVE-2025-59464(TLS メモリリーク)
  • 理由: 外部からの攻撃に直接さらされるため

バッチ処理 / CLI ツール

  • 優先度: 中: CVE-2025-55131(メモリ初期化)
  • 理由: vm モジュールを使用している場合のみ影響

サンドボックス環境

  • 最優先: CVE-2025-55130(シンボリックリンク)、CVE-2026-21636(UDS)
  • 理由: サンドボックスの信頼性が根本から崩れるため

まとめ

今回の Node.js セキュリティリリース(2026年1月13日)では、8件の脆弱性が修正されました。特に以下の点が重要です。

  1. CVE-2025-59465(HTTP/2 クラッシュ)CVE-2025-59466(async_hooks スタックオーバーフロー) は、リモートから攻撃可能な DoS 脆弱性であり、ほとんどの本番環境で即時対応が必要です。

  2. async_hooks の問題は、Next.js、React Server Components、すべての主要 APM ツール に影響するため、「自分は async_hooks を使っていない」と思っている環境でも対象になる可能性が高いです。

  3. Permission Model を使用している場合は、CVE-2025-55130(シンボリックリンクバイパス) によりサンドボックスが無効化されるリスクがあります。

  4. すぐにアップデートできない場合は、エラーハンドラーの追加や再帰深度の制限といった暫定対策を講じてください。ただし、これらは 根本解決ではない ため、計画的なバージョンアップをお勧めします。

本番環境のセキュリティは、一度の対応で終わりではありません。Node.js のセキュリティ情報を継続的にウォッチし、迅速に対応できる体制を整えておくことが重要です。

関連リンク

著書

とあるクリエイター

フロントエンドエンジニア Next.js / React / TypeScript / Node.js / Docker / AI Coding

;