WebAssembly又回来了,Firefox 95中的细粒度沙箱技术

194 阅读6分钟

在Firefox 95中,我们推出了一种名为 RLBox的新型沙盒技术 --与加州大学圣地亚哥分校和德克萨斯大学的研究人员合作开发--使隔离子组件变得简单有效,从而使浏览器更加安全。 这项技术开辟了新的机会,超越了传统的基于进程的沙箱的可能性,我们期待着扩大其使用范围,并(希望)看到它被其他浏览器和软件项目采用。

这项技术使用WebAssembly来隔离有潜在漏洞的代码,它建立在 我们去年向Mac和Linux用户提供的 原型之上 。现在,我们将该技术带到所有支持的火狐平台(桌面和移动),并隔离了五个不同的模块。 Graphite, Hunspell, Ogg, ExpatWoff2[1]。

今后,我们可以将这些模块视为不受信任的代码,而且--假设我们做得对的话--即使其中任何一个模块出现零日漏洞,也不会对火狐浏览器构成威胁。因此,我们已经更新了我们的 bug赏金计划 ,以支付研究人员绕过沙箱的费用,即使隔离库中没有漏洞。

进程沙箱的局限性

所有主要的浏览器都在自己的沙盒进程中运行网络内容,理论上可以防止它利用浏览器的漏洞入侵你的电脑。在桌面操作系统上,火狐也将每个网站隔离在自己的进程中,以保护网站之间的联系。

不幸的是,威胁者经常通过连锁两个漏洞来攻击用户--一个是破坏包含恶意网站的沙盒进程,另一个是逃离沙盒[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消息来利用浏览器的更多特权部分的进程中的漏洞。


报道《WebAssembly又回来了》。这篇文章出现在Mozilla Hacks - 网络开发者博客上。