React (RSC) 漏洞真实存在,正在影响工程团队
Source: Dev.to

介绍
如果你从事 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。 |
| Gadget 链 | 被修改的原型触发内部调用,最终触及 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 团队发布修补后的二进制文件,然后重新构建并重新部署每一个微服务。
余震(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)
严重程度: 关键 (9.8/10)
影响:
- CPU 峰值: CPU 会立即飙升至 100 %。
- 请求丢失: 服务器停止响应所有其他用户。健康检查失败。
- 集群不稳定: 在 Kubernetes 中,存活探针可能会失败,导致 pod 重启。如果攻击者持续发送这些请求,整个集群可能会进入 CrashLoopBackOff 状态,从而实际上使应用下线。
注意: 最初的修复不完整,导致 CVE‑2025‑67779(“修复的修复”),迫使 DevOps 团队在两周内第三次为系统打补丁。
2. Source‑Code Leak (CVE‑2025‑55183)
Severity: Medium (5.3/10)
Why it matters:
这可以说是 React 生态系统中最尴尬的漏洞。它允许攻击者欺骗服务器,将源代码返回给客户端。
Mechanism
该利用依赖于 JavaScript 字符串强制转换。如果 Server Action 返回的对象在服务器运行时隐式调用了函数的 .toString(),V8 的默认行为会返回该函数的 源代码。
“Secrets” Risk
开发者常常认为 use server 文件中的代码是私有的。他们可能会写:
// DO NOT DO THIS
const STRIPE_KEY = "sk_live_12345";
export async function purchase() { /* … */ }
在正常情况下,STRIPE_KEY 只会保留在服务器上。利用 CVE‑2025‑55183,攻击者可以操纵返回值的序列化,导出函数的作用域,从而可能泄露硬编码的 API 密钥、内部注释以及数据库模式细节。
紧急行动计划
如果您正在使用 Next.js App Router (v13.3+) 或 React 19,请 立即 执行以下步骤。
“立即”更新
不要依赖语义化版本范围。将依赖固定到明确修复 所有 相关 CVE 的版本。
npm install react@19.0.2 react-dom@19.0.2 next@15.1.3
# 验证深层嵌套的依赖
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 协议很复杂,正如我们所见,复杂性是安全的敌人。
感谢阅读!如果您觉得本文有帮助,请考虑分享给可能受益的其他人。欢迎浏览我的其他博客文章并在社交媒体上关注我。


