近期,我们发现 React Native 生态系统中存在一个关键漏洞——CVE-2025-11953——它对使用 @react-native-community/cli 包的开发者构成重大风险。让我们来详细了解一下这个漏洞的含义、受影响的用户群体以及如何保护您的工作。
漏洞概述:风险何在?
该漏洞存在于 React Native 的 Metro 开发服务器所使用的 @react-native-community/cli-server-api 包中。它允许网络上的未经身份验证的攻击者通过发送恶意 HTTP 请求,在开发者的计算机上执行任意操作系统 (OS) 命令。
React Native 每周被超过 200 万开发者使用,它依赖 Metro 服务器来实现代码实时更新、热重载和无缝的跨平台应用开发。当此服务器暴露时,任何拥有网络访问权限的攻击者都可以利用它——即使开发者并未主动连接到公共网络。
哪些人容易受到攻击?
以下情况会触发此问题:
-
开发者使用
@react-native-community/cli(版本 4.8.0 至 20.0.0-alpha.2)创建 React Native 项目。 -
他们使用默认设置运行 Metro 服务器(例如,
npx react-native start或npm start)。
并非所有开发者都面临风险:使用 Expo 等框架(它使用自己的 CLI)的项目或未使用 Metro 的项目不受影响。但是,大多数使用受影响的 @react-native-community/cli 版本的原生 React Native 项目(未使用 Expo 创建)都存在风险。
工作原理:技术分析
Metro 的 /open-url 端点处理 POST 请求。恶意攻击者可以发送类似 {"url": "cmd.exe /c calc.exe"}(Windows)或 {"url": "open calc.exe"}(macOS/Linux)的有效载荷。open 包(一个依赖项)会将此输入直接传递给操作系统,从而执行任意命令。
要利用此漏洞,攻击者无需凭据,只需连接到开发机器即可。在 Windows 系统上,这甚至可能导致完全的系统访问权限(例如,运行 calc.exe 或写入文件)。
严重性:默认暴露
出于安全考虑,Metro 服务器通常绑定到 localhost。然而,由于 React Native CLI 设置中存在另一个相关问题,它默认监听所有网络接口 (0.0.0.0)。这意味着服务器可以从外部网络访问,从而将本地开发工具变成全球风险。
缓解措施:保护您的项目
为最大限度降低风险,请立即采取以下步骤:
- 更新 CLI 包:
将 @react-native-community/cli-server-api 升级到 20.0.0 或更高版本。此补丁可清理用户输入,修复操作系统命令执行缺陷。
检查已安装版本:
npm list @react-native-community/cli-server-api # 本地项目
npm list -g @react-native-community/cli-server-api # 全局安装
- 显式绑定到
localhost(临时解决方案):
如果无法升级,请使用 --host 127.0.0.1 运行服务器以限制访问:
npx react-native start --host 127.0.0.1
npx @react-native-community/cli start --host 127.0.0.1
更广泛的教训:开发中的安全
此次事件凸显了一个关键原则:即使是为开发者便利而构建的工具,也可能成为攻击的途径。作为技术领导者,我们必须优先考虑安全的编码实践和定期的依赖项审计。对于 React Native 及其他技术而言,确保工具更新以及服务器访问权限得到适当限制(例如,仅限本地主机)是至关重要的。