跳到主要内容

关于“runAsNode”CVEs的声明

·阅读 4 分钟

今天早些时候,Electron 团队收到警报,有几个针对一些知名 Electron 应用的公开 CVEs 最近被提交。这些 CVEs 与 Electron 的两个熔断器(fuses)——runAsNodeenableNodeCliInspectArguments——有关,并错误地声称如果这些组件未被主动禁用,远程攻击者就能够通过它们执行任意代码。

我们不认为这些 CVEs 是出于善意提交的。首先,声明不正确——该配置并不能实现远程代码执行。其次,尽管这些公司设有漏洞赏金计划,但其中被点名的公司并未收到通知。最后,虽然我们确实认为禁用相关组件可以增强应用安全性,但我们不认为这些 CVEs 以正确的严重程度提交。“危急”级别是为最高危险级别的问题保留的,而这显然不属于此情况。

任何人都可以申请 CVE。虽然这对软件行业的整体健康发展有益,“刷 CVE”以提升某个安全研究员的声誉是没有帮助的。

尽管如此,我们理解带有可怕的“危急”严重性标签的 CVE 仅凭其存在就可能导致最终用户困惑,因此作为一个项目,我们希望提供处理此问题的指导和帮助。

这可能对我产生什么影响?

在审查了这些 CVEs 后,Electron 团队认为这些 CVEs 并非危急。

攻击者需要已经能够在机器上执行任意命令,要么通过物理访问硬件,要么已经实现完全的远程代码执行。这一点需要重申:所描述的漏洞要求攻击者已经拥有对受攻击系统的访问权限

例如,Chrome 在其威胁模型中不考虑物理本地攻击

我们认为这些攻击超出 Chrome 的威胁模型范围,因为 Chrome(或任何应用程序)无法防御已以您身份登录到您的设备或可以以您的操作系统用户帐户权限运行软件的恶意用户。此类攻击者可以修改可执行文件和 DLL,更改 PATH 等环境变量,更改配置文件,读取您的用户帐户拥有的任何数据,将其发送给自己等等。此类攻击者对您的设备拥有完全控制权,Chrome 无法采取任何措施提供实质性的防御保证。这个问题并非 Chrome 特有——所有应用程序都必须信任物理本地用户。

CVEs 中描述的漏洞允许攻击者将受影响的应用程序用作具有继承 TCC 权限的通用 Node.js 进程。因此,如果应用程序(例如)被授予了地址簿访问权限,攻击者可以以 Node.js 运行该应用程序并执行将继承该地址簿访问权限的任意代码。这通常被称为“利用现有资源(living off the land)”攻击。攻击者通常使用 PowerShell、Bash 或类似工具来运行任意代码。

我是否受到影响?

默认情况下,所有已发布的 Electron 版本都启用了 runAsNodeenableNodeCliInspectArguments 功能。如果您尚未按照Electron 熔断器文档中的描述禁用它们,您的应用程序同样容易受到“利用现有资源”攻击。再次强调,我们需要强调的是,攻击者需要已经能够在受害者的机器上执行代码和程序。

缓解措施

解决此问题最简单的方法是在您的 Electron 应用程序中禁用 runAsNode 熔断器。runAsNode 熔断器控制是否遵循 ELECTRON_RUN_AS_NODE 环境变量。有关如何切换这些熔断器的信息,请参阅Electron 熔断器文档

请注意,如果此熔断器被禁用,那么主进程中的 process.fork 将无法正常工作,因为它依赖于此环境变量才能运行。我们建议您改用工具进程(Utility Processes),它适用于许多需要独立 Node.js 进程的用例(例如 Sqlite 服务器进程或类似场景)。

您可以在我们的安全清单中找到我们推荐的 Electron 应用程序安全最佳实践的更多信息。