跳转到主要内容

10 篇带有“安全”标签的文章

与安全相关的博客文章

查看所有标签

关于 “runAsNode” CVE 的声明

·4 分钟阅读

今天早些时候,Electron 团队注意到最近针对几款著名的 Electron 应用程序发布的几个公共 CVE。这些 CVE 与 Electron 的两个熔断器 - runAsNodeenableNodeCliInspectArguments 相关,并错误地声称如果这些组件没有被主动禁用,远程攻击者可以通过这些组件执行任意代码。

我们不认为这些 CVE 是出于善意发布的。首先,声明是不正确的 - 该配置不会启用远程代码执行。其次,尽管存在漏洞赏金计划,但这些 CVE 中提到的公司尚未收到通知。最后,虽然我们认为禁用有问题的组件可以增强应用程序的安全性,但我们不认为 CVE 的严重性被正确评估了。“严重”是为最高危险问题保留的,而这里的情况肯定不是这样。

任何人都可以请求 CVE。虽然这有利于软件行业的整体健康,但“刷 CVE”以提升单个安全研究人员的声誉是没有帮助的。

也就是说,我们理解仅存在一个具有可怕的 严重 级别的 CVE 可能会导致最终用户困惑,因此作为一个项目,我们希望提供指导和帮助来处理这个问题。

这可能会如何影响我?

在审查了 CVE 之后,Electron 团队认为这些 CVE 并不严重。

攻击者需要已经能够在机器上执行任意命令,要么通过物理访问硬件,要么通过实现完全的远程代码执行。这一点需要重复:所描述的漏洞要求攻击者已经可以访问被攻击的系统

例如,Chrome 不考虑其威胁模型中的物理本地攻击

我们认为这些攻击超出 Chrome 的威胁模型,因为 Chrome(或任何应用程序)无法防御设法以您的身份登录您的设备,或者可以使用您的操作系统用户帐户权限运行软件的恶意用户。这样的攻击者可以修改可执行文件和 DLL、更改环境变量(如 PATH)、更改配置文件、读取您的用户帐户拥有的任何数据、通过电子邮件将其发送给自己等等。这样的攻击者完全控制了您的设备,而 Chrome 的任何操作都无法提供可靠的防御保证。这个问题并非 Chrome 独有 - 所有应用程序都必须信任物理本地用户。

CVE 中描述的漏洞允许攻击者随后将受影响的应用程序用作具有继承 TCC 权限的通用 Node.js 进程。因此,例如,如果该应用程序已被授予对地址簿的访问权限,则攻击者可以将该应用程序作为 Node.js 运行,并执行将继承该地址簿访问权限的任意代码。这通常被称为“借地利用”攻击。攻击者通常使用 PowerShell、Bash 或类似的工具来运行任意代码。

我是否受到影响?

默认情况下,所有已发布的 Electron 版本都启用了 runAsNodeenableNodeCliInspectArguments 功能。如果您没有按照Electron 熔断器文档中所述禁用它们,那么您的应用程序同样容易被用作“借地利用”攻击。再次强调,我们需要强调攻击者需要已经能够在受害者的机器上执行代码和程序。

缓解

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

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

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

从漏洞到屏障:通过沙箱加强应用程序

·4 分钟阅读

CVE-2023-4863:WebP 中的堆缓冲区溢出 公开以来,已经过去一周多了,导致了大量渲染 webp 图像的软件新版本发布:macOS、iOS、Chrome、Firefox 以及各种 Linux 发行版都收到了更新。此前,公民实验室的调查发现,一个“位于华盛顿特区的民间社会组织”使用的 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 设置时,也会禁用沙箱。这是可以理解的:如果您已经使用我们很长时间了,您可能很享受在运行 HTML/CSS 的同一代码中抛出 require("child_process")require("fs") 的强大功能。

在讨论如何迁移到沙箱之前,我们先讨论一下为什么需要它。

沙箱在所有渲染器进程周围设置了一个硬性隔离,确保无论内部发生什么,代码都在受限制的环境中执行。作为一个概念,它比 Chromium 要古老得多,并且是所有主要操作系统都提供的功能。Electron 和 Chromium 的沙箱构建在这些系统功能之上。即使您从不显示用户生成的内容,您也应该考虑您的渲染器可能被破坏的可能性:供应链攻击等复杂场景以及小错误等简单场景都可能导致您的渲染器执行您不完全打算让它执行的操作。

沙箱使这种情况变得不那么可怕:内部进程可以自由使用 CPU 周期和内存——仅此而已。进程无法写入磁盘或显示自己的窗口。在我们 libwep 错误的情况下,沙箱确保攻击者无法安装或运行恶意软件。事实上,在最初的 Pegasus 对员工 iPhone 的攻击中,该攻击专门针对一个非沙箱化的图像进程来获取手机的访问权限,首先突破了通常沙箱化的 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)

·一分钟阅读

在 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 中的漏洞,请发送电子邮件至 [email protected]

Chromium FileReader 漏洞修复

·一分钟阅读

在 Chrome 中发现了一个高危漏洞,该漏洞会影响所有基于 Chromium 的软件,包括 Electron。

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

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


范围

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

缓解

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

我们已经发布了包含此漏洞修复程序的新 Electron 版本

最新的 Electron 5 测试版正在跟踪 Chromium 73,因此已经修补

更多信息

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

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

如果您希望报告 Electron 中的漏洞,请发送电子邮件至 [email protected]

BrowserView window.open() 漏洞修复

·一分钟阅读

发现了一个代码漏洞,允许在子窗口中重新启用 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 中的漏洞,请发送电子邮件至 [email protected]

SQLite 漏洞修复

·一分钟阅读

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


范围

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

缓解

受影响的应用应停止使用 Web SQL,或升级到 Electron 的已修补版本。

我们已经发布了包含此漏洞修复程序的新 Electron 版本

目前尚未有关于该漏洞在实际环境中被利用的报告;但我们强烈建议受影响的应用程序采取缓解措施。

更多信息

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

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

如果您希望报告 Electron 中的漏洞,请发送电子邮件至 [email protected]

WebPreferences 漏洞修复

·2 分钟阅读

已发现一个远程代码执行漏洞,该漏洞会影响在 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 版本,您可以通过在所有 webContents' 的 new-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 手动应用到所有子窗口,无限深入。

更多信息

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

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

如果您希望报告 Electron 中的漏洞,请发送电子邮件至 [email protected]

Webview 漏洞修复

·2 分钟阅读

已发现一个漏洞,该漏洞允许在某些禁用 Node.js 集成的 Electron 应用程序中重新启用 Node.js 集成。该漏洞已被分配 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 事件,并且在不使用提供的 options 标签的情况下手动覆盖 event.newGuest

虽然这似乎只是少数 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 中的漏洞,请发送电子邮件至 [email protected]

请加入我们的邮件列表,以接收有关版本和安全更新的最新信息。

协议处理程序漏洞修复

·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 中的漏洞,请发送电子邮件至 [email protected]

Chromium RCE 漏洞修复

·一分钟阅读

在 Google Chromium 中发现了一个远程代码执行漏洞,该漏洞会影响所有最新版本的 Electron。 任何访问远程内容的 Electron 应用程序都容易受到此漏洞利用的影响,无论是否启用了沙箱选项

我们已经发布了两个新版本的 electron 1.7.81.6.14,这两个版本都包含了针对此漏洞的修复。 我们强烈建议所有 Electron 开发人员立即将他们的应用更新到最新的稳定版本。

npm i electron@latest --save-dev

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

如果您想报告 Electron 中的漏洞,请联系 [email protected]