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