CVE-2025-55182(React2Shell)に関する修士論文研究。6つの攻撃シナリオ(RCE、データ流出、改ざん)、インタラクティブリバースシェル、React Server Componentsのプロトタイプ汚染と安全でないデシリアライゼーションを研究するための完全な脆弱ラボを備えたモジュール式エクスプロイトフレームワーク。
信頼できないデータのデシリアライズ + React Server Components におけるプロトタイプ汚染
Next.js Server Actions を介した認証なしリモートコード実行
影響を受けるバージョン: React 19.0.0 - 19.2.0 · パッチ: React 19.0.1 / 19.1.2 / 19.2.1 (2025年12月3日)
高度なエクスプロイトのデモ - 脆弱なNext.jsアプリケーションに対するRCE基本コマンド、インタラクティブシェル、複数の攻撃ベクトル
このリポジトリは、React Server Components における の 脆弱性 に関する私の を含んでいます。
この脆弱性は、React Flight プロトコルにおける 安全でないデシリアライズ機構 に起因します。Server Actions を処理する際、Next.js は適切な検証を行わずに受信したマルチパートペイロードをデシリアライズします。攻撃者は、プロトタイプチェーンを汚染し、Function コンストラクタ(さらに child_process.execSync())を介してサーバー上で実行される任意のJavaScriptを注入する悪意あるペイロードを作成できます。
CVE-2025-66478 に関する注記: Vercel は、この同じ脆弱性の Next.js 固有の影響を追跡するために並行して CVE を発行しました。Next.js は React をベンダリングされた形でバンドルしているため、多くの依存関係スキャナはこれを自動的に脆弱として検出しません。US National Vulnerability Database (NVD) は公式に CVE-2025-66478 を CVE-2025-55182 の重複として却下しましたが、Vercel のセキュリティアドバイザリでは引き続き参照されています。
後続の脆弱性: React チームはその後、最初のパッチバージョン(19.0.1、19.1.2、19.2.1)に存在する追加の2つの問題を開示しました: CVE-2025-55184 (サービス拒否、CVSS 7.5) および CVE-2025-55183 (ソースコード漏洩、CVSS 5.3)。ユーザーは 19.0.2、19.1.3、または 19.2.2 にアップグレードして3つすべてに対処する必要があります。
| 側面 | 説明 |
|---|---|
| 4つの攻撃モジュール | プロジェクトの削除、Webサイトの改ざん、環境変数の窃取、サーバーのシャットダウン |
| インタラクティブシェル | 特殊コマンドと復元機能を備えた持続的シェル |
| 安定した流出 | HTTPヘッダーサイズ制限を回避するための1行ずつの読み取り |
| 復元スクリプト | 攻撃後の安全な実験室復元 |
| 学術文書 | 根本原因、ペイロードの内訳、脆弱性のタイムライン |
CVE-2025-55182/
├── README.md # このファイル
├── LICENSE # MITライセンス
│
├── exploit/
│ ├── exploit-explanation.md # エクスプロイト使用法のドキュメント
│ └── react2shell.py # メインエクスプロイト — 4つの攻撃モジュール + インタラクティブシェル
│
├── vulnerable-app/ # 脆弱なNext.jsアプリケーション
│ ├── README.md # 元のvulnappクレジット
│ ├── package.json # React 19.0.0 (脆弱)
│ ├── app/ # アプリケーションのソースコード
│ ├── curl_id.sh # 元のエクスプロイトスクリプト (by zack0x01)
│ └── scripts/
│ └── restore.sh # 復元スクリプト (私の貢献)
│
└── docs/
├── screenshots/ # エクスプロイテーションデモ
│ ├── 01-app-initial.png
│ ├── 02-rce-basic.png
│ ├── 03-interactive-shell.png
│ ├── 04-no-payload.png
│ ├── 05-delete-result.png
│ ├── 06-deface.png
│ ├── 07-shutdown-servers.png
│ ├── 08-restore-from-script.png
│ └── 09-restore-from-interactive-shell.png
│
└── analysis/
├── 01-root-cause.md # 脆弱性の根本原因分析
├── 02-payload-breakdown.md # ペイロード構造と実行フロー
└── 03-timeline.md # CVE タイムライン
vulnerable-app/ に同梱)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# App available at http://localhost:3000
cd ../exploit
# ターゲットが脆弱かどうかを確認
python3 react2shell.py -u http://localhost:3000 --check
# 単一コマンドを実行
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# インタラクティブシェルモード
python3 react2shell.py -u http://localhost:3000 -i
| モジュール | コマンド | 説明 | 影響 |
|---|---|---|---|
| プロジェクト削除 | --delete-projects | ダッシュボードからすべてのプロジェクトを削除 | データ破壊 |
| 改ざん | --deface "メッセージ" | メインページを置き換え | 改ざん |
| 環境変数窃取 | --steal-env | 環境変数を窃取 | 流出 |
| サーバーシャットダウン | --shutdown-servers | すべてのサーバーをシャットダウン | サービス拒否 |
React Server Components は、カスタムのシリアライゼーション/デシリアライゼーション機構(「Flight」プロトコル)を使用してコンポーネントデータをサーバーからクライアントに送信します。サーバーアクションを処理する際、サーバーは 適切な検証なし で受信ペイロードをデシリアライズします。
コアとなる欠陥は行動上の信頼です。デシリアライザは typeof obj.then === 'function' をチェックしてPromiseを識別しますが、そのプロパティがオブジェクトに直接属していることを検証しません。これにより、攻撃者は Object.prototype.then を汚染し、すべてのプレーンオブジェクトをthenableに見せかけることができます。
攻撃者は、以下のことを行う悪意のあるペイロードを作成できます:
__proto__:then を使用して プロトタイプチェーンを汚染$1:constructor:constructor を介して解決を Function コンストラクタに リダイレクトnew Function(_prefix) を介して 任意のJavaScriptを実行process.mainModule.require('child_process').execSync() を介して システムコマンドを実行X-Action-Redirect HTTP応答ヘッダーを介して 出力を流出User-mode (unauthenticated)
│
├─ POST / (Next.js Server Action endpoint)
│ ├─ Headers: Next-Action: x
│ └─ Multipart body with malicious JSON
│
└─ React Flight deserializer processes payload
└─ Prototype pollution via __proto__:then
└─ Function constructor reached via $1:constructor:constructor
└─ new Function(_prefix) executes attacker's JavaScript
└─ execSync() runs system command
└─ Output embedded in NEXT_REDIRECT error
└─ Next.js converts to X-Action-Redirect header
この脆弱性は、React Server Components とともに App Router(Next.js 14以降のデフォルト設定)を使用する任意のNext.jsアプリケーションに影響します。明示的に定義された Server Actions は 必須ではありません。影響を受ける RSC パッケージが存在するだけで十分です。
この脆弱性により、認証されていない攻撃者は以下を行うことができます:
1. [ANY] 任意の Server Action エンドポイントに細工したマルチパート POST を送信
2. [SERVER] React デシリアライザが悪意のある JSON を処理
3. [SERVER] プロトタイプ汚染が Object.prototype.then を汚染
4. [SERVER] プレーンオブジェクトが thenable として扱われ、Function コンストラクタに到達
5. [SERVER] new Function(_prefix) が攻撃者の任意の JavaScript を実行
6. [SERVER] execSync() がシステムコマンドを実行、出力をキャプチャ
7. [SERVER] 出力が NEXT_REDIRECT エラーダイジェストに埋め込まれる
8. [SERVER] Next.js が URL エンコードされた出力を含む X-Action-Redirect ヘッダーを返す
9. [ATTACKER] ヘッダーからコマンド結果を抽出し URL デコード
すべてのテストは、Kali Linux 2026.1、Next.js 15.0.0、React 19.0.0 を搭載した隔離された VirtualBox VM で、ネットワーク露出なしで実施されました。
| 攻撃モジュール | 結果 | 備考 |
|---|---|---|
| コマンド実行 | ✅ RCE 確認 | whoami、id、uname -a が確実に動作 |
| プロジェクト削除 | ✅ ダッシュボードが変更 | プロジェクトは削除され、React 構造は保持 |
| 改ざん | ✅ Webサイト改ざん | カスタムメッセージが表示 |
| 環境変数窃取 | ✅ 環境変数を抽出 | stolen_env.txt に保存 |
| サーバーシャットダウン | ✅ 全サーバーが停止表示 | UI更新、React は機能 |
| インタラクティブシェル | ✅ 持続的シェル | 特殊コマンド利用可能 |
| 復元 | ✅ 元の状態に復元 | restore.sh スクリプト経由 |
決定性: 確率的なエクスプロイト(例: ヒープスプレー)とは異なり、CVE-2025-55182 は完全に決定的です — 適切にフォーマットされた HTTP POST リクエストは、React 19.0.0–19.2.0 で React Server Components が有効な未パッチのシステム上で、確率 1 で RCE を生成します。
| 文書 | 説明 |
|---|---|
| 根本原因分析 | React Flight におけるデシリアライズの欠陥とプロトタイプ汚染 |
| ペイロード分析 | 悪意のある JSON 構造の一行ごとの分析 |
| CVE タイムライン | 発見、開示、パッチの時系列 |
この研究は、サイバーセキュリティ修士論文(UCAM — Campus Internacional de Ciberseguridad)の一部であり、複数の環境における N-Day 脆弱性を分析しています。
この CVE は、論文内の モダン JavaScript フレームワーク ベクトルを表し、以下を示しています:
キーワード: RCE · プロトタイプ汚染 · デシリアライズ · React · Next.js · Server Actions · CVE-2025-55182
Annais Molina (devianntsec) — セキュリティ研究者 | サイバーセキュリティ修士(UCAM)
MIT ライセンス — LICENSE をご覧ください。
このリポジトリは、学術的な修士論文の一環として、教育およびセキュリティ研究目的のみ で提供されています。すべてのテストは、ネットワーク露出のない隔離された仮想マシン上で実施されました。所有しているシステム、または明示的な書面によるテスト許可を得たシステムでのみ使用してください。許可なくシステムに対して使用することは違法であり、刑事訴追の対象となる可能性があります。