Skip to content

🚨 [紧急] React 19/Next.js 惊现核弹级 RCE 漏洞 (CVE-2025-55182)

这个月初,React 团队联合 Next.js 发布了一个让整个前端圈炸锅的安全公告。简单来说,如果你在用 Next.js 15 或者 React 19 的 RSC(服务端组件)功能,你的服务器基本上就处于“裸奔”状态。

这不是危言耸听,CVE-2025-55182 是一个满分(10.0)的 远程代码执行(RCE)漏洞。攻击者不需要任何账号,不需要登录,只要你的接口能通,就能通过一段特制的 HTTP 请求直接 hack 你的服务器。

废话不多说,不做情绪输出。本文直接从原理层扒一下这个漏洞是怎么利用 Flight 协议搞事情的,以及怎么紧急止血。

失控的 Flight 协议

要搞懂这个漏洞,得先看 React 19 的核心机制 —— Flight 协议

React Server Components (RSC) 为了让服务端和客户端无缝通信,搞了一套很强的序列化协议。它不仅能传 JSON,还能传 PromiseMap 甚至 React 元素。

问题出在哪? 出在服务端解析数据包(反序列化)的 react-server-dom-webpack 包上。

当 Next.js 处理 Server Action 请求时,会解析客户端发来的 Payload。这个解析器在还原对象时,过于信任了客户端输入。它没有对传入的对象结构做严格的白名单校验,导致攻击者可以构造一种特殊的“恶意对象”,诱导服务端去加载或执行非预期的代码。

说白了:服务端把客户端发来的“数据”当成了“指令”去执行了。


二、 攻击路径推演 (图解)

这是一次典型的 反序列化漏洞 (Insecure Deserialization) 利用。下面这张图展示了攻击者是如何绕过业务逻辑,直接 hack。


Payload 是怎么生效的?

很多同学看到这可能会想:“我 Server Action 里用了 Zod 做 Schema 校验,参数不对直接 throw error,应该没事吧?”

大错特错

这个漏洞最鸡贼的地方在于:它发生在你的业务代码(包括 Zod 校验)执行之前。

React 的底层解析器在处理 HTTP Body 时,为了还原复杂的 JS 对象(比如 Promise、Map),会进行反序列化。攻击者构造的 Payload 实际上是在“欺骗”解析器:

正常逻辑: 解析器看到数据 -> 还原成对象 -> 传给你的 Server Action。

漏洞逻辑: 解析器看到数据 -> 发现这是一个“懒加载模块” -> 自动尝试 require 加载它。

只要请求进入 React 的底层解析流程,攻击就已经完成了。 哪怕你的业务逻辑写了满屏的 if-else 防御,都没机会执行。

为了方便理解,我们模拟一段简化的攻击 Payload(非真实场景,仅作原理解析):

1. 正常请求: 浏览器告诉服务器:“我是个 ID 为 1 的组件引用”。

json
["$@1", ["$K2", "Hello World"]]

2. 恶意 Payload (攻击视角): 攻击者通过脚本,构造了一个指向 Node.js 核心模块的引用。由于 react-server-dom-webpack 在处理 lazy loading 或模块引用时缺乏路径限制,解析器会尝试加载这个模块。

javascript
// 伪代码:模拟攻击者构造的数据包
const maliciousPayload = [
  '$@1',
  {
    // 伪装成一个 React 内部使用的懒加载模块引用
    $$typeof: 'react.lazy',
    _payload: {
      // 关键点:利用解析逻辑中的 require 行为
      // 指向系统核心库,并尝试调用危险方法
      module_id: 'child_process',
      function_name: 'execSync',
      args: ['whoami > /tmp/hacked'],
    },
  },
]

当这段数据被解析时,服务端一旦执行了类似 require(module_id) 的操作,execSync 就会被调用,此时你的服务器就会被其他人调用。


影响范围

这次打击面非常广,Next.js 15 的 App Router 用户是重灾区。请立刻检查 package.json

🔴 高危人群 (必须立即处理)

  • Next.js 用户
    • v15.0.0 ~ v15.0.4
    • v15.1.0 ~ v15.1.8
  • 原生 React RSC 用户
    • react-server-dom-webpack 版本在 19.0.0 ~ 19.2.0 之间

🟢 安全人群

  • Next.js 14 及以下版本(Pages Router / App Router 均不受此 CVE 影响)
  • 纯客户端渲染 (CSR) 项目(没用 RSC Server)
  • 静态导出项目 (output: export)

别犹豫,立刻升级

官方已经发布了 Hotfix,除了升级别无他法。不要试图自己去 Patch 源码,风险太大。

Next.js 项目升级指南

直接把核心包拉到最新版:

bash
# npm
npm install next@latest react@latest react-dom@latest

# pnpm
pnpm up next react react-dom --latest

⚠️ 校验标准: 安装完后,打开 package.jsonpnpm-lock.yaml 确认:

  • next 版本需 >= 15.1.9 (如果是 15.0.x 分支,需 >= 15.0.5)

原生 React 项目

如果你没用 Next.js,而是自己搭的 RSC,请立马锁定服务端 DOM 包:

bash
npm install react-server-dom-webpack@19.2.1

最后几句建议

  1. 排查日志:升级完还不算完。建议让运维查一下过去 24 小时的 Nginx/Server 日志,看看有没有奇怪的 POST 请求或者非预期的子进程调用。
  2. 锁定版本:这种时候就别相信语义化版本了,package-lock.json 锁死,防止 CI 自动重装又回退到有缓存的脏版本。
  3. 心态:Server Actions 让前端写接口爽了,但也把前端真正推到了“后端安全”的深水区。以后敲下 'use server' 的时候,脑子里一定要有根弦:这行代码是在裸露的服务器上跑的,不是在用户的浏览器里。

Last updated: