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