
react CVE-2025-55182
심각도: Critical — CVSS 10.0
CWE: CWE-502 (신뢰할 수 없는 데이터 역직렬화)
공급업체: Meta (Facebook)
공개일: 2025년 12월 3일
CVE-2025-55182는 React Server Components(RSC)에서 발견된 최대 심각도의 인증되지 않은 원격 코드 실행(RCE) 취약점으로, React2Shell이라고 명명되었습니다. 이 결함은 React가 Flight 프로토콜을 통해 React Server Function 엔드포인트로 전송된 페이로드를 디코딩하는 방식에 있습니다. 공격자는 취약한 서버에 단일의 특수 제작된 HTTP POST 요청을 전송하여 임의의 코드를 실행할 수 있습니다. 자격 증명이나 사용자 상호작용이 필요하지 않습니다.
명시적인 Server Function 엔드포인트를 노출하지 않는 애플리케이션도 React Server Components를 지원하는 경우 여전히 취약합니다.
| 패키지 | 취약한 버전 | 패치된 버전 |
|---|
react-server-dom-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | ≥ 19.0.1 / 19.1.2 / 19.2.1 |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | ≥ 19.0.1 / 19.1.2 / 19.2.1 |
react-server-dom-turbopack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 | ≥ 19.0.1 / 19.1.2 / 19.2.1 |
영향을 받는 프레임워크 (취약한 React 패키지를 사용할 경우): Next.js 15.x / 16.x (App Router), React Router, Waku, RedwoodSDK, Parcel RSC, Vite RSC 플러그인.
| 메트릭 | 값 |
|---|---|
| 공격 벡터 | 네트워크 |
| 공격 복잡도 | 낮음 |
| 필요한 권한 | 없음 |
| 사용자 상호작용 | 없음 |
| 범위 | 변경됨 |
| 기밀성 | 높음 |
| 무결성 | 높음 |
| 가용성 | 높음 |
| 전체 점수 | 10.0 (Critical) |
벡터 문자열: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
React Server Components는 Flight 프로토콜이라는 바이너리 와이어 형식을 사용하여 서버에서 클라이언트로 컴포넌트 트리를 스트리밍합니다. 동일한 프로토콜이 Server Functions(이전 Server Actions)도 처리합니다. 이는 브라우저에서 직렬화된 인수를 수락하는 호출 가능한 엔드포인트입니다.
취약점은 역직렬화기에 있습니다. React가 Flight 페이로드를 처리할 때, 임의의 서버 측 객체를 인스턴스화하도록 속일 수 있어 완전한 RCE로 이어집니다. RSC가 활성화될 때마다 Flight 엔드포인트가 기본적으로 노출되고 프로토콜 수준에 인증 게이트가 없기 때문에, 익스플로잇에는 서버에 대한 네트워크 액세스만 필요합니다.
포함된 템플릿 CVE-2025-55182.yaml은 세 가지 상호 보완적인 탐지 방법을 사용합니다.
루트 경로에 Content-Type: text/x-component와 함께 최소한의 POST를 전송합니다. 취약한(또는 접근 가능한) RSC 서버는 동일한 콘텐츠 유형과 Flight 스트림 본문으로 응답하며, 해당 행은 영숫자 행 ID와 콜론(예: 0:, 1:) 또는 React 참조 기호($L, $S, $I, $@)로 시작합니다.
POST / HTTP/1.1
Content-Type: text/x-component
Accept: text/x-component, */*
매치 조건: HTTP 200 + text/x-component 헤더 + 본문의 Flight 스트림 정규식.
Next.js는 RSC: 1 헤더와 ?_rsc= 쿼리 매개변수를 통해 RSC 요청을 신호합니다. 이 요청은 브라우저 프리페치를 모방하여 App Router Flight 엔드포인트에 접근 가능한지 확인합니다.
GET /?_rsc=1 HTTP/1.1
Accept: text/x-component
RSC: 1
Next-Router-State-Tree: %5B%22%22%2C%7B%7D%5D
매치 조건: HTTP 200 + text/x-component 헤더.
Next-Action 헤더(Server Functions를 호출하는 메커니즘)와 함께 최소한의 잘못된 Flight 페이로드를 POST합니다. 취약한 서버는 페이로드를 역직렬화하려고 시도합니다. RSC 특정 헤더를 포함하는 오류 응답조차도 엔드포인트가 존재함을 확인합니다.
POST / HTTP/1.1
Content-Type: text/x-component
Next-Action: 0000000000000000000000000000000000000000
매치 조건: HTTP 200/400/500 + text/x-component 또는 x-action-revalidated 헤더.
로컬 *.json 파일(예: package-lock.json, yarn.lock)을 스캔하여 취약한 패키지 이름과 19.0.0, 19.1.0, 19.1.1 또는 19.2.0과 일치하는 버전 정규식을 찾습니다. 네트워크 트래픽 없이 저장소 또는 CI 파이프라인을 감사하는 데 유용합니다.
# Install / update Nuclei
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
nuclei -target CVE-2025-55182.yaml -u https://target.example.com
nuclei -target CVE-2025-55182.yaml -l targets.txt
nuclei -target CVE-2025-55182.yaml -target ./path/to/project
nuclei -target CVE-2025-55182.yaml -u https://target.example.com -v -je results.json
nuclei -target CVE-2025-55182.yaml -u https://target.example.com -rl 10 -timeout 10
즉시 업그레이드하여 패치된 버전으로 전환하세요:
# npm
npm install react-server-dom-webpack@latest
# yarn
yarn upgrade react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
# pnpm
pnpm update react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
브랜치별 최소 안전 버전:
| 브랜치 | 최소 안전 버전 |
|---|---|
| 19.0.x | 19.0.1 |
| 19.1.x | 19.1.2 |
| 19.2.x | 19.2.1 |
임시 완화 조치 (즉시 업그레이드가 불가능한 경우):
text/x-component 콘텐츠 유형을 대상으로 하는 WAF 규칙을 배포합니다(이 CVE에 대한 Google Cloud Armor 규칙이 공개적으로 제공됩니다).package-lock.json, node_modules 또는 SBOM을 검사해야 합니다.이 템플릿은 승인된 보안 테스트 및 취약점 평가 용도로만 제공됩니다. 귀하가 소유하지 않거나 명시적인 서면 허가 없이 시스템에 대해 실행하는 경우 불법일 수 있습니다. 저자는 오용에 대한 책임을 지지 않습니다.