关于 "runAsNode" CVE 的声明
今天早些时候,Electron 团队收到警报,称最近针对几款著名的 Electron 应用提交了多个公共 CVE。 这些 CVE 与 Electron 的两个 熔断器 - runAsNode
和 enableNodeCliInspectArguments
相关,并错误地声称,如果这些组件未被主动禁用,远程攻击者能够通过这些组件执行任意代码。
我们不认为这些 CVE 是出于善意提交的。 首先,声明是不正确的 - 该配置不启用远程代码执行。 其次,尽管拥有漏洞赏金计划,但这些 CVE 中点名的公司尚未收到通知。 最后,虽然我们确实认为禁用相关组件可以增强应用安全性,但我们不认为这些 CVE 是以正确的严重性级别提交的。 “严重”是为最高危险级别的问题保留的,而这里的情况肯定不是这样。
任何人都可以请求 CVE。 虽然这对软件行业的整体健康有益,但“刷 CVE”以提升单个安全研究人员的声誉并没有帮助。
也就是说,我们理解仅 CVE 的存在以及可怕的 critical
严重性可能会导致最终用户感到困惑,因此作为一个项目,我们想提供指导和帮助来处理这个问题。
这可能对我有什么影响?
在审查了这些 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 应用推荐的安全最佳实践的更多信息。