
声明
本文属于OneTS安全团队成员98的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
漏洞描述
11 月 29 日,Lachlan Davidson 报告称 React 中存在一个安全漏洞,该漏洞允许未经身份验证的远程代码执行,其原理是利用 React 解码发送到 React 服务器函数端点的有效负载的方式中的一个缺陷。
该漏洞已披露为CVE-2025-55182/CVE-2025-66478,CVSS 评级为 10.0。
漏洞影响版本
该漏洞存在于以下版本的软件中:19.0、19.1.0、19.1.1 和 19.2.0
资产测绘平台Dork
body="create-next-app"漏洞复现
工具地址:
https://github.com/assetnote/react2shell-scanner/blob/master/scanner.py

POST / HTTP/1.1
Host: hostname
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
Next-Router-State-Tree: %5B%22%22%2C%7B%22children%22%3A%5B%22__PAGE__%22%2C%7B%7D%2Cnull%2Cnull%5D%7D%2Cnull%2Cnull%2Ctrue%5D
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
X-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9
Content-Length: 232
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
{}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
["$1:a:a"]
------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 02:16:41 GMT
Connection: keep-alive
Keep-Alive: timeout=5
Content-Length: 76
0:{"a":"$@1","f":"","b":"P7Y8oApw5sNqS49d5VxGA"}
1:E{"digest":"4263110034"}
为什么会出现
E{"digest"是因为 React-Server 依赖项使用冒号来分隔对象属性
function getOutlinedModel<T>(
response: Response,
reference: string,
parentObject: Object,
key: string,
map: (response: Response, model: any, parentObject: Object, key: string) => T,
): T {
const path = reference.split(':');
// ... snip ...
for (let i = 1; i < path.length; i++) {
value = value[path[i]];
}例如,如果我们像这样在multipart/form-data请求中传递 JSON:
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
["$1:a:b"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
{"a":{"b":"foo"}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--将转化为以下内容:
"$1:a:b" -> {"a":{"b":"foo"}}.a.b -> "foo"在存在漏洞的 React Server 版本中,我们可以通过以下 multipart 请求强制返回 500 错误:
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
["$1:a:a"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
{}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--之所以会引发异常,是因为它最终转化为到以下内容:
"$1:a:a" -> {}.a.a -> (undefined).a -> 500React Server Components 的补丁版本为这种冒号表示法添加了额外的检查,从而防止崩溃发生:
const name = path[i];
if (typeof value === 'object' && hasOwnProperty.call(value, name)) {
value = value[name];
}这意味着补丁版本,将不再收到 500 错误。
漏洞修复建议
版本19.0.1、19.1.2和19.2.1中已引入修复程序。如果您正在使用上述任何软件包,请立即升级到已修复的版本。
参考链接:
https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
https://react2shell.com/
https://github.com/assetnote/react2shell-scanner/blob/master/scanner.py
https://slcyber.io/research-center/high-fidelity-detection-mechanism-for-rsc-next-js-rce-cve-2025-55182-cve-2025-66478/