【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説
2026年1月13日、Node.js チームは複数バージョンに影響する 8件のセキュリティ脆弱性 を修正したアップデートをリリースしました。本記事では、各脆弱性の詳細・影響範囲・実務での対策を、初学者から実務者まで理解できる形で解説します。
「Node.js の脆弱性対策」「セキュリティアップデートの判断」「バージョンアップの優先度」を知りたい方に向けた記事です。
脆弱性の比較表(2026年1月リリース)
| # | CVE | 深刻度 | 概要 | 影響バージョン | 実務での緊急度 |
|---|---|---|---|---|---|
| 1 | CVE-2025-55131 | HIGH | メモリ初期化不備による情報漏洩 | 20.x〜25.x | 即時対応 |
| 2 | CVE-2025-55130 | HIGH | シンボリックリンクによる権限バイパス | 20.x〜25.x | 即時対応 |
| 3 | CVE-2025-59465 | HIGH | HTTP/2 不正フレームによるクラッシュ | 20.x〜25.x | 即時対応 |
| 4 | CVE-2025-59466 | MEDIUM | async_hooks でのスタックオーバーフロー | 20.x〜25.x | 高(APM利用時) |
| 5 | CVE-2025-59464 | MEDIUM | TLS 証明書処理でのメモリリーク | 20.x〜24.x | 中〜高 |
| 6 | CVE-2026-21636 | MEDIUM | Unix ドメインソケット権限バイパス | 25.x のみ | 中(25.x利用時) |
| 7 | CVE-2026-21637 | MEDIUM | TLS コールバック例外のバイパス | 複数 | 中 |
| 8 | CVE-2025-55132 | LOW | futimes() 権限チェック不備 | 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つの領域に集中しています。
- メモリ管理: Buffer やTypedArray の初期化処理
- 権限モデル:
--permissionフラグによるサンドボックス機能 - 非同期処理: 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)
- 内容:
pskCallbackやALPNCallbackで同期例外が発生すると、標準のエラーハンドリングがバイパスされる - 対応: TLS のカスタムコールバックを使用している場合は対応が必要
CVE-2025-55132:futimes() 権限チェック不備(LOW)
- 内容:
fs.futimes()が書き込み権限チェックを行わない - 対応: Permission Model を使用している場合のみ影響。優先度は低い
解決策と判断:バージョンアップの優先度と対策
この章でわかること
- どのバージョンにアップデートすべきか
- 即時対応が必要なケース
- アップデート以外の一時的な対策
修正バージョン一覧
| 現行バージョン | 推奨アップデート先 | リリース日 |
|---|---|---|
| Node.js 20.x | 20.20.0 | 2026年1月13日 |
| Node.js 22.x | 22.22.0 | 2026年1月13日 |
| Node.js 24.x | 24.13.0 | 2026年1月13日 |
| Node.js 25.x | 25.3.0 | 2026年1月13日 |
| Node.js 18.x 以下 | サポート終了・即時移行推奨 | - |
即時対応が必要なケース
以下のいずれかに該当する場合は、即時アップデートを推奨します。
- HTTP/2 を使用している API サーバー(CVE-2025-59465)
- APM ツールを導入している(CVE-2025-59466)
- Next.js / React Server Components を使用している(CVE-2025-59466)
- Permission Model を有効にしている(CVE-2025-55130、CVE-2026-21636)
- 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-55131 | HIGH | vm モジュール + タイムアウト | 条件付きで可能 | メモリ情報漏洩 | 即時(該当環境) |
| CVE-2025-55130 | HIGH | Permission Model + シンボリックリンク | 不可 | ファイルシステム | 即時(該当環境) |
| CVE-2025-59465 | HIGH | HTTP/2 + TLS | 可能 | DoS | 最優先 |
| CVE-2025-59466 | MEDIUM | async_hooks + 深い再帰 | 可能 | DoS | 最優先 |
| CVE-2025-59464 | MEDIUM | TLS + getPeerCertificate | 可能 | DoS(メモリ) | 高 |
| CVE-2026-21636 | MEDIUM | Permission Model + UDS | 不可 | 権限バイパス | 中(25.x のみ) |
| CVE-2026-21637 | MEDIUM | TLS カスタムコールバック | 可能 | DoS | 中 |
| CVE-2025-55132 | LOW | Permission 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件の脆弱性が修正されました。特に以下の点が重要です。
-
CVE-2025-59465(HTTP/2 クラッシュ) と CVE-2025-59466(async_hooks スタックオーバーフロー) は、リモートから攻撃可能な DoS 脆弱性であり、ほとんどの本番環境で即時対応が必要です。
-
async_hooks の問題は、Next.js、React Server Components、すべての主要 APM ツール に影響するため、「自分は async_hooks を使っていない」と思っている環境でも対象になる可能性が高いです。
-
Permission Model を使用している場合は、CVE-2025-55130(シンボリックリンクバイパス) によりサンドボックスが無効化されるリスクがあります。
-
すぐにアップデートできない場合は、エラーハンドラーの追加や再帰深度の制限といった暫定対策を講じてください。ただし、これらは 根本解決ではない ため、計画的なバージョンアップをお勧めします。
本番環境のセキュリティは、一度の対応で終わりではありません。Node.js のセキュリティ情報を継続的にウォッチし、迅速に対応できる体制を整えておくことが重要です。
関連リンク
著書
article【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説
article2026年1月11日Node.jsとTypeScriptのユースケース バックエンド開発で型を活かす実践テクニック
article2025年12月24日TypeScriptでESMとCJS混在をトラブルシュートする ERR_REQUIRE_ESMとimport不可を直す
articleNode.js 25.x, 24.x, 22.x, 20.x の脆弱性対応:2025 年 12 月版で修正された 3 件の High Severity 問題の詳細
articleNode.js で GraphQL サーバー構築:Yoga/Apollo を最小構成で立ち上げる
articleDeno vs Node.js vs Bun ベンチマーク:起動時間・HTTP スループット・DX 比較
articleNext.js・React Server Componentsが危険?async_hooksの脆弱性CVE-2025-59466を徹底解説
article【緊急】2026年1月13日発表 Node.js 脆弱性8件の詳細と対策|HTTP/2・async_hooks のDoS問題を解説
article2026年1月13日TypeScriptで既存コードを型安全化する使い方 段階的リファクタリング手順とチェックポイント
article2026年1月13日PlaywrightとTypeScriptでテスト自動化を運用する 型安全な設計と保守の要点
article2026年1月13日TypeScriptでHigher Kinded Typesを模倣する設計 ジェネリクスで関数型パターンを整理
article2026年1月13日Viteで画像とアセット管理をシンプルにする使い方 import運用と構成の考え方
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来
