React2Shell:每位 Next.js 开发者必须立即解决的关键 RCE 漏洞

发布: (2025年12月10日 GMT+8 00:02)
6 min read
原文: Dev.to

Source: Dev.to

概览

一个关键的远程代码执行(RCE)漏洞——CVE‑2025‑55182(也在 GHSA‑9qr9‑h5gf‑34mp 中追踪)影响使用 App Router 的 Next.js 应用中的 React Server Components(RSC)。该缺陷允许攻击者仅通过一次精心构造的 HTTP 请求在服务器上执行任意 JavaScript,且无需身份验证。受影响的 Next.js 版本为 15.0.0 至 16.0.6,以及多个相关的 React 包。

要点

  • CVSS 评分:10.0(严重)
  • 漏洞利用在 2025 年 12 月 4 日公开发布。
  • 成功利用后可实现凭证窃取、加密挖矿、反向 Shell 和持久后门。

漏洞工作原理

React Server Components 使用 Flight 协议在服务器和客户端之间序列化/反序列化数据。反序列化逻辑在处理特制的 multipart/form-data 负载时错误地遍历原型链。通过在 $ 前缀的字符串中注入 __proto__constructorprototype 引用,攻击者可以突破对象边界并在服务器上运行任意代码。

典型攻击流程:

Attacker → malicious multipart/form-data POST

Next.js server (RSC‑enabled route)

Flight protocol deserializes payload

Prototype chain traversal → arbitrary code execution

Server‑side RCE with application privileges

即使你的应用没有显式使用服务器函数,只要存在 App Router(app/ 目录),就会启用易受攻击的端点。

受影响的包和版本

包名易受攻击的版本
react-server-dom-webpack19.0.0, 19.1.0, 19.1.1, 19.2.0
react-server-dom-parcel19.0.0, 19.1.0, 19.1.1, 19.2.0
react-server-dom-turbopack19.0.0, 19.1.0, 19.1.1, 19.2.0
Next.js (GHSA‑9qr9‑h5gf‑34mp)所有稳定版本 15.0.0 – 16.0.6
Next.js canary≥ 14.3.0‑canary.77, 以及 ≥ 15.6.0‑canary.58
其他使用 RSC 的框架react-router(不稳定 RSC API),waku@parcel/rsc@vitejs/plugin-rscrwsdk

确认当前使用的版本

在浏览器中

// 返回部署的 Next.js 版本
next.version

从项目文件中

# package.json
cat package.json | grep '"next"'

# npm lockfile
npm ls next

# yarn
yarn why next

# pnpm
pnpm why next

Vercel 仪表盘可能会显示易受攻击部署的横幅,但请自行验证。

修补与升级矩阵

当前运行的版本升级至
Next.js 15.0.x15.0.5
Next.js 15.1.x15.1.9
Next.js 15.2.x15.2.6
Next.js 15.3.x15.3.6
Next.js 15.4.x15.4.8
Next.js 15.5.x15.5.7
Next.js 16.0.x16.0.7
Next.js 14 canaries (≥14.3.0‑canary.77)降级至 14.2.x 稳定版
Next.js 15 canaries (<15.6.0‑canary.58)15.6.0‑canary.58 或更高版本

自动修复(Vercel)

npx fix-react2shell-next

该工具会扫描易受攻击的包并自动升级。

手动升级

# 更新到已修补的版本(示例)
npm install next@15.3.6   # 替换为相应的目标版本

# 刷新 lockfile
npm install

# 验证
npm ls next

提交 package.json 与 lockfile,避免依赖不匹配。

部署已修补的版本

# Vercel CLI
vercel --prod

# 或通过 CI/CD
git add package.json package-lock.json
git commit -m "fix: patch React2Shell vulnerability (CVE-2025-55182)"
git push origin main

立即的后渗透措施

如果你的生产应用在 2025 年 12 月 4 日 13:00 PT(公开利用出现时)已被暴露,请假设环境变量可能已被窃取。按以下优先级轮换密钥:

  1. 数据库凭证
  2. 第三方 API 密钥(Stripe、SendGrid、AWS 等)
  3. OAuth 客户端密钥
  4. JWT 签名密钥
  5. 内部服务认证令牌

Vercel 文档提供了逐步的密钥轮换指南。

妥协指示器

日志分析

  • 未知路由的异常 multipart/form-data POST 请求
  • 格式错误或可疑的 Content-Type 头部
  • 来自 RSC 路由的 500 错误激增
  • 不寻常的函数超时(尽管多数利用是静默完成的)

运行时异常

  • 容器内出现未知进程
  • 向不熟悉的 IP 或域名发起出站连接
  • 169.254.169.254(云元数据服务)的 DNS 查询
  • 与流量无关的 CPU 使用突增

观察到的后利用行为

  • 凭证外泄(环境变量)
  • 加密挖矿部署(常伪装为系统服务)
  • 反向 Shell 建立
  • 持久化的 cron 任务或进程重启器

若出现上述任意迹象,请视为确认泄露:隔离受影响系统、保存日志并启动应急响应计划。

深度防御措施(临时)

措施说明
Web 应用防火墙 (WAF)主流供应商(AWS WAF、Cloudflare、Fastly、Vercel)已发布针对已知利用模式的规则。WAF 能缓解多数攻击,但不能替代补丁。
部署保护为预览/非生产部署启用身份验证(如 Vercel 的 Standard Protection)。审计可绕过保护的共享链接。
网络分段限制无服务器函数或容器的出站流量,仅允许必要的终端。
运行时监控部署异常检测工具,标记异常的 CPU、内存或网络使用。
最小权限密钥将凭证存放在具短 TTL 的密钥管理器中,并定期轮换。

摘要检查清单

  • 确认生产环境的 Next.js 版本。
  • 按上表升级到已修补的版本。
  • 运行 npx fix-react2shell-next(或手动升级)。
  • 使用 npm ls next 验证升级。
  • 立即部署已修补的代码。
  • 轮换所有可能被泄露的密钥。
  • 检查日志和运行时指标,寻找妥协指示器。
  • 在补丁期间应用临时 WAF 规则和部署保护。

保持使用已修补的 Next.js 版本并及时轮换密钥是降低 React2Shell RCE 风险的最有效方法。

Back to Blog

相关文章

阅读更多 »

Next.js 紧急安全更新

Next.js 紧急安全更新的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fd...