跳转到主要内容

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

与安全相关的博客文章

查看所有标签

关于 "runAsNode" CVE 的声明

·阅读时长 4 分钟

今天早些时候,Electron 团队收到了关于几个知名 Electron 应用程序近期被公开披露的多个 CVE 的警报。这些 CVE 与 Electron 的两个 fuses 相关——runAsNodeenableNodeCliInspectArguments——并且错误地声称远程攻击者可以在这些组件未被主动禁用时通过它们执行任意代码。

我们认为这些 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 版本都启用了 runAsNodeenableNodeCliInspectArguments 功能。如果您没有按照 Electron Fuses 文档中所述将其关闭,您的应用程序同样容易受到“驻留本地”攻击的利用。再次强调,攻击者需要已经能够在受害者的机器上执行代码和程序。

缓解措施

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

请注意,如果禁用此 fuse,则主进程中的 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 的沙箱建立在这些系统功能之上。即使您从不显示用户生成的内容,也应考虑您的渲染器可能被泄露的可能性:诸如供应链攻击之类的复杂场景以及简单的微小 bug 都可能导致您的渲染器执行您并未完全 intended 的操作。

沙箱会让这种情况的危险性大大降低:内部进程可以自由使用 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 交互移动到主进程(或者,如果您喜欢,可以移动到 utility process)。鉴于渲染器的强大功能,很可能您的大部分代码实际上不需要重构。

    请参考我们关于 进程间通信的文档。在我的例子中,我移动了许多代码并将其包装在 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 分钟

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

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

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


范围

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

缓解措施

受影响的应用应升级到已修复的 Electron 版本。

我们已发布新版本的 Electron,其中包含此漏洞的修复程序。

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

进一步信息

此漏洞由 Kaspersky Labs 的 Anton Ivanov 和 Alexey Kulaev 发现,并报告给 Chrome 团队。Chrome 博客文章可在 此处找到。

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

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

Chromium FileReader 漏洞修复

·阅读时间 2 分钟

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

此漏洞已被分配 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 版本,可以通过禁用所有子 webContents 来缓解此问题。

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

进一步信息

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

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

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

SQLite 漏洞修复

·一分钟阅读

在基于 SQLite 或 Chromium 的软件中发现了一个远程代码执行漏洞,“Magellan”,该漏洞影响包括所有版本的 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 应用于所有深度嵌套的子窗口。

进一步信息

此漏洞由 Matt Austin(来自 Contrast Security)发现并负责任地报告给 Electron 项目。

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

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

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 事件并手动覆盖 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 中的漏洞,请发送电子邮件至 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 漏洞修复

·一分钟阅读

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

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

npm i electron@latest --save-dev

要了解有关保护您的 Electron 应用安全的最佳实践,请参阅我们的安全教程

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