
CVE-2025-55182 / CVE-2025-66478 向け非同期 RCE スキャナー — React Server Actions 経由のプロトタイプ汚染 → コード実行。
プロトタイプ汚染 → React Server Actions を介したリモートコード実行
非同期・バージョン優先・出力ベースのカナリア検出 - 盲目的な推測は不要
[!WARNING] 認可されたセキュリティ研究およびペネトレーションテスト専用です。 明示的な書面による許可なくシステムをスキャンすることは違法です。 本ツールの誤用による責任は作者にはありません。
React Server Actions は、アクションデータをマルチパートフォームデータとしてサーバー側の実行コンテキストに直接渡します。影響を受けるバージョンの react-server-dom-webpack ではプロトタイプ汚染のサニタイズが不十分なため、攻撃者は以下を実行できます:
Object.prototype を汚染する細工されたマルチパートペイロードを注入する_response._prefix を上書きするprocess.mainModule.require('child_process').execSync(cmd)
これにより、影響を受けるバージョンの React で React Server Actions を使用する、一般公開された Next.js アプリケーション上で認証なしのリモートコード実行 (RCE) が可能になります。
CVE-2025-55182 - 広範囲: React 19 パッケージ (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack) に影響
CVE-2025-66478 - 限定的: / Server Action エンドポイントを介した Next.js 固有の悪用経路
本スキャナーは出力ベースのカナリア検証を使用します。これは、誤検知ゼロで実際のコード実行を確認する最も信頼性の高い方法です:
1. POST / with Next-Action header + multipart prototype-pollution payload
2. Payload executes: echo <random_canary>
3. Vulnerable server throws NEXT_REDIRECT with base64(canary) in the URL
4. Response header: X-Action-Redirect: /login?a=<base64(canary)>
5. Scanner decodes base64 → matches canary → RCE confirmed ✓
allow_redirects=False が重要です - 確認情報はリダイレクト先ではなくヘッダーに存在します。
git clone https://github.com/InferiorAK/React2Shell
cd React2Shell
pip install -r requirements.txt
# Required only if using --browser mode for improved version detection:
playwright install chromium
playwright install-deps chromium
必要条件: Python 3.10+
# Single target
python3 CVE-2025-55182_scanner.py -u https://target.com
# Scan a list of URLs
python3 CVE-2025-55182_scanner.py -f urls.txt
# Quiet mode - only print RCE / Vulnerable results
python3 CVE-2025-55182_scanner.py -f urls.txt -q
# Browser mode - headless Chromium for accurate version detection
python3 CVE-2025-55182_scanner.py -f urls.txt -b
# Full options - recommended for large-scale scanning
python3 CVE-2025-55182_scanner.py -f urls.txt -b -q -c 3 -t 20
スキャンされた各ターゲットには、次のいずれかの判定が割り当てられます:
出力ファイル(outputs/ フォルダに保存され、自動的に作成されます):
outputs/vuln.txt — RCE および VULNERABLE の結果(実行のたびに追記)outputs/unknown.txt — Unknown(バージョン不明)のターゲット。正確なバージョン検出のために -b を付けて再試行してくださいなぜ 90% 以上のサイトでバージョンが
unknownと表示されるのですか?
App Router アーキテクチャを使用する最新の Next.js 13+ は、フレームワークのバージョンを静的 HTML に埋め込むことはありません。そのバージョンは、実際のブラウザコンテキストで JavaScript が実行された後にのみ window.next.version に存在します。
--browser なしの場合:
__NEXT_DATA__、インラインスクリプト、ハッシュ化されたチャンクファイルに依存unknown を返す - バージョンベースのフィルタリングが回避される--browser (-b) を使用する場合:
window.next.version を直接読み取る# Recommended with browser mode - reduce concurrency (browser pages are resource-heavy)
python3 CVE-2025-55182_scanner.py -f urls.txt -b -c 3
スキャナーは最大 7 段階を実行し、バージョンが見つかった時点で停止します:
Stage 1 │ HTTP Response Headers
│ X-Powered-By: Next.js X.Y.Z
│ x-nextjs-*, x-next-version
Stage 2 │ Inline <script> Blocks (per-block scan)
│ window.next = { version: "X.Y.Z", ... }
│ version:"X.Y.Z", router: ... ← minified bundle adjacent-key pattern
│ "nextVersion":"X.Y.Z"
│ Next.js vX.Y.Z ← plain text in meta / HTML comments
│ __NEXT_VERSION__ = "X.Y.Z"
Stage 3 │ __NEXT_DATA__ JSON Blob
│ Pages Router only - "version":"X.Y.Z" safe in this context
Stage 4 │ Hashed Chunk URLs (extracted from <script src>)
│ /_next/static/chunks/*, /_next/static/app/*, /_next/static/runtime/*
│ Fetches up to 12 real bundle files, scans for version strings
Stage 5 │ Fixed-name Fallback Chunks
│ main.js, framework.js, webpack.js, _app.js, pages/_app.js
Stage 6 │ /package.json endpoint
│ Dev mode / misconfigured servers expose this directly
Stage 7 │ Playwright Headless Browser [--browser / -b only]
│ Evaluates window.next.version after full JS execution
│ Only triggered when stages 1–6 return "unknown"
本ツールは教育および認可されたセキュリティ研究のみを目的として公開されています。
作者である InferiorAK は、誤用によって生じたいかなる損害にも責任を負いません。
所有していないシステムをテストする前に、必ず書面による許可を取得してください。
私のリンク
| コンポーネント | 影響を受けるバージョン | 修正済みバージョン |
|---|
React react-server-dom-* | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | 19.0.1, 19.1.2, 19.2.1+ |
| Next.js 16.x | 16.0.0 – 16.0.6 | 16.0.7+ |
| Next.js 15.x | 15.0.0-15.0.4, 15.1.0-15.1.8, 15.2.0-15.2.5, 15.3.0-15.3.5, 15.4.0-15.4.7, 15.5.0-15.5.6 | 15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+ |
| Next.js 14.x | 14.3.0-canary.77+ カナリアビルドのみ | 安定版 14.x は全て - 影響なし |
| Next.js 13.x | - | 影響なし |
| フラグ | 長い形式 | デフォルト | 説明 |
|---|
-u | --url | - | 単一ターゲットURL |
-f | --file | - | 1行に1つのURLが含まれるファイル |
-o | --output | outputs/vuln.txt | 脆弱なターゲットの出力ファイル |
-U | --unknown-output | outputs/unknown.txt | バージョン不明のターゲットの出力ファイル |
-c | --concurrency | 5 | 同時HTTP接続数 |
-t | --timeout | 15 | リクエストごとのタイムアウト(秒) |
-q | --quiet | オフ | RCE / VULNERABLE の行のみ表示 |
-b | --browser | オフ | Playwright ヘッドレス Chromium によるバージョン検出のフォールバック |
| 判定 | 色 | 意味 |
|---|
RCE | 🔴 赤 | X-Action-Redirect でカナリアを確認 - リモートコード実行が実証済み |
VULNERABLE | 🟠 オレンジ | バージョンが脆弱な範囲内。RCEペイロードがエコーバックされなかった(WAF / 修正済み設定 / 誤ったエンドポイント) |
Unknown | 🟡 黄 | Next.js は確認されたがバージョンを検出できず - それでも RCE を試行。ブラウザモードでの再試行用に outputs/unknown.txt に保存 |
Not Vulnerable | 🟢 緑 | バージョンが修正済みと確認された、または RCE が明示的に安全と返された |
Skipped | ⚪ 白 | 修正済みが確認されたバージョン、または Next.js 以外のサイト - PoC は試行されない |
Error | ⚪ 白 | ホストに到達できない、または接続に失敗 |