# 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의 치명적(CVSS v3.1: 10.0) 원격 코드 실행(RCE) 취약점인 CVE-2025-55182에 대한 석사 학위 논문 연구를 담고 있습니다.
이 취약점은 React Flight 프로토콜의 안전하지 않은 역직렬화 메커니즘에서 비롯됩니다. Next.js는 Server Actions를 처리할 때 수신된 multipart 페이로드를 적절한 검증 없이 역직렬화합니다. 공격자는 프로토타입 체인을 오염시키고 임의의 JavaScript를 주입하는 악성 페이로드를 제작할 수 있으며, 이 JavaScript는 Function 생성자(이후 child_process.execSync())를 통해 서버에서 실행됩니다.
CVE-2025-66478 참고: Vercel은 이 동일한 취약점의 Next.js 특정 영향을 추적하기 위해 병행 CVE를 발행했습니다. Next.js가 React를 벤더링(vendored) 방식으로 번들하기 때문에 많은 의존성 스캐너가 이를 자동으로 취약한 것으로 감지하지 못합니다. 미국 국가 취약점 데이터베이스(NVD)는 CVE-2025-66478을 CVE-2025-55182의 중복으로 공식 기각했지만, Vercel 자체 보안 권고에서는 계속 참조되고 있습니다.
후속 취약점: React 팀은 이후 초기 패치 버전(19.0.1, 19.1.2, 19.2.1)에 존재하는 두 가지 추가 이슈를 공개했습니다: CVE-2025-55184(서비스 거부, CVSS 7.5) 및 CVE-2025-55183(소스 코드 노출, CVSS 5.3). 세 가지를 모두 해결하려면 19.0.2, 19.1.3 또는 19.2.2로 업그레이드해야 합니다.
| 측면 | 설명 |
|---|---|
| 네 가지 공격 모듈 | 프로젝트 삭제, 웹사이트 변조, 환경 변수 탈취, 서버 종료 |
| 인터랙티브 셸 | 특수 명령 및 복원 기능을 갖춘 지속형 셸 |
| 안정적인 데이터 유출 | HTTP 헤더 크기 제한을 우회하는 줄 단위 읽기 |
| 복원 스크립트 | 공격 후 안전한 실험실 복원 |
| 학술 문서화 | 근본 원인, 페이로드 분석 및 취약점 타임라인 |
CVE-2025-55182/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ ├── exploit-explanation.md # Exploit usage documentation
│ └── react2shell.py # Main exploit — 4 attack modules + interactive shell
│
├── vulnerable-app/ # Vulnerable Next.js application
│ ├── README.md # Original vulnapp credits
│ ├── package.json # React 19.0.0 (vulnerable)
│ ├── app/ # Application source code
│ ├── curl_id.sh # Original exploit script (by zack0x01)
│ └── scripts/
│ └── restore.sh # Restoration script (my contribution)
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 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 # Vulnerability root cause analysis
├── 02-payload-breakdown.md # Payload structure and execution flow
└── 03-timeline.md # CVE timeline
vulnerable-app/에 제공)cd vulnerable-app
npm install --legacy-peer-deps
npm run dev
# App available at http://localhost:3000
cd ../exploit
# Check if target is vulnerable
python3 react2shell.py -u http://localhost:3000 --check
# Execute single command
python3 react2shell.py -u http://localhost:3000 -c "whoami"
# Interactive shell mode
python3 react2shell.py -u http://localhost:3000 -i
| 모듈 | 명령 | 설명 | 영향 |
|---|---|---|---|
| 프로젝트 삭제 | --delete-projects | 대시보드에서 모든 프로젝트 삭제 | 데이터 파괴 |
| 웹사이트 변조 | --deface "message" | 메인 페이지 교체 | 변조 |
| 환경 변수 탈취 | --steal-env | 환경 변수 탈취 | 정보 유출 |
| 서버 종료 | --shutdown-servers | 모든 서버 종료 | 서비스 거부 |
React Server Components는 사용자 지정 직렬화/역직렬화 메커니즘("Flight" 프로토콜)을 사용하여 서버에서 클라이언트로 컴포넌트 데이터를 전송합니다. 서버는 서버 액션을 처리할 때 수신된 페이로드를 적절한 검증 없이 역직렬화합니다.
핵심 결함은 동작에 대한 신뢰(behavioral trust)입니다. 역직렬화기는 속성이 객체에 직접 속하는지 확인하지 않고 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] Send crafted multipart POST to any Server Action endpoint
2. [SERVER] React deserializer processes malicious JSON
3. [SERVER] Prototype pollution poisons Object.prototype.then
4. [SERVER] Plain object treated as thenable; Function constructor reached
5. [SERVER] new Function(_prefix) executes attacker's arbitrary JavaScript
6. [SERVER] execSync() runs system command; output captured
7. [SERVER] Output embedded in NEXT_REDIRECT error digest
8. [SERVER] Next.js returns X-Action-Redirect header with URL-encoded output
9. [ATTACKER] Extract and URL-decode command result from header
모든 테스트는 네트워크에 노출되지 않은, Kali Linux 2026.1과 Next.js 15.0.0 및 React 19.0.0을 실행하는 격리된 VirtualBox VM에서 수행되었습니다.
| 공격 모듈 | 결과 | 비고 |
|---|---|---|
| 명령 실행 | ✅ RCE 확인 | whoami, id, uname -a 안정적으로 작동 |
| 프로젝트 삭제 | ✅ 대시보드 변경 | 프로젝트 제거, React 구조 유지 |
| 웹사이트 변조 | ✅ 웹사이트 변조 성공 | 사용자 지정 메시지 표시 |
| 환경 변수 탈취 | ✅ 환경 변수 추출 | stolen_env.txt에 저장 |
| 서버 종료 | ✅ 모든 서버 중지 상태로 표시 | UI 업데이트, React 정상 작동 |
| 인터랙티브 셸 | ✅ 지속형 셸 | 특수 명령 사용 가능 |
| 복원 | ✅ 원래 상태 복원 | restore.sh 스크립트 사용 |
결정론(Determinism): 힙 스프레이(heap spray)와 같은 확률적 익스플로잇과 달리, CVE-2025-55182는 완전히 결정론적입니다. 올바르게 구성된 HTTP POST 요청은 React Server Components가 활성화된 React 19.0.0–19.2.0을 실행하는 패치되지 않은 모든 시스템에서 확률 1로 RCE를 생성합니다.
이 연구는 여러 환경에서 N-Day 취약점을 분석하는 사이버보안 석사 학위 논문(UCAM — Campus Internacional de Ciberseguridad)의 일부입니다.
이 CVE는 논문 내 현대 JavaScript 프레임워크 벡터를 나타내며 다음을 시연합니다:
키워드: RCE · Prototype Pollution · Deserialization · React · Next.js · Server Actions · CVE-2025-55182
Annais Molina (devianntsec) — 보안 연구원 | 사이버보안 석사 (UCAM)
MIT 라이선스 — LICENSE 참조
이 저장소는 학술 석사 학위 논문의 일부로서 교육 및 보안 연구 목적으로만 제공됩니다. 모든 테스트는 네트워크에 노출되지 않은 격리된 가상 머신에서 수행되었습니다. 소유한 시스템 또는 테스트에 대한 명시적인 서면 승인을 받은 시스템에서만 사용하십시오. 승인되지 않은 시스템에 대한 무단 사용은 불법이며 형사 기소로 이어질 수 있습니다.