跳到主内容

10 篇标记为“安全”的文章

与安全相关的博客文章

查看所有标签

关于 “runAsNode” CVE 的声明

·4 分钟阅读

今天早些时候,Electron 团队收到警报,发现最近针对几个著名的 Electron 应用程序提交了多项公开 CVE。这些 CVE 与 Electron 的两个熔断器 (fuses)——runAsNodeenableNodeCliInspectArguments 相关,并且错误地声称如果这些组件未被主动禁用,远程攻击者可以通过它们执行任意代码。

我们认为这些 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 版本都启用了 runAsNodeenableNodeCliInspectArguments 功能。如果您尚未按照 Electron Fuses 文档中描述的方式禁用它们,您的应用程序同样容易被用作“借地攻击”。再次强调,攻击者需要已经能够在受害者的机器上执行代码和程序。

缓解措施

缓解此问题的最简单方法是禁用 Electron 应用程序中的 runAsNode 熔断器。runAsNode 熔断器控制 ELECTRON_RUN_AS_NODE 环境变量是否生效。有关如何切换这些熔断器的信息,请参阅 Electron Fuses 文档

请注意,如果此熔断器被禁用,那么主进程中的 process.fork 将无法按预期工作,因为它依赖于此环境变量才能运行。作为替代,我们建议您使用实用进程 (Utility Processes),它适用于许多需要独立 Node.js 进程的用例(如 Sqlite 服务器进程或类似场景)。

您可以在我们的安全清单中找到更多关于我们推荐的 Electron 应用程序安全最佳实践信息。

从漏洞到屏障:通过沙盒强化应用

·5 分钟阅读

CVE-2023-4863:WebP 中的堆缓冲区溢出公开以来,已过去一个多星期,这导致了渲染 webp 图像的软件发布了一系列新版本:macOS、iOS、Chrome、Firefox 和各种 Linux 发行版都收到了更新。此前,公民实验室 (Citizen Lab) 的调查发现,一部“华盛顿特区民间社会组织”使用的 iPhone 正在遭受 iMessage 内零点击漏洞的攻击。

Electron 也迅速行动,并在同一天发布了新版本:如果您的应用程序渲染任何用户提供的内容,您应该更新您的 Electron 版本——v27.0.0-beta.2、v26.2.1、v25.8.1、v24.8.3 和 v22.3.24 都包含修复后的 libwebp 版本,这是负责渲染 webp 图像的库。

现在我们都清楚地意识到,“渲染图像”这样看似无害的交互也是潜在的危险活动,我们想借此机会提醒大家,Electron 带有进程沙盒,这将限制下一次大规模攻击的爆炸半径——无论它是什么。

沙盒自 Electron v1 以来就已可用,并在 v20 中默认启用,但我们知道许多应用程序(尤其是那些已经存在了一段时间的应用程序)可能在其代码中某个地方包含 sandbox: false,或者 nodeIntegration: true,这在没有明确的 sandbox 设置时同样会禁用沙盒。这可以理解:如果您与我们合作了很长时间,您可能很享受将 require("child_process")require("fs") 抛到运行 HTML/CSS 的同一代码中的强大功能。

在我们讨论如何迁移到沙盒之前,让我们先讨论为什么要使用它。

沙盒为所有渲染器进程设置了一个坚固的“笼子”,确保无论内部发生什么,代码都在受限环境中执行。作为一个概念,它比 Chromium 早得多,并由所有主要操作系统提供作为一项功能。Electron 和 Chromium 的沙盒建立在这些系统功能之上。即使您从不显示用户生成的内容,您也应该考虑您的渲染器可能会被攻破的可能性:复杂的供应链攻击和简单的小错误都可能导致您的渲染器做出您完全不希望它做的事情。

