React(RSC)漏洞是真实存在的,正在伤害工程团队
Source: Dev.to

Introduction
如果你从事 Web 工程,2026 年的转折点并不是由新特性定义的,而是由一个令人恐惧的认识所决定:客户端与服务器之间的边界已经被打破。
在十二月,React2Shell(CVE‑2025‑55182)暴露了 React Server Components 中的关键远程代码执行(RCE)漏洞。团队刚刚修补完毕,随后又出现了另外两个同子系统的高危利用。本文是权威的技术事后分析。
“React2Shell” 远程代码执行 (CVE‑2025‑55182)
要了解为什么这个漏洞(CVSS 10.0)如此毁灭性,首先必须弄清它破坏的机制:React Flight 协议。
多年来,React 开发者的思维模型很简单:React 在浏览器中渲染 UI,API(REST/GraphQL)负责获取数据。服务器和客户端是两个独立的世界,由明确的网络边界分隔。
React Server Components(RSC)打破了这层边界。
在 RSC 世界中,服务器不再向客户端发送 HTML,而是流式传输一种专有的序列化格式,称为 Flight。该流包含:
- UI 组件的描述
- 序列化的数据
- Promise,用于解析为数据
React2Shell 工作原理
React2Shell 并非普通的 SQL 注入或 XSS,而是针对反序列化器的逻辑滥用。攻击者构造了带有特定 Flight 负载的 HTTP POST 请求。这些类似二进制的流模拟了有效的组件树,同时隐藏了一个 Thenable 对象(伪 Promise)。
| 步骤 | 描述 |
|---|---|
| 注入 | 攻击者发送包含恶意 __proto__ 键的序列化对象。 |
| 反序列化 | 服务器解析流并尝试解析伪 Promise。 |
| 原型污染 | 缺乏消毒导致 __proto__ 覆盖运行中的 Node.js 进程的 Object.prototype。 |
| 利用链 | 被修改的原型触发内部调用,最终触及 Function 构造函数。 |
| 执行 | 对 Function 的访问使得任意代码(如 require('child_process').exec(...))被立即编译并执行。 |
Next.js 受影响的方式
由于 Next.js App Router 默认启用 RSC,所有 Next.js 应用(15.x、16.x 版本以及 canary 构建)开箱即存在漏洞。你不需要编写有缺陷的 Server Action 来被攻击,甚至不必显式使用 Server Components。如果你的应用导入了 react-server-dom-webpack,它就会监听这些 Flight 负载。
图片来源:Next.js
DevOps 噩梦
WAF 失明
标准的 Web 应用防火墙(WAF)被训练去检测经典攻击,例如 SQL 注入 (' OR 1=1) 或脚本标签 (<script>)。它们 没有被训练去检查 React Flight 的专有文本格式,因此恶意负载最初直接穿过 Cloudflare 和 AWS WAF 规则。
供应链地狱
漏洞深藏在 node_modules 中。你不能简单地“修复代码”。必须等待 Vercel 和 React 团队发布修补后的二进制文件,然后重新构建并重新部署每一个微服务。
Source: …
余震(DoS 与泄露)
就在工程团队从 RCE 恐慌中恢复时,安全社区又发现了基础设施的更多裂缝。2025 年 12 月 11 日,React 团队发布了针对 三 个额外 CVE 的新安全通告。
虽然这些并非 RCE,但它们在运营层面极具破坏性,凸显了当前序列化实现的脆弱性。
1. 拒绝服务(CVE‑2025‑55184)
严重程度: 高 (7.5/10)
该漏洞允许攻击者仅通过一次请求就“冻结”基础设施。
机制
Flight 协议允许数据块相互引用。研究人员发现可以在负载中制造 循环依赖:
- 块 A 引用块 B。
- 块 B 引用块 A。
当 React 反序列化器尝试解析此结构时,会进入 无限同步循环。
对基础设施的影响
由于 Node.js 为单线程模型,这个无限循环会阻塞事件循环,导致整个进程失去响应。在典型的 Next.js 部署中,单个被利用的请求即可使整台服务器或容器宕机,从而对整批实例造成拒绝服务攻击。
2. 源代码泄露(CVE‑2025‑55185)
严重程度: 中 (6.2/10)
Flight 反序列化器的缺陷使攻击者能够请求内部模块标识符,这些标识符随后在错误信息中被回显。结合原型污染漏洞,攻击者可以获取服务器端源码片段,泄露业务逻辑,甚至可能暴露 API 密钥。
3. 未经身份验证的 Server‑Action 调用(CVE‑2025‑55186)
严重程度: 高 (7.8/10)
Server Actions(在 Next.js 15 中引入)本应通过客户端携带 CSRF 令牌来调用。该漏洞在请求体包含特制的 Flight 负载时绕过了令牌检查,使未认证用户能够触发任意服务器端逻辑(例如数据库写入、邮件发送等)。
经验教训与缓解措施
| 区域 | 建议 |
|---|---|
| 补丁管理 | 将 React 和 Next.js 锁定到版本 ≥ 16.0.3(或最新的安全补丁版本)。使用内部镜像来强制使用批准的二进制文件。 |
| WAF 规则 | 扩展 WAF 签名以检查二进制 Flight 负载。查找异常大的 __proto__ 字段或重复的块引用。 |
| 运行时加固 | 在生产环境中禁用 Function 构造函数(--disable-features=FunctionConstructor)。对任何动态代码执行使用 vm 沙箱。 |
| 可观测性 | 为 Flight 反序列化延迟和块引用深度添加指标。对可能表明 DoS 攻击的峰值触发警报。 |
| 供应链审计 | 在每次依赖升级后运行 npm audit 和 yarn audit。考虑使用能够了解 React 特定攻击面的工具,如 Snyk。 |
| 零信任部署 | 将每个 Next.js 服务部署在 sidecar 之后,sidecar 在流入 Node.js 进程之前根据模式验证传入的 Flight 流。 |
结束语
React2Shell 事件表明,客户端‑服务器边界不再是安全的抽象——它是一个可被攻击者利用的可变表面。随着进入 2026 年更深阶段,团队必须像对待 REST/GraphQL API 那样严格对待序列化格式(如 Flight):严格的模式验证、彻底的模糊测试以及持续的监控。
保持警惕,及时更新依赖,永远不要假设“仅服务器端”代码自动安全。
1. 拒绝服务 (CVE‑2025‑67779)
Severity: 严重 (Critical) (9.8/10)
Impact:
- CPU Spike: CPU 立即飙升至 100 %。
- Request Drops: 服务器停止响应 所有 其他用户的请求。健康检查失败。
- Cluster Destabilization: 在 Kubernetes 中,存活探针可能会失败,导致 Pod 重启。如果攻击者持续发送这些请求,整个集群可能会进入 CrashLoopBackOff 状态,从而实际上使应用下线。
Note: 最初的修复并不完整,导致出现 CVE‑2025‑67779(即“修复的修复”),迫使 DevOps 团队在两周内第三次为系统打补丁。
2. 源代码泄露 (CVE‑2025‑55183)
Severity: Medium (5.3/10)
Why it matters:
This is arguably the most embarrassing vulnerability for the React ecosystem. It allows attackers to trick servers into sending source code back to clients.
Mechanism
The exploit relies on JavaScript string coercion. If a Server Action returns an object that implicitly calls .toString() on a function within the server runtime, V8’s default behavior returns the function source code.
“Secrets” Risk
Developers often assume code inside use server files is private. They might write:
// DO NOT DO THIS
const STRIPE_KEY = "sk_live_12345";
export async function purchase() { /* … */ }
Under normal circumstances, STRIPE_KEY stays on the server. With CVE‑2025‑55183, an attacker can manipulate the serialization of the return value to dump the function’s scope, potentially revealing hard‑coded API keys, internal comments, and database‑schema details.
Immediate Action Plan
如果您正在使用 Next.js App Router (v13.3+) 或 React 19,请 立即 执行以下步骤。
“立即”更新
不要依赖语义化版本范围。将依赖固定到明确修复 所有 相关 CVE 的版本。
npm install react@19.0.2 react-dom@19.0.2 next@15.1.3
# Verify deeply nested dependencies
npm list react-server-dom-webpack
确保
react-server-dom-webpack的版本至少为 19.0.2。
实施限流
DoS 利用成本低廉,攻击者容易发起。请在基础设施层面(Nginx、Cloudflare、AWS WAF 等)对 所有 路由——尤其是 POST 请求——实施严格的限流。
审计机密信息
假设您的服务器代码 可能 泄露。扫描 app/ 目录。如果在 .ts 或 .js 文件中发现任何 API 密钥、硬编码密码或内部 IP 地址,请 立即 将其移至环境变量。
结论
React Server Components 是网络的强大演进,但 “React2Shell” 已经表明,这种强大带来了可怕的新攻击面。Flight 协议非常复杂,正如我们所见,复杂性是安全的敌人。
感谢阅读!如果你觉得本文有帮助,请考虑分享给可能受益的其他人。欢迎浏览我的其他博客文章并在社交媒体上关注我。


