作者: felixrieseberg
译者: Benny Shi
自 CVE-2023-4863: Heap buffer overflow in 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
设置时,这同样会禁用沙箱。这是可以理解的:如果你与我们相处了很长时间,你可能喜欢在运行你的 HTML/CSS 的同一段代码中加入 require("child_process")
或 require("fs")
。
在我们讨论如何迁移到沙箱之前,让我们首先讨论为什么你需要它。
沙箱为所有渲染进程设置了一个坚固的笼子,确保无论里面发生什么,代码都在一个受限的环境中执行。作为一个概念,它比 Chromium 要早得多,并且被所有主要的操作系统提供为一个特性。Electron 的和 Chromium 的沙箱都是基于这些系统特性构建的。即使你从未显示用户生成的内容,你也应该考虑到你的渲染器可能会被破坏的可能性:从供应链攻击这样复杂的情境到小错误这样简单的情境都可能导致你的渲染器做出意料之外的事。
沙箱使得这种情况变得不那么可怕:沙箱内的进程可以自由地使用 CPU 周期和内存(仅此而已)。进程不能写入磁盘或显示它们自己的窗口。在 libwep
错误的情况下,沙箱能够确保攻击者无法安装或运行恶意软件。事实上,在对员工 iPhone 的原始 Pegasus 攻击中,攻击特意针对一个非沙箱化的图像进程来获得对手机的访问权限,首先突破了通常沙箱化的 iMessage 的边界。当像这个例子中的 CVE 被公布时,你仍然需要将你的 Electron 应用升级到一个安全的版本——但与此同时,攻击者能造成的损害将会大大减少。
将一个普通的 Electron 应用从 sandbox: false
迁移到 sandbox: true
是一项重大任务。我知道,因为尽管我亲自写了 Electron 安全指南的初稿,但我还没有成功地迁移我的一个应用来使用它。这个周末这种情况发生了变化,我建议你也做出改变。
你需要处理两件事:
如果你在 preload
脚本或实际的 WebContents
中使用 Node.js 代码,你需要将所有 Node.js 交互移动到主进程(或者放在一个 Utility 进程)。考虑到渲染器已经变得如此强大,很有可能你的大部分代码实际上并不真正需要重构。
请参考我们关于进程间通信的文档。在我的情况下,我移动了很多代码并将其包装在 ipcRenderer.invoke()
和 ipcMain.handle()
中,但这个过程是直接的并且很快完成。在这里稍微注意一下你的 API - 如果你构建了一个名为 executeCodeAsRoot(code)
的 API,沙箱不会为你的用户提供太多保护。
由于启用沙箱会在你的预加载脚本中禁用 Node.js 集成,你不能再使用 require("../my-script")
。换句话说,你的预加载脚本需要是一个单独的文件。
有多种方法可以做到这一点:Webpack、esbuild、parcel 和 rollup 都可以完成这项工作。我使用了Electron Forge 的出色的 Webpack 插件,同样受欢迎的 electron-builder
的用户可以使用 electron-webpack
。
总的来说,整个过程花了我大约四天的时间——这包括我决定利用这个机会以其他方式重构我的代码,所以我花了很多时间思考如何驾驭 Webpack 的巨大能力。
原文: Breach to Barrier: Strengthening Apps with the Sandbox
Electron China 社区