理解与缓解 CVE-2025-55182 (React2Shell) | UpGuard
指定为CVE-2025-55182并被广泛称为"React2Shell"的此漏洞,代表了现代Web应用程序的最坏情况:在默认配置下即可实现未认证的远程代码执行。
自最初披露和初始补丁发布以来,安全研究人员在同一受影响包中还发现了两个相关的漏洞——一个拒绝服务漏洞和一个源代码泄露漏洞。必须注意的是,为修复RCE而发布的初始补丁并不完整,使得系统仍然暴露于新的DoS和代码泄露漏洞之下。 需要立即行动,更新到最新的补丁版本,以保护您的应用程序免受所有已知威胁。
什么是 CVE-2025-55182?
1. 严重:远程代码执行 (CVE-2025-55182 / “React2Shell”)
CVE-2025-55182的核心是一个不安全反序列化漏洞,被评定为严重级别。它允许攻击者仅通过发送一个恶意的HTTP请求,就可在服务器上执行任意代码,而无需任何登录凭证或特殊权限。
注意: 虽然核心漏洞是 CVE-2025-55182 (React),但在上下文中,与 Next.js 相关的追踪通常被引用为 CVE-2025-66478。两者指的是相同的根本原因。
机制
该漏洞存在于 React Server Components 架构中,具体是在用于客户端与服务器之间通信的 “Flight” RPC 协议内部。
当用户与 Next.js 或 React 19 应用程序交互时——例如通过 Server Action 提交表单——数据会被序列化以发送到服务器。服务器随后反序列化这些数据以处理请求。
缺陷
React 安全团队和 Vercel 披露,服务器端的反序列化器未能严格验证传入的对象键。
这一具体失败允许攻击者在负载中注入被禁止的 JavaScript 属性——例如 __proto__、constructor 或 prototype。这种服务器端原型污染 有效地"毒化"了应用程序状态。当服务器处理这个被污染的对象时,会在无意中触发一个"小工具链",从而执行攻击者的系统命令。
2. 高严重性:拒绝服务 (CVE-2025-55184 和 CVE-2025-67779)
在尝试利用初始的 RCE 补丁时发现,这组漏洞允许攻击者成功导致服务器进程崩溃或冻结,从而拒绝向合法用户提供服务。
严重性:高
缺陷
安全研究人员发现,可以制作恶意 HTTP 请求并将其发送到任何 Server Functions 端点。当 React 反序列化此请求时,会触发一个无限循环,导致服务器进程挂起并消耗过多 CPU 资源,从而影响性能并有效拒绝用户访问产品。CVE-2025-67779 是为解决初始 DoS 漏洞补丁不完整而发布的后续修复。
3. 中严重性:源代码泄露 (CVE-2025-55183)
此漏洞允许攻击者直接从您的 Server Function 代码中泄露敏感信息。
严重性:中
缺陷
发送到易受攻击的 Server Function 的恶意 HTTP 请求可能会不安全地返回该函数的源代码。如果您的 Server Function 内硬编码了任何秘密,它们可能会被暴露。当 Server Function 显式或隐式暴露字符串化的参数时,就会触发此漏洞。
受影响的生态
由于此漏洞存在于处理 Server Components 的核心 React 库中,其影响范围巨大。它不仅影响特定框架,还影响任何利用 RSC 的工具链。
主要目标:
- React Core: 版本 19.0.0 至 19.2.0。
- Next.js:
- v16.x (早于 v16.0.7 的版本)
- v15.x (早于 v15.5.7 的版本)
- 使用 App Router 的旧版 v14.x Canary 版本。
- RSC 支持框架: Waku, RedwoodJS,以及使用 Vite RSC 插件的自定义实现。
为什么 React2Shell 特别危险
与之前需要特定、非标准配置才能利用的漏洞不同,CVE-2025-55182 在默认安装上即可利用。
注意: 安全研究人员已确认攻击向量是一个简单的 HTTP POST 请求。如果您的应用程序向公共互联网公开了 Server Action 或 RSC 端点,则在打补丁之前实际上是脆弱的。
如何缓解 CVE-2025-55182 的影响
鉴于其"严重"级别以及利用代码的公开可用性,需要立即采取行动。缓解策略分为两类:补救(打补丁),这是唯一的永久性修复;以及缓解(WAF规则),作为临时防护。
1. 立即打补丁
React 团队和 Vercel 已协调同步发布了修复版本。您必须将依赖项升级到下文列出的版本或更高版本。
初始补丁:
- React: 如果您直接使用 React 或依赖 React 19 的非 Next.js 框架,请确保
react和react-dom更新到以下初始补丁版本之一:- v19.0.1
- v19.1.2
- v19.2.1
- Next.js: Next.js 用户应升级到其主版本的最新补丁版本。安全版本包括:
- Next.js 16: 升级到 v16.0.7 或更高版本。
- Next.js 15: 升级到 v15.5.7, v15.4.8, v15.3.6, v15.2.6, v15.1.9, 或 v15.0.5。
最终补丁
上面列出的初始补丁版本并不充分,仍然容易受到后续的拒绝服务和源代码泄露问题的影响。
为确保您的应用程序免受所有四个已知漏洞的影响,您必须更新到以下最终补丁版本或更高版本:
| 包 | 最低安全版本 |
|---|---|
| react 和 react-dom | v19.0.3 或更高 |
| react 和 react-dom | v19.1.4 或更高 |
| react 和 react-dom | v19.2.3 或更高 |
依赖警告: 如果您正在使用像 Waku、RedwoodJS 或 Parcel 这样的框架,您可能不会立即看到框架级别的更新。您必须检查您的 package-lock.json 或 yarn.lock 文件,以确保嵌套的 react 版本已解析为上述列出的修复版本之一。
如何检测您是否已受到影响
打补丁为未来的攻击关上了门,但它并不能告诉您是否已经有人闯了进来。要确定在缓解措施实施之前您的基础设施是否已被攻击或入侵,您必须同时分析您的网络日志和主机行为。
网络流量分析
检测的第一道防线是审查 HTTP 访问日志中与 “React2Shell” 利用相关的特定模式。
- 可疑请求头: 在日志中筛选包含
next-action或rsc-action-id请求头的 HTTP POST 请求。虽然这些是 Next.js 和 React 使用的合法请求头,但这些请求的异常高流量——特别是来自单个 IP 地址的流量——可能表明存在扫描活动。 - 负载特征: 最可靠的指标在请求体中。在您的 WAF 或负载均衡器日志中搜索以下字符串:
"$@":利用负载结构中使用的序列(通常在 JSON 数组内部)。"status":"resolved_model":用于欺骗服务器处理恶意对象的特定 JSON 模式。__proto__,constructor, 或prototype:试图污染对象原型的 JSON 键。
- 错误率异常: 在您的 RSC 端点上查找 500 内部服务器错误的突然激增。因为利用负载通常不稳定或基于试错,攻击者在成功实现代码执行之前经常多次导致服务器进程崩溃。
- 持续突然的 CPU 使用率飙升可能表明成功的 DoS 攻击。
基于主机的指标
如果攻击者成功绕过您的网络防御,证据将驻留在服务器本身上。此处的检测依赖于发现技术上可能但在操作上对于 Web 服务器异常的行为,从应用程序如何与底层操作系统交互开始。
- 意外的进程生成: 这是泄露的最高保真度指标。在标准的 React/Next.js 环境中,Node 进程几乎不应该生成 shell 命令。在您的端点检测与响应工具中监控 Node 进程是否生成了:
- Shell:
sh,bash,cmd.exe,powershell。 - 网络工具:
curl,wget。 - 侦察工具:
whoami,id,uname。
- Shell:
- 文件系统痕迹: 扫描器和攻击者通常在临时目录中留下证据。检查
/tmp(Linux) 或%TEMP%(Windows) 是否存在:- 名为
pwned.txt,test.txt或随机字母数字字符串的文件。 - 为测试写入权限而创建的零字节文件。
- 此外,监控对敏感系统文件的未经授权读取尝试,例如
/etc/passwd或环境变量文件,攻击者通常在获得访问权限后立即瞄准这些文件。
- 名为
自动化扫描和验证
要确认您的应用程序是否仍然暴露,而无需手动制作利用程序,请使用已更新其 CVE-2025-55182 定义的漏洞扫描器。