SITUATION Security research & response knowledge base UTC+09 · SEOUL
INTELLIGENCE REPORT TLP:CLEAR

React2Shell(CVE-2025-55182): React Server Components RCE 분석

RSC payload 역직렬화 취약점의 배포 영향과 안전한 의존성 검증

#cve-2025-55182#react2shell#react#nextjs#supply-chain

TL;DR

  • RCE 영향 패키지: react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack의 19.0.0, 19.1.0–19.1.1, 19.2.0
  • 최초 RCE 수정선: 19.0.1, 19.1.2, 19.2.1
  • 2026년 후속 DoS/소스 노출까지 포함한 권장선: 19.0.4, 19.1.5, 19.2.4 이상
  • React 버전 문자열만 보지 말고 production bundle에 RSC server package가 실제 포함됐는지 확인한다.

기술 원리와 영향 조건

CVE-2025-55182는 React가 Server Function 요청을 decode하는 과정에서 조작된 payload를 안전하지 않게 역직렬화해 서버 측 코드 실행으로 이어지는 취약점이다. 애플리케이션이 직접 Server Function을 작성하지 않았더라도 사용하는 framework/bundler가 RSC를 지원하고 취약 server-dom package를 포함하면 영향받을 수 있다.

반대로 client-only React나 RSC를 지원하지 않는 도구 체인은 영향 대상이 아니다. package.jsonreact가 있다는 사실만으로 취약 판정을 내리면 대규모 오탐이 발생한다.

crafted Server Function request
  └─ framework RSC endpoint
      └─ React Flight payload decoder
          └─ unsafe deserialization
              └─ Node.js process 권한의 code execution

자산 판정 절차

  1. Git 저장소가 아니라 배포된 image/bundle의 lockfile과 SBOM을 기준으로 한다.
  2. 세 개의 react-server-dom-* package 중 하나가 설치됐는지 확인한다.
  3. framework가 RSC route를 외부에 제공하는지 확인한다.
  4. CDN/WAF 완화 여부와 무관하게 package를 수정선으로 올린다.

조사 포인트

  • 외부에 공개된 Server Function endpoint
  • Node 프로세스가 생성한 셸·다운로드 도구
  • 비정상 RSC 요청과 5xx 응답 급증
  • 환경 변수·클라우드 Token 접근
  • CI cache와 배포 이미지 digest

안전한 PoC 검증

RCE payload 대신 의존성 버전을 정적으로 확인한다.

npm ls react react-server-dom-webpack next
npm ls react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack --all

monorepo에서는 workspace root 한 번의 npm ls가 누락을 만들 수 있다. 각 배포 unit과 container layer를 검사하고 npm-shrinkwrap.json, pnpm/yarn lockfile도 포함한다.

침해 헌팅

RSC 요청 자체는 정상 트래픽이므로 payload 문자열 IOC에만 의존하지 않는다. 다음 상관관계를 우선한다.

  • Node 프로세스가 sh/bash/cmd/powershell 또는 download utility를 생성
  • RSC/Server Function endpoint의 비정상 body size, serialization error, 5xx 급증
  • 애플리케이션 identity의 /proc/*/environ, cloud metadata, secret mount 접근
  • Node 프로세스의 신규 외부 DNS·TCP 연결
  • 직후 생성된 cron, systemd unit, container 내 실행 파일

예시 Sigma 아이디어는 환경별 이미지 이름과 허용된 build 작업을 제외해야 한다.

selection_parent:
  ParentImage|endswith:
    - '/node'
    - '\\node.exe'
selection_child:
  Image|endswith:
    - '/sh'
    - '/bash'
    - '\\cmd.exe'
condition: selection_parent and selection_child

공개 exploit repository는 악성 코드가 섞일 수 있으므로 실행하지 않는다. React 공식 권고문의 영향 패키지와 수정 버전을 기준으로 clean build를 수행한다.

패치 후 검증과 한계

lockfile 업데이트, CI cache 삭제, 컨테이너 재빌드, image digest 교체 후 배포한다. 최초 RCE 수정 버전에 멈추지 말고 후속 CVE까지 반영된 19.0.4/19.1.5/19.2.4 이상을 사용한다. 노출 기간의 Node 자식 프로세스와 secret 접근을 조사하고 관련 Token을 회전한다.

WAF가 차단했다는 기록은 애플리케이션이 안전했다는 증거가 아니다. 우회 변형과 다른 ingress가 있을 수 있다. 또한 취약 package가 존재해도 RSC server path가 배포되지 않았다면 직접 영향은 낮으므로 SBOM 결과와 runtime route를 함께 기록한다.

References