WebAssembly 和返程:Firefox 95 中的细粒度沙箱

在 Firefox 95 中,我们发布了一种名为 RLBox 的新型沙箱技术——与加州大学圣地亚哥分校和德克萨斯大学的研究人员合作开发——这使得隔离子组件变得容易且高效,从而使浏览器更安全。 这项技术打开了传统基于进程的沙箱无法实现的新机会,我们期待着扩展其使用范围,并希望它能被其他浏览器和软件项目采用。

这项技术利用 WebAssembly 隔离潜在有问题的代码,它建立在我们去年为 Mac 和 Linux 用户发布的 原型 的基础上。现在,我们将这项技术带到了所有支持的 Firefox 平台(台式机和移动设备),并隔离了五个不同的模块: GraphiteHunspellOggExpatWoff2 [1]

展望未来,我们可以将这些模块视为不受信任的代码,并且——假设我们做对了——即使它们中的任何一个存在零日漏洞,也对 Firefox 构不成威胁。因此,我们已经更新了 漏洞赏金计划,以向研究人员支付绕过沙箱的奖励,即使没有被隔离库中的漏洞。

进程沙箱的局限性

所有主要浏览器都在其自己的沙箱进程中运行 Web 内容,理论上可以防止它利用浏览器漏洞来危害您的计算机。在桌面操作系统上,Firefox 还将每个站点隔离在其自己的进程中,以保护站点免受彼此的攻击。

不幸的是,威胁行为者通常通过将两个漏洞链接在一起来攻击用户——一个漏洞会损害包含恶意站点的沙箱进程,另一个漏洞会逃脱沙箱 [2]。为了保护我们的用户免受资金最充足的对手的攻击,我们需要多层保护。

在信任边界上隔离事物之后,下一步合乎逻辑的步骤是在功能边界上进行隔离。从历史上看,这意味着将子组件提升到它自己的进程中。例如,Firefox 在专用且锁定下来的进程中运行音频和视频编解码器,该进程与系统的其余部分的接口有限。然而,这种方法有一些严重的局限性。 首先,它需要解耦代码并使其异步化,这通常很耗时,并且可能会带来性能成本。其次,进程具有固定的内存开销,添加更多进程会增加应用程序的内存占用。

出于所有这些原因,没有人会认真考虑将像 XML 解析器这样的东西提升到它自己的进程中。要在这种粒度级别进行隔离,我们需要不同的方法。

使用 RLBox 隔离

这就是 RLBox 的用武之地。我们不是将代码提升到单独的进程中,而是将其编译成 WebAssembly,然后将该 WebAssembly 编译成本机代码。这不会导致我们在 Firefox 中发布任何 .wasm 文件,因为 WebAssembly 步骤在我们构建过程中的只是一个中间表示。

但是,转换对目标代码施加了两个关键限制:它不能跳转到程序其余部分的意外部分,也不能访问指定区域之外的内存。这两个限制 使得在受信任代码和不受信任代码之间共享地址空间变得安全包括堆栈),使我们能够在同一个进程中运行它们,这与我们之前所做的大致相同。 反过来,这使得它易于应用而无需进行重大重构:程序员只需要清理来自沙箱的任何值(因为它们可能是恶意构建的),RLBox 通过 污点层 使此任务变得轻松。

这种转换的第一步很简单:我们使用 Clang 编译 Firefox,Clang 知道如何发出 WebAssembly,因此我们只需要将给定模块的输出格式从本机代码切换到 wasm 即可。对于第二步,我们的原型实现使用了 Cranelift。Cranelift 非常出色,但第二个本机代码生成器增加了复杂性——我们意识到,将 WebAssembly 映射回我们的现有构建系统可以接受的内容会更简单。

我们使用 wasm2c 达到了这一点,它将 WebAssembly 直接转换为等效的 C 代码,然后我们可以将该代码与 Firefox 源代码的其余部分一起馈送到 Clang。这种方法非常简单,并自动启用我们为常规 Firefox 代码支持的一些重要功能:配置文件引导优化、跨沙箱边界内联、崩溃报告、调试器支持、源代码索引,以及可能我们尚未认识到的其他功能。

下一步

RLBox 在几个方面对我们来说是一个巨大的胜利:它保护我们的用户免受意外缺陷以及供应链攻击,并且减少了我们在上游披露此类问题时需要紧急处理的必要性。 因此,我们打算在未来继续将其应用到更多组件。某些组件不适合这种方法——要么是因为它们过分依赖于与程序其余部分共享内存,要么是因为它们对性能过于敏感,无法接受产生的少量开销——但我们已经确定了一些其他不错的候选者。

此外,我们希望看到这项技术进入其他浏览器和软件项目,以使生态系统更安全。 RLBox 是一个独立的项目,旨在高度模块化且易于使用,该项目背后的团队欢迎其他用例。

说到团队:我要感谢 Shravan NarayanDeian StefanHovav Shacham 为将这项工作从研究概念带到生产做出的不懈努力。向数亿用户发布产品是件难事, 他们完成了一些非常了不起的工作。

在 加州大学圣地亚哥分校雅各布斯工程学院网站 上了解更多关于 RLBox 和此公告的信息。


[1] Graphite、Hunspell 和 Ogg 的跨平台沙箱将在 Firefox 95 中发布,而 Expat 和 Woff2 将在 Firefox 96 中发布。

[2] 通过使用系统调用利用操作系统中的漏洞,或通过使用 IPC 消息利用托管浏览器中权限更高部分的进程中的漏洞。


关于 Bobby Holley

Firefox 首席技术官

更多 Bobby Holley 的文章……