Next.js のインクリメンタルキャッシュ経由のパストラバーサル RCE:CVE-2026-75604

エスケープされていないバックスラッシュ一つが、Windows 上でキャッシュを任意ファイルの読み書きに変えます。漏えいした Server Action の暗号鍵でリクエストを偽造し、React Flight のプロパティ連鎖から Function に到達します。

概要

項目 内容
CVE CVE-2026-75604
CVSS 9.0(Critical)
CWE CWE-22 パストラバーサル
影響版 13.4.0 〜 15.5.23、16.0.0 〜 16.3.2
修正版 15.5.24 / 16.3.3
公開日 2026 年 8 月
実悪用 公開エクスプロイト 4 件 + Metasploit モジュール

セキュリティ企業 Fortbridge が公開したこの脆弱性には厳しい条件があります。Windows のファイルシステム上でしか成立しません。Windows 上で動作し、Pages Router または App Router を使い、Cache Components を有効にしていないアプリが対象です。

発見の経緯

監査対象はインクリメンタルキャッシュのパス構築でした。Next.js はルーティング用の escapePathDelimiters でキャッシュのパス区間を浄化しますが、/ # ? をエスケープしながら、バックスラッシュだけを見落としています。

Linux や macOS ではバックスラッシュは通常の文字です。Windows ではスラッシュと等価なパス区切りです。ルート区間にパーセントエンコードしたバックスラッシュ(%5C)を入れれば、path.join() はキャッシュファイルのパスを組み立てる際に想定されたルートの外へ出ます。

さらに悪いことに、このトラバーサルはキャッシュの読み書き両方に効きます。サーバー上の任意ファイルを読め、任意のパスへ書けます。両方向が揃うことで、情報漏えいだった性質が実行の可能性へ変わります。

再現

以下はすべて、隔離された Windows の実験機での許可されたセキュリティテストに限ります。

影響版を用意し、手順に従って Server Action とキャッシュルートを作成します。要点は、このアクションが利用者の入力を呼び出し可能な値として扱うことです。連鎖の着地点はここにあります。

'use server';
export async function processUserInput(boundFn: any, input: string) {
  return boundFn(input)();
}

第一段階:トラバーサルで暗号鍵を読む。 リクエストパスに ..%5C を繰り返してキャッシュルートを抜け、.next/server/server-reference-manifest.json を指します。このファイルに Server Action の束縛引数を保護する鍵が保存されています。

traversal = "..%5C" * 8
url = f"{TARGET}/app-cache/{traversal}.next/server/server-reference-manifest.json"

第二段階:Server Action を偽造する。 encryptionKey が手に入れば、束縛引数をオフラインで暗号化して組み直せます。経路として使うのは React Flight のプロパティ連鎖です。constructor.constructor は Function まで到達するため、偽造した束縛値はデータではなく関数オブジェクトにできます。

第三段階:送信する。 偽造した引数を Next-Action ヘッダーとともに POST します。サーバーが復号し、Server Action がクロージャ束縛を呼び出してコードが実行されます。十分に構成された標的なら、Metasploit モジュールが一連の流れを自動化します。

msf > use windows/http/nextjs_unauth_rce_cve_2026_75604
msf exploit(...) > set APP_ROUTER app-cache
msf exploit(...) > run

フィンガープリント、Build ID の取得、manifest の漏えい、利用可能な Server Action の探索、束縛引数の暗号化、偽造リクエストの送信までを順にこなします。

修正

修正版はキャッシュのパス区間でバックスラッシュを正しくエスケープし、解決後のパスをキャッシュルート内に強制します。

npm install next@15.5.24   # 15.x 系
npm install next@16.3.3    # 16.x 系

更新後は、トラバーサルで露出し得た鍵を直ちに交換します。とくに固定してビルド間で再利用していた Server Action の鍵です。更新しても交換しなければ、漏えいした値は有効なままです。

設定だけの修正はありません。すぐに更新できない場合は、WAF かリバースプロキシの背後に置き、%5C と ..%5C を含むパスをネットワーク層で遮断し、信頼できない送信元からの到達を制限します。Linux への移行はプラットフォーム条件を消しますが、パッチの代わりにはなりません。

検知では、Web ログにある ..%5C を含む異常なパス、想定外の子プロセス生成、不審なファイル書き込みを確認します。

判断

プラットフォーム固有の脆弱性で、根本原因はパス区切りの扱いがクロスプラットフォームで一致しないことです。/ と \ の隔たりは今もトラバーサルの古典的な発生源です。示された連鎖も典型的で、トラバーサル、鍵の漏えい、認証の偽造、RCE と続きます。

早急な対応が必要な理由は参入障壁です。公開時点で Metasploit モジュールと複数の Python フレームワークを含む、確実に動作する公開ツールが 4 件ありました。Windows 上の Next.js 利用者は、まずバージョン、次に鍵を確認すべきです。

← 記事一覧に戻る

コメント

…