当一个像React这样流行的框架爆出CVSS 10.0分级的远程代码执行漏洞时,你得到的不仅是一份安全公告,更是一场日程表的彻底重置。
这正是CVE-2025-55182(绰号React2Shell)对运行React服务器组件和Next.js等框架的团队造成的现状。React团队已确认,在处理服务器函数和RSC的解码逻辑中存在一个缺陷,允许攻击者在受影响的服务器上执行未经授权的远程代码。
漏洞的大致情况如下:
- 该漏洞影响React 19.x版本中的
react-server-dom-*系列包。 - 像Next.js、React Router、Waku、Expo等捆绑了RSC的框架均受到影响。
- 大量云环境正在运行存在漏洞的React/Next.js实例,且使用
create-next-app创建的默认Next.js应用无需任何特殊代码即可被利用。
如果你是一名开发者或技术负责人,你将突然面临三个紧迫问题:
- 我们的项目是否使用了存在漏洞的RSC/Next.js版本?
- 我们已部署的应用中是否有任何现在即可被利用的?
- 我们如何修复它并防止它在六个月后再次出现?
react2shell-guard(开源仓库gensecaihq/react2shell-scanner内的CLI工具包)的存在,正是为了以一种能直接融入开发者工作流的方式回答所有这三个问题。
用一句话概括react2shell-guard是什么? 它是一个针对React2Shell的开源扫描器与防护套件,能帮助你:
- 检测代码仓库中的易受攻击依赖
- 检查在线URL和容器镜像
- 阻止不安全的部署
- 自动修复问题
- 添加运行时中间件和CI钩子,防止同一漏洞再次潜入
所有这些功能都打包成一个可通过npx运行的单一Node.js工具。
第一步 —— 发现问题:仓库与依赖扫描
开发者现在最快能做的就是运行本地扫描。react2shell-guard会检查你的锁文件(npm、pnpm、yarn),判断你是否依赖了以下软件包的易受攻击版本:
react-server-dom-webpackreact-server-dom-parcelreact-server-dom-turbopack- 处于受影响范围的Next.js 15.x和16.x版本
由于它直接读取锁文件,因此无需安装依赖,并且在monorepo中也能很好地工作。
从你的项目根目录,你可以运行:
npx react2shell-guard .
或者指定其他路径:
npx react2shell-guard /path/to/your/app
其底层实现是:
- 自动检测npm、pnpm和yarn锁文件
- 遍历monorepo并扫描所有发现的项目
- 检测Next.js等框架以及App Router/RSC是否启用
输出结果是开发者易读的格式:项目名称、框架、易受攻击的包,以及你应该升级到的确切版本,与React和Next.js的安全指导保持一致。
第二步 —— 修复它,而不仅仅是标记它
发现易受攻击的包只是战斗的一半。仍然需要有人去修复它们。react2shell-guard包含了一个自动修复流程,可以更新你的package.json,甚至为你重新安装依赖:
`# 预览将要进行的更改
npx react2shell-guard fix --dry-run
应用修复
npx react2shell-guard fix
应用修复并重新安装依赖
npx react2shell-guard fix --install`
该工具知晓React和Next.js安全公告中指定的已修复版本,例如:
- React RSC包:19.0.1, 19.1.2, 19.2.1
- Next.js:15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7 因此你无需猜测,直接应用框架作者推荐的版本即可。
对于流程更严格的团队,react2shell-guard甚至可以使用GitHub CLI自动创建拉取请求:
react2shell-guard create-pr --dry-run # 显示计划 react2shell-guard create-pr # 创建分支 + PR
这使得将React2Shell修复工作无缝插入你用于其他所有事情的代码审查流水线变得轻而易举。
第三步 —— 检查现实世界:在线URL与容器扫描
即使你的代码已打补丁,旧容器或被遗忘的服务仍有可能在运行存在漏洞的构建。react2shell-guard通过两种方式提供面向运行时的检查:
-
在线URL扫描 `# 单个URL npx react2shell-guard scan-urlhttps://your-app.com
从文件读取多个URL
npx react2shell-guard scan-url urls.txt --list` 此模式会发送精心构造的RSC风格请求,并查找与易受攻击行为相关的响应模式,然后报告哪些端点存在风险。
-
容器镜像扫描
# 本地或远程镜像 npx react2shell-guard scan-image myorg/app:latest它会检查镜像中是否存在易受攻击的React/Next.js包,支持JSON/SARIF输出,并适用于本地或注册表中的镜像。
这意味着你可以:
- 通过URL扫描正在生产环境中运行的应用
- 通过镜像标签扫描仓库中的镜像 ……而不仅仅是检查Git仓库中的内容。
第四步 —— 在CI/CD和托管环境中设置防护栏 React2Shell很棘手,但它不会是我们在RSC或类似服务器端UI技术中看到的最后一个严重漏洞。你或许应该将这次事件转化为一道永久的防护栏。
react2shell-guard提供一流的CI集成:
- 提供GitHub Actions示例,可在每次推送或PR时运行,并将SARIF报告上传至GitHub的安全标签页
- 当存在漏洞时,退出码将使构建失败
- 如果你希望以“仅警告”模式开始,可以使用一个CLI开关(
--no-exit-on-vuln)
它还支持针对Vercel的特定检查:
react2shell-guard vercel-check
你可以将其集成到vercel.json或你的package.json构建脚本中,这样当存在React2Shell漏洞包时,Vercel部署甚至不会开始构建。
第五步 —— 添加运行时纵深防御 即使打了补丁并进行了CI检查,为可疑的RSC流量添加运行时检测也是明智之举。 该项目包含可即插即用的中间件,适用于:
- Express应用
- Next.js中间件 以便在边缘检测并(可选地)拦截可疑的React2Shell风格负载。
// Express
import express from 'express';
import { createExpressMiddleware } from 'react2shell-guard/middleware';
const app = express();
app.use(express.raw({ type: 'text/x-component' }));
app.use(express.json());
app.use(createExpressMiddleware({
action: 'block', // 'block' | 'log' | 'alert'
skipPaths: ['/health'],
onAlert: (result, req) => {
console.error('React2Shell attempt:', result);
},
}));
// Next.js middleware.ts
import { withReact2ShellGuard } from 'react2shell-guard/middleware';
export const middleware = withReact2ShellGuard({
action: 'block',
rscEndpointsOnly: true,
});
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
};
该中间件会寻找诸如格式错误的模块引用、RSC流滥用等模式,以及其他与已知利用技术匹配的特征。你可以选择是记录日志、发出警报还是直接阻止可疑请求。
为安全与平台团队准备的额外功能 除此之外,该工具还提供:
- 预提交钩子(Husky、Lefthook或独立版本),防止开发者提交明显存在漏洞的包版本
- 针对CycloneDX文件的SBOM扫描,以便对现有的软件物料清单运行此工具
- MCP服务器集成,将扫描功能作为工具暴露给兼容MCP协议的AI助手——如果你已在代码审查或基础设施检查中使用智能体工作流,这将非常理想
这些是可选的,但它们有助于大型组织将react2shell-guard集成到现有的安全和自动化生态系统中。
开源、MIT许可、社区友好
所有这一切都在MIT许可的开源仓库中:https://github.com/gensecaihq/react2shell-scanner
CLI工具在npm上以react2shell-guard发布。
该项目是:
- 一个扫描器和防护套件,而非利用工具包
- 社区驱动,拥有贡献和报告问题的指南
- 积极寻找测试者、文档编写者和代码贡献者
由于它是开源的,你可以审计其检测逻辑,使其适应你的环境,并在新的RSC/Next.js问题出现时对其进行扩展。
如果你今天只做三件事 如果你的技术栈涉及React 19或Next.js,这里有一个简单的计划:
- 在你的主要仓库中运行
npx react2shell-guard .,并修复它发现的任何问题。 - 使用
scan-url扫描你的公共URL和高价值内部应用列表。 - 添加GitHub Action或Vercel检查,确保同类问题无法在不知不觉中再次潜入。
React2Shell是一个大问题,但它不必导致混乱。借助react2shell-guard这样的工具,你可以将一个可怕的RCE事件周转变为一次结构化、可重复的响应——并为下一次事件保留这些防护栏。FINISHED
CSD0tFqvECLokhw9aBeRqsaTeCzrD+R/tKUDM3HEHo8dhnJldJXi9fFQCe+uVQbnihYBjOAR2J3FNPixDm5VFKJBM/YyifeEKFBdLXxl5ixAQ+TzawGVz1szNCMY6J4V2GITOZMCIJc7Mhw1ffJKQ++rqtHhWPek7V/xXOmkSd8=