沙盒使这种情况不那么可怕:内部进程可以自由使用 CPU 周期和内存——仅此而已。进程不能写入磁盘或显示自己的窗口。在我们的 libwep 错误情况下,沙盒确保攻击者无法安装或运行恶意软件。事实上,在最初的针对员工 iPhone 的 Pegasus 攻击中,攻击专门针对了非沙盒化的图像进程以获取对手机的访问权限,首先突破了通常沙盒化的 iMessage 的边界。当像这个例子中的 CVE 被宣布时,您仍然需要将您的 Electron 应用程序升级到安全版本——但与此同时,攻击者可以造成的损害将大大受限。

将一个纯粹的 Electron 应用程序从 sandbox: false 迁移到 sandbox: true 是一项工作。我知道,因为尽管我亲自撰写了Electron 安全指南的初稿,但我未能将我自己的一个应用程序迁移到使用它。这个周末我做到了,我建议你也这样做。

Don’t be scared by the number of line changes, most of it is in package-lock.json

您需要解决两件事

  1. 如果您在 preload 脚本或实际的 WebContents 中使用 Node.js 代码,则需要将所有 Node.js 交互移动到主进程(或者,如果您喜欢,移动到实用进程)。考虑到渲染器已经变得多么强大,您的绝大多数代码很可能不需要重构。

    请查阅我们关于进程间通信的文档。在我的案例中,我移动了大量代码并将其封装在 ipcRenderer.invoke()ipcMain.handle() 中,但这个过程很直接,很快就完成了。在这里对您的 API 稍微留心一点——如果您构建了一个名为 executeCodeAsRoot(code) 的 API,沙盒将不会对您的用户提供太多保护。

  2. 由于启用沙盒会禁用预加载脚本中的 Node.js 集成,您将无法再使用 require("../my-script")。换句话说,您的预加载脚本需要是单个文件。

    有多种方法可以做到这一点:Webpack、esbuild、parcel 和 rollup 都能完成这项工作。我使用了Electron Forge 出色的 Webpack 插件,同样流行的 electron-builder 的用户可以使用electron-webpack

总而言之,整个过程花了我大约四天时间——这其中包含了许多让我抓耳挠腮地琢磨如何驾驭 Webpack 强大功能的时间,因为我也决定借此机会以许多其他方式重构我的代码。

Chromium WebAudio 漏洞修复 (CVE-2019-13720)

·2 分钟阅读

Chrome 中发现了一个高严重性漏洞,它影响所有基于 Chromium 的软件,包括 Electron。

此漏洞已被分配 CVE-2019-13720。您可以在Chrome 博客文章中阅读更多相关信息。

请注意,Chrome 有报告称此漏洞已在野外被利用,因此强烈建议您尽快升级 Electron。


范围

这会影响任何可能运行第三方或不受信任 JavaScript 的 Electron 应用程序。

缓解措施

受影响的应用程序应升级到已打补丁的 Electron 版本。

我们已经发布了新的 Electron 版本,其中包括针对此漏洞的修复

Electron 7.0.1 在发布公告之前已自动包含了上游的修复。Electron 8 同样不受影响。此漏洞不存在于 Electron 5 中,因此该版本也不受影响。

更多信息

此漏洞由卡巴斯基实验室的 Anton Ivanov 和 Alexey Kulaev 发现,并报告给 Chrome 团队。Chrome 博客文章可在此处找到。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

Chromium FileReader 漏洞修复

·2 分钟阅读

Chrome 中发现了一个高严重性漏洞,它影响所有基于 Chromium 的软件,包括 Electron。

此漏洞已被分配 CVE-2019-5786。您可以在Chrome 博客文章中阅读更多相关信息。

请注意,Chrome 有报告称此漏洞已在野外被利用,因此强烈建议您尽快升级 Electron。


范围

这会影响任何可能运行第三方或不受信任 JavaScript 的 Electron 应用程序。

缓解措施

受影响的应用程序应升级到已打补丁的 Electron 版本。

我们已经发布了新的 Electron 版本,其中包括针对此漏洞的修复

Electron 5 的最新测试版已跟踪 Chromium 73,因此已打上补丁

更多信息

此漏洞由 Google 威胁分析小组的 Clement Lecigne 发现,并报告给 Chrome 团队。Chrome 博客文章可在此处找到。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

