React (RSC) 漏洞真实存在,正在影响工程团队

发布: (2026年1月9日 GMT+8 00:11)
12 分钟阅读
原文: Dev.to

Source: Dev.to

React (RSC) 漏洞真实存在,且正在伤害工程团队的封面图片

介绍

如果你从事 Web 工程,迈入 2026 年的转折点并不是由新特性定义的,而是由一个令人恐惧的单一认识所决定:客户端与服务器之间的边界已被打破

在十二月,React2ShellCVE‑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) 打破了这层边界。

React Flight Protocol diagram

在 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 协议允许数据块相互引用。研究人员发现可以在负载中制造 循环依赖

  1. 块 A 引用块 B。
  2. 块 B 引用块 A。

当 React 反序列化器尝试解析此结构时,会进入 无限同步循环

Node.js 事件循环阻塞示意图

对基础设施的影响
由于 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 audityarn 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 协议很复杂,正如我们所见,复杂性是安全的敌人。

感谢阅读!如果您觉得本文有帮助,请考虑分享给可能受益的其他人。欢迎浏览我的其他博客文章并在社交媒体上关注我。

Back to Blog

相关文章

阅读更多 »