Hotdry.

Article

React Server Components DoS 与源码泄露漏洞实战加固:协议校验缺失与流式隔离失效

剖析 RSC CVE-2025-55184/55183 DoS 与源码泄露根因,给出协议校验、端点隔离、监控阈值的工程化参数与清单。

2025-12-11application-security

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)。隔离失效体现在:

  1. 端点默认暴露:Next.js App Router 默认开启 RSC Payload 端点,无需显式配置即公网可达。攻击无需认证,直击 POST /_next/rsc/_rsc
  2. 共享解析器:组件渲染与函数调用共用 Deserializer,无沙箱区分。流式 chunk 中混入 Function 调用时,污染 payload 扩散至整个渲染管道。
  3. 无深度限流:流式解析不校验 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。

资料来源

(正文字数:1256)

application-security