Next.js 爆出 CVSS 10.0 满分漏洞:React2Shell 及其修复方案

7次阅读
没有评论

共计 2631 个字符,预计需要花费 7 分钟才能阅读完成。

最近这两天,前端圈子可谓是炸开了锅。如果你像我一样关注 Web 安全或者正在维护 Next.js 项目,那你可能已经被 React2Shell 这个名字刷屏了。

起初看到 "CVSS 10.0" 这个评分时,我心里咯噔一下——要知道,满分漏洞在应用层框架中可是极其罕见的,上一次让我印象这么深刻的可能还是 Log4j 的那个核弹级漏洞。这次的主角是我们熟悉的 Next.js,而且利用方式简单粗暴:不需要认证,直接远程代码执行(RCE)。

今天就来聊聊这个让无数开发者连夜修补的 React2Shell (CVE-2025-55182) 到底是个什么鬼,以及我们该如何应对。

什么是 React2Shell?

简单来说,React2Shell 是一个存在于 Next.js 和 React Server Components (RSC) 核心协议中的反序列化漏洞。

我们知道,Next.js App Router 引入了 React Server Components,这让服务器端渲染变得非常强大。为了让服务器组件和客户端组件“无缝衔接”,React 发明了一套叫做 "Flight" 的协议,用来把服务器上的组件树序列化成文本,传给浏览器,或者在 Server Actions 中传递数据。

而这个漏洞,就出在反序列化这个环节。

攻击者可以精心构造一个恶意的 payload(数据包),伪装成合法的 React 组件结构。当 Next.js 服务器尝试解析这个数据包时,由于 JavaScript 的“鸭子类型”(Duck Typing)特性——如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子——服务器会误以为这是一段合法的代码逻辑并执行它。

结果就是:攻击者可以在你的服务器上执行任意 JavaScript 代码。不需要登录,不需要任何权限,只要你的 Next.js 服务暴露在公网,就有可能中招。

  • React 的 Flight 协议用于客户端和服务器之间传输数据
  • Next.js 的 App Router 极度依赖此协议处理 Server Actions 和 RSC
  • 当服务器接收到 POST 时,会对请求体中的数据进行反序列化
  • 攻击者可以发送包含特殊恶意构造对象的请求,导致不安全的反序列化执行任意代码

为什么它这么严重?

这个漏洞为什么这么严重?是因为攻击者无需任何有效的凭证,不需要依赖任何的用户操作即可利用。使用了 App Router 的应用,在标准配置上就会受到影响。

  • 无门槛 (Unauthenticated):攻击者不需要账号密码,只要能访问你的网站。
  • 满分伤害 (CVSS 10.0):直接的远程代码执行。意味着攻击者可以读取你的环境变量(AWS Key, 数据库密码)、删除文件、或者把你的服务器变成矿机。
  • 影响范围广:几乎所有使用 App Router 的现代 Next.js 版本都在射程范围内。
  • 高可见性:Next.js 与 React 不同,它直接暴露 Flight protocol 的端点,使其成为真实可远程利用的攻击面 ​

具体受影响的版本包括:

项目 受影响版本 安全版本
React 19.0, 19.1.0, 19.1.1, 19.2.0 19.0.1, 19.1.2, 19.2.1
Next.js 16.x < 16.0.7 >= 16.0.7
Next.js 15.x 所有未修补版本 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7
Next.js 14.x Canary >= 14.3.0-canary.77 14.2.25+
Next.js 14.x 稳定版 不受影响
Pages Router 不受影响

如果你的 package.json 里写着 "next": "15.x" 或者 "next": "16.0.x",请立刻打起十二分精神。

实际体验与分析

我自己在本地的一个测试环境中尝试复现了一下(仅用于研究原理,请勿用于非法用途),过程简单得让人后背发凉。

通常我们认为,只有 eval() 或者不安全的 innerHTML 才会导致代码执行。但在 RSC 的世界里,为了支持复杂的服务器对象传递,React 的底层机制允许了一些动态特性的存在。攻击者利用了这种灵活性,通过 HTTP 请求头或者 Body 发送一段特制的 JSON 文本,Next.js 的 hydration 过程就会乖乖地“执行”这段文本里隐藏的指令。

这也让我再次反思:便利性和安全性往往是天平的两端。RSC 带来了极佳的开发体验和性能优势,但它也引入了全新的攻击面。以前我们防 XSS、防 CSRF,现在还得防“组件反序列化”。

紧急修复指南

好消息是,Vercel 和 React 团队的响应非常迅速,补丁已经发布了。

检查版本

首先,确认你当前使用的版本。在项目根目录下运行:

npm list next react
# 或者
yarn list next react

立即升级 (推荐)

这是最稳妥的方案。请尽快将 Next.js 升级到安全版本。

官方修复版本如下:

  • Next.js 16: 升级到 16.0.7 或更高
  • Next.js 15: 升级到 15.1.0 (及后续补丁版本)
  • Next.js 14: 升级到最新的 v14 补丁版本

执行升级命令:

# 如果你是 npm
npm install next@latest react@latest react-dom@latest

# 如果你是 pnpm
pnpm update next react react-dom --latest

升级完后,记得重新构建你的应用:

npm run build
# 并重启服务
npm start

临时缓解措施

如果你维护的是一个巨型遗留项目,没法立刻升级(比如依赖冲突),那你的处境会比较危险。

目前没有完美的配置级 Workaround。建议至少在该服务的前面加一层 WAF (Web Application Firewall),尝试过滤包含异常 RSC Flight 协议特征的请求,但这只能作为缓兵之计,升级才是硬道理

最后

这次的 React2Shell 漏洞给所有追逐新技术的开发者敲响了警钟。Next.js 的 App Router 和 Server Actions 确实好用,但在享受“全栈框架”带来的生产力飞跃时,我们也不能忽视底层的安全风险。

建议是:

  1. 保持依赖更新:订阅 GitHub 的 Security Advisory,像这种 Critical 级别的漏洞,通常出来的第一时间就要修。
  2. 监控异常流量:如果你的服务器日志里突然出现大量奇怪的 POST 请求,或者 CPU 占用率异常飙升,要警惕可能正在被扫描。
  3. 不要裸奔:生产环境尽量放在可靠的平台(如 Vercel)或者有完善 WAF 保护的云服务之后。

技术在进步,漏洞也在进化。希望大家的 production 环境都能平平安安。

正文完
 0
评论(没有评论)