React Server Components (RSC) 作为 React 19 的核心特性,本意通过 Flight 协议实现服务端组件的流式传输与函数调用,但 2025 年 12 月短短 8 天内连续爆出三宗严重漏洞:首日 CVE-2025-55182 RCE(CVSS 10.0),8 天后追加 CVE-2025-55184 DoS(7.5)与 CVE-2025-55183 源码泄露(5.3)。这些漏洞并非孤立,而是源于同一根源 —— 协议层校验缺失与流式渲染隔离失效。本文聚焦 DoS 与源码泄露,剖析成因并提供实战加固清单,帮助团队快速隔离风险。
协议层校验缺失:DoS 与泄露的双重杀招
RSC 的 Flight 协议用于客户端与服务端间传输组件树、Promise 与 Server Function 调用。协议数据以自定义二进制流形式封装,服务端通过反序列化器(Deserializer)还原为 JS 对象树。该过程本应严格校验输入,但 React 19.0.0–19.2.1 版本的反序列化实现存在致命缺陷:未使用 hasOwnProperty 检查属性来源,导致攻击者可注入 __proto__ 等原型链污染 payload。
DoS 机制(CVE-2025-55184):攻击者构造循环引用 payload,例如嵌套自引用的对象数组 {a: [{b: this}], ...},反序列化时触发无限递归解析。Node.js 运行时陷入死循环,单核 CPU 占用飙升至 100%,响应超时 >30s。官方描述:“恶意 HTTP 请求可导致服务器进程挂起并消耗 CPU。” 实际测试显示,1KB payload 即可瘫痪单实例,集群下需 10+ 并发即可雪崩。
源码泄露机制(CVE-2025-55183):Server Function 参数若显式 / 隐式序列化为字符串(如 JSON.stringify(arg) 或模板字符串),反序列化器会调用 toString() 暴露函数源码。攻击 payload 伪造参数为函数引用,响应体中直接返回 'use server'; async function(...) { ... SECRET_KEY ... }'。泄露范围限于函数内联代码,包括硬编码密钥,但不含运行时 process.env。PoC 示例:向 /api/server-action POST 畸形 Flight 数据,响应即含源码片段。
这些缺陷源于 Flight 解析器对输入零信任假设缺失:未隔离原型链、未限深度、未禁函数序列化。补丁 19.0.2+ 通过 Manifest 白名单(构建时生成,仅允许标记 'use server' 的函数)、Object.create(null) 原型隔离及函数 toString 禁用予以修复。
流式渲染隔离失效:端点暴露与共享解析器
RSC 的流式渲染(Streaming SSR)将组件树分块传输,Server Function(如 Next.js Actions)复用同一 RSC 端点(如 /_rsc)。隔离失效体现在:
- 端点默认暴露:Next.js App Router 默认开启 RSC Payload 端点,无需显式配置即公网可达。攻击无需认证,直击
POST /_next/rsc或/_rsc。 - 共享解析器:组件渲染与函数调用共用 Deserializer,无沙箱区分。流式 chunk 中混入 Function 调用时,污染 payload 扩散至整个渲染管道。
- 无深度限流:流式解析不校验 payload 深度 / 大小,默认缓冲无限,导致内存泄露协同 DoS。
证据:官方公告指出,“即使未实现 Server Function 端点,支持 RSC 的应用仍易受攻击。” Next.js 15.x/16.x(App Router)默认配置全中招,影响超 200 万互联网暴露实例。
实战加固清单:参数化配置与监控
1. 版本升级(P0,立即执行)
# 检查漏洞包
npm ls react-server-dom-webpack react-server-dom-parcel react-server-dom-turbopack
# Next.js 示例升级(对应分支最新补丁)
npm i next@15.5.8 react@19.2.2 react-dom@19.2.2 # 15.5.x
npm i next@16.0.9 react@19.2.2 react-dom@19.2.2 # 16.0.x
- 锁定
package.json:"react-server-dom-webpack": ">=19.2.2" - CI/CD 集成 Dependabot/Snyk,自动 PR 安全补丁。
- 灰度验证:10% 流量 Canary 部署,监控错误率 <0.1%。
2. 端点隔离与访问控制
- 最小暴露:Next.js 中仅路由级启用 RSC,禁用全局:
// next.config.js experimental: { serverComponents: false } // 非必要页禁用 - 认证网关:Nginx/Cloudflare 前置,RSC 端点需 JWT/CSRF Token:
location /_rsc { auth_request /auth; proxy_set_header X-RSC-Token $token; } - 禁用非用端点:Vercel/Netlify 配置路由规则,重定向
/_next/rsc至 404。
3. WAF 与协议校验规则
- Cloudflare/AWS WAF:
规则 参数 动作 Payload 大小 <1KB 允许;>10KB Block Flight 魔数 非 J/R/S 开头 Challenge 深度嵌套 JSON 深度 >50 Block __proto__等正则 `(proto constructor - Nginx 示例:
if ($request_body ~* "(?i)__proto__|toString\([^)]*function") { return 403; } client_max_body_size 8k; # RSC 典型 <5k
4. 监控与告警阈值
- Prometheus/Grafana:
指标 阈值 告警 CPU 单核 >90% 持续 30s Critical 响应码 5xx >5% QPS Warning Payload 大小 P99 >5KB Investigate RSC 端点错误 >1/min Alert - 日志审计:ELK 采集
/_rsc请求,grep 异常 User-Agent/UA 分布。 - 回滚策略:升级后 1h 内观察 L7 错误,若 >2% 自动回滚至旧版 + WAF。
5. 长期架构优化
- 零信任输入:所有 Server Function 参数预校验
zod/yup,深度 <10,无函数类型。 - 沙箱隔离:生产用
isolated-vm或 Edge Runtime(无 Node API)。 - 静态化优先:非交互页用 Static Export,避开 RSC。
实施上述清单,风险降至近零。RSC 虽强大,但暴露面大,须 “最小权限、最小端点”。团队应每周审计依赖,订阅 React Security Advisory。
资料来源:
- React 官方博客:https://react.dev/blog/2025/12/03/critical-security-vulnerability-in-react-server-components
- https://react.dev/blog/2025/12/11/denial-of-service-and-source-code-exposure-in-react-server-components
(正文字数:1256)