React2Shell:每位 Next.js 开发者必须立即解决的关键 RCE 漏洞
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__、constructor 或 prototype 引用,攻击者可以突破对象边界并在服务器上运行任意代码。
典型攻击流程:
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-webpack | 19.0.0, 19.1.0, 19.1.1, 19.2.0 |
react-server-dom-parcel | 19.0.0, 19.1.0, 19.1.1, 19.2.0 |
react-server-dom-turbopack | 19.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-rsc,rwsdk |
确认当前使用的版本
在浏览器中
// 返回部署的 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.x | 15.0.5 |
| Next.js 15.1.x | 15.1.9 |
| Next.js 15.2.x | 15.2.6 |
| Next.js 15.3.x | 15.3.6 |
| Next.js 15.4.x | 15.4.8 |
| Next.js 15.5.x | 15.5.7 |
| Next.js 16.0.x | 16.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(公开利用出现时)已被暴露,请假设环境变量可能已被窃取。按以下优先级轮换密钥:
- 数据库凭证
- 第三方 API 密钥(Stripe、SendGrid、AWS 等)
- OAuth 客户端密钥
- JWT 签名密钥
- 内部服务认证令牌
Vercel 文档提供了逐步的密钥轮换指南。
妥协指示器
日志分析
- 未知路由的异常
multipart/form-dataPOST 请求 - 格式错误或可疑的
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 风险的最有效方法。