BrowserView window.open() 漏洞修复

·2 分钟阅读

发现了一个代码漏洞,该漏洞允许在子窗口中重新启用 Node。


使用 sandbox: truenativeWindowOpen: truenodeIntegration: false 打开 BrowserView 会导致 webContents 中可以调用 window.open,并且新打开的子窗口将启用 nodeIntegration。此漏洞影响所有受支持的 Electron 版本。

缓解措施

我们已发布包含此漏洞修复的新版 Electron:2.0.173.0.153.1.34.0.45.0.0-beta.2。我们鼓励所有 Electron 开发者立即将其应用程序更新到最新的稳定版本。

如果由于某种原因您无法升级您的 Electron 版本,您可以通过禁用所有子 Web 内容来缓解此问题

view.webContents.on('-add-new-contents', (e) => e.preventDefault());

更多信息

此漏洞由 PalmerAL 发现并负责任地报告给 Electron 项目。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

SQLite 漏洞修复

·1 分钟阅读

已发现一个远程代码执行漏洞“麦哲伦”,它影响所有基于 SQLite 或 Chromium 的软件,包括所有版本的 Electron。


范围

使用 Web SQL 的 Electron 应用程序受到影响。

缓解措施

受影响的应用程序应停止使用 Web SQL 或升级到已打补丁的 Electron 版本。

我们已经发布了新的 Electron 版本,其中包括针对此漏洞的修复

目前没有该漏洞在野外被利用的报告;然而,受影响的应用程序被敦促采取缓解措施。

更多信息

此漏洞由腾讯 Blade 团队发现,他们已发布一篇讨论该漏洞的博客文章

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

WebPreferences 漏洞修复

·3 分钟阅读

已发现一个远程代码执行漏洞,影响在 Electron 版本(3.0.0-beta.6、2.0.7、1.8.7 和 1.7.15)中具有打开嵌套子窗口能力的应用程序。此漏洞已被分配 CVE 标识符 CVE-2018-15685


受影响的平台

如果您符合以下情况,则会受到影响:

  1. 您嵌入了任何远程用户内容,即使在沙盒中也是如此
  2. 您接受包含任何 XSS 漏洞的用户输入

详情

如果任何用户代码在 iframe 内运行或可以创建 iframe,您就会受到影响。考虑到 XSS 漏洞的可能性,可以假定大多数应用程序在此情况下都是脆弱的。

如果您使用 nativeWindowOpen: truesandbox: true 选项打开任何窗口,您也会受到影响。尽管此漏洞也需要您的应用程序中存在 XSS 漏洞,但如果您使用这些选项中的任何一个,仍应应用以下缓解措施之一。

缓解措施

我们已发布包含此漏洞修复的新版 Electron:3.0.0-beta.72.0.81.8.81.7.16。我们敦促所有 Electron 开发者立即将其应用程序更新到最新的稳定版本。

如果由于某种原因您无法升级您的 Electron 版本,您可以通过对所有 webContentsnew-window 事件统一调用 event.preventDefault() 来保护您的应用程序。如果您根本不使用 window.open 或任何子窗口,那么这对于您的应用程序也是一个有效的缓解措施。

mainWindow.webContents.on('new-window', (e) => e.preventDefault());

如果您依赖子窗口创建孙子窗口的能力,那么第三种缓解策略是在顶层窗口中使用以下代码

const enforceInheritance = (topWebContents) => {
const handle = (webContents) => {
webContents.on(
'new-window',
(event, url, frameName, disposition, options) => {
if (!options.webPreferences) {
options.webPreferences = {};
}
Object.assign(
options.webPreferences,
topWebContents.getLastWebPreferences(),
);
if (options.webContents) {
handle(options.webContents);
}
},
);
};
handle(topWebContents);
};

enforceInheritance(mainWindow.webContents);

此代码将手动强制顶层窗口的 webPreferences 无限深度地应用于所有子窗口。

更多信息

