关于 “runAsNode” CVE 的声明
今天早些时候,Electron 团队收到警报,发现最近针对几个著名的 Electron 应用程序提交了多项公开 CVE。这些 CVE 与 Electron 的两个熔断器 (fuses)——runAsNode
和 enableNodeCliInspectArguments
相关,并且错误地声称如果这些组件未被主动禁用,远程攻击者可以通过它们执行任意代码。
我们认为这些 CVE 的提交并非出于善意。首先,声明不正确——该配置并不会启用远程代码执行。其次,尽管被这些 CVE 点名的公司都有漏洞赏金计划,但它们并未收到通知。最后,尽管我们确实认为禁用相关组件可以增强应用程序安全性,但我们不认为这些 CVE 的严重性评级是正确的。“严重”等级保留给最高危险的问题,而这里显然不是这种情况。
任何人都可以申请 CVE。虽然这有利于整个软件行业的健康发展,但“刷 CVE”以提升单个安全研究员声誉的做法并无益处。
尽管如此,我们理解带有吓人的“严重”等级的 CVE 的存在可能会导致最终用户的困惑,因此作为项目方,我们希望提供指导和协助来处理这个问题。
这对我有什么影响?
审查这些 CVE 后,Electron 团队认为这些 CVE 并不严重。
攻击者需要已经能够在机器上执行任意命令,这要么是通过物理访问硬件,要么是已经实现了完全的远程代码执行。这一点需要重申:所描述的漏洞要求攻击者已经可以访问被攻击的系统。
例如,Chrome在其威胁模型中不考虑物理本地攻击。
我们认为这些攻击不在 Chrome 的威胁模型之内,因为 Chrome(或任何应用程序)无法防御恶意用户,如果该用户已成功以您的身份登录到您的设备,或者可以以您的操作系统用户帐户的权限运行软件。这样的攻击者可以修改可执行文件和 DLL、更改环境变量(如
PATH
)、更改配置文件、读取您用户帐户拥有的任何数据,并将其发送给自己等等。这样的攻击者完全控制了您的设备,Chrome 无法提供严肃的防御保证。这个问题并非 Chrome 特有——所有应用程序都必须信任物理本地用户。
CVE 中描述的漏洞利用允许攻击者随后将受影响的应用程序用作具有继承 TCC 权限的通用 Node.js 进程。因此,如果应用程序(例如)已被授予通讯录访问权限,攻击者可以以 Node.js 运行该应用程序并执行将继承该通讯录访问权限的任意代码。这通常被称为“借地攻击 (living off the land)”。攻击者通常使用 PowerShell、Bash 或类似工具来运行任意代码。
我是否受影响?
默认情况下,所有已发布的 Electron 版本都启用了 runAsNode
和 enableNodeCliInspectArguments
功能。如果您尚未按照 Electron Fuses 文档中描述的方式禁用它们,您的应用程序同样容易被用作“借地攻击”。再次强调,攻击者需要已经能够在受害者的机器上执行代码和程序。
缓解措施
缓解此问题的最简单方法是禁用 Electron 应用程序中的 runAsNode
熔断器。runAsNode
熔断器控制 ELECTRON_RUN_AS_NODE
环境变量是否生效。有关如何切换这些熔断器的信息,请参阅 Electron Fuses 文档。
请注意,如果此熔断器被禁用,那么主进程中的 process.fork
将无法按预期工作,因为它依赖于此环境变量才能运行。作为替代,我们建议您使用实用进程 (Utility Processes),它适用于许多需要独立 Node.js 进程的用例(如 Sqlite 服务器进程或类似场景)。
您可以在我们的安全清单中找到更多关于我们推荐的 Electron 应用程序安全最佳实践信息。