文章总结: 文章详细分析了Next.js中的远程代码执行漏洞CVE-2025-66478/CVE-2025-55182,该漏洞CVSS评分10.0,影响react-server-dom-webpack等包的多个19.x版本。漏洞源于React服务器组件处理特定格式multipart/form-data请求时的缺陷,利用冒号分隔对象属性的特性可导致服务器崩溃。文章提供了漏洞复现方法和检测工具,建议立即升级到19.0.1、19.1.2或19.2.1版本以修复该漏洞。
综合评分: 90
文章分类: 漏洞分析,WEB安全,漏洞预警
Next.js RCE(CVE-2025-66478/CVE-2025-55182)
原创
98
OneTS安全团队
2025年12月5日 10:43
上海
点击蓝字
关注我们
声明
本文属于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
- react-server-dom-webpack
- react-server-dom-parcel
- react-server-dom-turbopack
资产测绘平台Dork
body="create-next-app"
漏洞复现
工具地址:
https://github.com/assetnote/react2shell-scanner/blob/master/scanner.py
POST / HTTP/1.1Host: hostnameUser-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.0Next-Action: xX-Nextjs-Request-Id: b5dce965Next-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%5DContent-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3SadX-Nextjs-Html-Request-Id: SSTMXm7OJ_g0Ncx6jpQt9Content-Length: 232------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="1"
{}------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="0"
["$1:a:a"]------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
如果响应包是如下内容,说明存在漏洞
HTTP/1.1 500 Internal Server ErrorVary: rsc, next-router-state-tree, next-router-prefetch, next-router-segment-prefetch, Accept-EncodingCache-Control: no-cache, no-store, max-age=0, must-revalidatex-nextjs-cache: HITx-nextjs-prerender: 1Content-Type: text/x-componentDate: Fri, 05 Dec 2025 02:16:41 GMTConnection: keep-aliveKeep-Alive: timeout=5Content-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:
------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="0"
["$1:a:b"]------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="1"
{"a":{"b":"foo"}}------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
将转化为以下内容:
"$1:a:b" -> {"a":{"b":"foo"}}.a.b -> "foo"
在存在漏洞的 React Server 版本中,我们可以通过以下 multipart 请求强制返回 500 错误:
------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="0"
["$1:a:a"]------WebKitFormBoundaryx8jO2oVc6SWP3SadContent-Disposition: form-data; name="1"
{}------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
之所以会引发异常,是因为它最终转化为到以下内容:
"$1:a:a" -> {}.a.a -> (undefined).a -> 500
React 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
High Fidelity Detection Mechanism for RSC/Next.js RCE (CVE-2025-55182 & CVE-2025-66478)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:OneTS安全团队 98《Next.js RCE(CVE-2025-66478/CVE-2025-55182)》