此漏洞由 Contrast SecurityMatt Austin 发现并负责任地报告给 Electron 项目。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

Webview 漏洞修复

·2 分钟阅读

已发现一个漏洞,它允许在某些禁用 Node.js 集成的 Electron 应用程序中重新启用它。此漏洞已被分配 CVE 标识符 CVE-2018-1000136


受影响的应用程序

如果同时满足以下所有条件,则应用程序会受到影响:

  1. 运行在 Electron 1.7、1.8 或 2.0.0-beta 版本上
  2. 允许执行任意远程代码
  3. 禁用 Node.js 集成
  4. 未在其 webPreferences 中明确声明 webviewTag: false
  5. 未启用 nativeWindowOption 选项
  6. 未拦截 new-window 事件并手动覆盖 event.newGuest,且未使用提供的 options 标签

尽管这似乎只影响少数 Electron 应用程序,但我们仍鼓励所有应用程序进行升级以作为预防措施。

缓解措施

此漏洞已在今天发布的 1.7.131.8.42.0.0-beta.5 版本中修复。

无法升级其应用程序 Electron 版本的开发者可以通过以下代码缓解此漏洞

app.on('web-contents-created', (event, win) => {
win.on(
'new-window',
(event, newURL, frameName, disposition, options, additionalFeatures) => {
if (!options.webPreferences) options.webPreferences = {};
options.webPreferences.nodeIntegration = false;
options.webPreferences.nodeIntegrationInWorker = false;
options.webPreferences.webviewTag = false;
delete options.webPreferences.preload;
},
);
});

// and *IF* you don't use WebViews at all,
// you might also want
app.on('web-contents-created', (event, win) => {
win.on('will-attach-webview', (event, webPreferences, params) => {
event.preventDefault();
});
});

更多信息

此漏洞由 Trustwave SpiderLabs 的 Brendan Scarvell 发现并负责任地报告给 Electron 项目。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如需报告 Electron 中的漏洞,请发送电子邮件至 security@electronjs.org

请加入我们的邮件列表,以接收关于发布和安全更新的信息。

协议处理程序漏洞修复

·2 分钟阅读

已发现一个远程代码执行漏洞,影响使用自定义协议处理程序的 Electron 应用程序。此漏洞已被分配 CVE 标识符 CVE-2018-1000006


受影响的平台

旨在 Windows 上运行并注册自身为协议(如 myapp://)默认处理程序的 Electron 应用程序易受攻击。

此类应用程序无论协议如何注册(例如使用原生代码、Windows 注册表或 Electron 的 app.setAsDefaultProtocolClient API),都可能受到影响。

macOS 和 Linux 不受此问题影响

缓解措施

我们已发布包含此漏洞修复的新版 Electron:1.8.2-beta.51.7.121.6.17。我们敦促所有 Electron 开发者立即将其应用程序更新到最新的稳定版本。

如果由于某种原因您无法升级您的 Electron 版本,您可以在调用 app.setAsDefaultProtocolClient 时将 -- 作为最后一个参数附加,这可以防止 Chromium 解析后续选项。双破折号 -- 表示命令选项的结束,之后只接受位置参数。

app.setAsDefaultProtocolClient(protocol, process.execPath, [
'--your-switches-here',
'--',
]);

更多详情请参阅 app.setAsDefaultProtocolClient API。

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请发送电子邮件至security@electronjs.org

Chromium RCE 漏洞修复

·1 分钟阅读

在 Google Chromium 中发现了一个远程代码执行漏洞,它影响所有近期版本的 Electron。任何访问远程内容的 Electron 应用程序都易受此漏洞攻击,无论是否启用沙盒选项

我们已发布两个新版本 Electron 1.7.81.6.14,它们都包含了此漏洞的修复。我们敦促所有 Electron 开发者立即将其应用程序更新到最新的稳定版本

npm i electron@latest --save-dev

要了解更多关于保持 Electron 应用程序安全的最佳实践,请参阅我们的安全教程

如果您希望报告 Electron 中的漏洞,请联系 security@electronjs.org