# 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를 생성합니다.
| 문서 | 설명 |
|---|---|
| 근본 원인 분석 | React Flight의 역직렬화 결함 및 프로토타입 오염 |
| 페이로드 분석 | 악성 JSON 구조의 줄 단위 분석 |
| CVE 타임라인 | 발견, 공개 및 패치 연대표 |