React2Shell(CVE-2025-55182): React Server Components RCE 분석
RSC payload 역직렬화 취약점의 배포 영향과 안전한 의존성 검증
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.json에 react가 있다는 사실만으로 취약 판정을 내리면 대규모 오탐이 발생한다.
crafted Server Function request
└─ framework RSC endpoint
└─ React Flight payload decoder
└─ unsafe deserialization
└─ Node.js process 권한의 code execution
자산 판정 절차
- Git 저장소가 아니라 배포된 image/bundle의 lockfile과 SBOM을 기준으로 한다.
- 세 개의
react-server-dom-*package 중 하나가 설치됐는지 확인한다. - framework가 RSC route를 외부에 제공하는지 확인한다.
- 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를 함께 기록한다.