
Next.js CVE-2025-66478の概念実証エクスプロイト。Server Actionsにおける安全でないデシリアライゼーションとプロトタイプ汚染を介したRCEを示します。脆弱なアプリとセキュリティ研究のためのPythonエクスプロイトスクリプトを含みます。
このリポジトリは、Next.js CVE-2025-66478 脆弱性の再現および調査のための Proof of Concept (PoC) です。脆弱性のある Next.js アプリケーションと、その脆弱性をテストする Python エクスプロイトスクリプトで構成されています。
これは、Next.js Server Actions の処理中に発生する リモートコード実行 (RCE) 脆弱性です。
主なポイント:
__proto__ プロパティを介した プロトタイプ汚染 (Prototype Pollution)。| 項目 | 説明 |
|---|
| CVE ID | CVE-2025-66478 |
| タイプ | リモートコード実行 (RCE) |
| 根本原因 | RSC Flight プロトコルにおける安全でないデシリアライゼーション |
| 深刻度 (CVSS) | 10.0 (クリティカル) |
| 影響 | サーバー上での任意のシステムコマンド実行 |
__proto__ などのプロパティを注入します。Object.prototype の汚染を引き起こします。then プロパティが注入されます。Next.js のロジックはこれらのオブジェクトを Promise (Thenable) と誤認識します。await しようとすると、then メソッドに注入された悪意のある JavaScript コードが実行されます (例: child_process.execSync)。sequenceDiagram
participant Attacker
participant Server as Next.js Server
Attacker->>Server: POST / (JSON に "__proto__": {"then": ...})
Note right of Server: JSON パースにより Object.prototype が汚染される
Server->>Server: アプリケーションロジックがオブジェクトに遭遇
rect rgb(200, 150, 150)
Note right of Server: "Thenable" チェックガジェット
Server->>Server: チェック: typeof obj.then === 'function'?
Server-->>Server: YES (汚染による)
end
Server->>Server: 悪意のある .then() を Await/実行
Note right of Server: 悪意のある JS コードが実行される (RCE)
Server-->>Attacker: 応答 (Action Redirect / Error info)その結果、サーバーがこの操作された Promise を処理する際に、攻撃者によって注入された JavaScript コードが実行され、システムコマンドの実行につながる可能性があります。同梱の main.py は、この攻撃シナリオを再現するサンプルコードです。
この脆弱性は、App Router を使用する Next.js アプリケーションに影響します。
修正バージョン:
next.js/: 脆弱性のある Next.js Web アプリケーションのサンプルコード。exploit/: Python で書かれたエクスプロイト実行スクリプト (main.py)。まず、ターゲットの Next.js サーバーを起動する必要があります。
next.js ディレクトリに移動します:
cd next.js
依存関係をインストールします:
npm install
# yarn または pnpm も使用できます。
開発サーバーを起動します:
npm run dev
ブラウザで http://localhost:3000 にアクセスできることを確認してください。
次に、Python スクリプトを使用して脆弱性をテストできます。
プロジェクトルートから exploit ディレクトリに移動します:
cd exploit
(オプション) 仮想環境の使用を推奨します:
python3 -m venv venv
source venv/bin/activate # Windows の場合: venv\Scripts\activate
必要なライブラリをインストールします:
requests モジュールが必要です。
pip install requests
スクリプトを実行します:
python main.py
デフォルトではローカルアドレス (http://localhost:3000) を対象とします。別のアドレスをテストするには、--url オプションを使用します:
python main.py --url http://target-ip:3000
このコードはセキュリティ研究および教育目的でのみ提供されています。許可なくシステムやネットワークに対してこのツールを使用することは違法であり、そのような使用により生じたいかなる問題についても、ユーザーが単独で責任を負うものとします。