关于 "runAsNode" CVE 的声明
今天早些时候,Electron 团队被告知最近针对几个著名的 Electron 应用提交的多个公开 CVE。这些 CVE 与 Electron 的两个 熔丝 - 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 熔丝文档 中描述的方式关闭它们,您的应用同样容易受到“利用现有工具”攻击。再次强调,攻击者需要已经能够在受害者的机器上执行代码和程序。
缓解措施
缓解此问题的最简单方法是在您的 Electron 应用中禁用 runAsNode 熔丝。runAsNode 熔丝切换是否尊重 ELECTRON_RUN_AS_NODE 环境变量。请参阅 Electron 熔丝文档,了解如何切换这些熔丝。
请注意,如果禁用此熔丝,则主进程中的 process.fork 将无法按预期工作,因为它依赖于此环境变量才能工作。相反,我们建议您使用 实用进程,它们适用于许多您需要独立的 Node.js 进程的用例(例如 Sqlite 服务器进程或类似场景)。
您可以在我们的 安全检查清单 中找到更多关于我们推荐的 Electron 应用安全最佳实践的信息。

