介绍火狐的新网站隔离安全架构

114 阅读10分钟

像任何网络浏览器一样,火狐浏览器从不受信任和有潜在敌意的网站加载代码,并在你的电脑上运行。为了保护你免受来自恶意网站的新型攻击,并满足Mozilla的安全原则,我们着手重新设计桌面版火狐浏览器。

网站隔离建立在一个新的安全架构上,通过分离(网络)内容和在其自己的操作系统进程中加载每个网站,扩展了当前的保护机制。

这种新的安全架构使火狐能够完全分离来自不同网站的代码,并反过来抵御恶意网站试图从你访问的其他网站获取敏感信息。

更详细地说,每当你打开一个网站并输入密码、信用卡号码或任何其他敏感信息时,你都希望确保这些信息是安全的,并且无法被恶意行为者获取。

作为第一道防线,火狐浏览器执行了各种安全机制,例如,同源策略可以防止对手在加载到同一个应用程序时访问这些信息。

不幸的是,网络在发展,恶意行为者的技术也在发展。为了充分保护你的私人信息,现代网络浏览器不仅需要在应用层提供保护,而且还需要完全分离不同网站的内存空间--火狐浏览器中新的网站隔离安全架构提供了这些安全保证。

为什么分离内存空间是至关重要的

2018年初,安全研究人员披露了两个主要的漏洞,被称为MeltdownSpectre。研究人员利用了关于现代硬件执行的基本假设,并能够证明不受信任的代码如何能够访问和读取进程地址空间内的任何地方的内存,即使是像JavaScript这样的高级语言(它几乎为每一个网站提供动力)。

虽然由操作系统、CPU和主要网络浏览器供应商部署的创可贴对策很快就消除了这些攻击,但它们是以性能为代价的,而且是临时性的。早在这些攻击被公开宣布时,火狐团队就迅速降低了高精度计时器的精度,并禁用了允许实施此类计时器的API,以保证我们用户的安全。

展望未来,很明显,我们需要从根本上重新架构火狐的安全设计,以减轻未来此类漏洞的变化。

让我们仔细看看下面这个例子,它展示了攻击者如何在执行类似Spectre的攻击时访问你的私人数据。

Two hand-drawn diagrams, with the first labeled “Without Site Isolation, we might load both of these sites in the same process :( ”. Two browser windows with partially visible sites “attacker.com” and “my-bank” partial site, are loaded in the same process - process 16. On top of the banking window, there is a cartoon face that looks happy, personifying the browser. The attacker site window contains a face that is looking at the banking window, with a mischievous smile. In the second diagram, labeled “Attacker.com executes a sophisticated attack”, we see the same two browser windows loaded in process 16 and a 1 column table labelled “memory where my-bank’s data is stored in process 16” underneath the banking window. It has two entries: “credit card info” and “login password”. A hand extending from the malicious site reaches toward the table (aka memory of the second window), signifying that the malicious site is able to access sensitive data belonging to the banking window because it is in the same process. The personified browser character is looking towards the malicious site, and exhibits feelings of concern and worry, with exclamation marks floating around the face.

通过网站隔离,火狐在自己的进程中加载每个网站,从而将它们的内存相互隔离,并依靠操作系统的安全保障。

假设你有两个网站打开--www.my-bank.comwww.attacker.com。如上图所示,在目前的网络浏览器架构下,两个网站的网络内容有可能最终被加载到同一个操作系统进程中。更糟糕的是,使用类似Spectre的攻击将允许attacker.com查询和访问来自my-bank.com网站的数据。

尽管有现有的安全缓解措施,但提供必要的内存保护以抵御类似Spectre的攻击的唯一方法是依靠使用操作系统的进程分离来隔离不同网站的内容的安全保证。

当前浏览器架构的背景

在启动时,Firefox网络浏览器在内部产生一个特权进程(也称为父进程),然后启动并协调多个(网络)内容进程的活动--父进程是最有特权的一个,因为它被允许执行最终用户可以执行的任何行动。

这种多进程结构允许火狐浏览器将更复杂或不太可信的代码分离到进程中,其中大部分进程对操作系统资源或用户文件的访问减少。因此,权限较小的代码将需要要求权限较大的代码执行它自己无法执行的操作。

例如,一个内容进程将不得不要求父进程保存一个下载,因为它没有写到磁盘的权限。换句话说,如果攻击者设法破坏了内容进程,它必须另外(滥用)一个API来说服父进程代表它采取行动。

详细来说,(截至2021年4月)火狐浏览器的父进程启动了固定数量的进程:八个网络内容进程,最多两个额外的半特权网络内容进程,以及四个用于网络扩展、GPU操作、网络和媒体解码的实用进程。

虽然将内容分成目前的八个网络内容进程已经提供了一个坚实的基础,但它并不符合Mozilla的安全标准,因为它允许两个完全不同的网站最终出现在同一个操作系统进程中,因此,共享进程内存。为了应对这种情况,我们的目标是采用网站隔离架构,将每个网站加载到自己的进程中。

A hand drawn diagram titled “Loading Sites with Current Browser Architecture”. On the left hand-side, from top to bottom, there are four browser windows with different sites loaded. The first window, www.my-bank.com, is loaded in process 3. The second window is loaded in process 4. The third window is loaded in process 5. The last window with a url - “www.attacker.com” - is loaded in process 3, same as the first window. On the right hand-side of the drawing, there is a table titled “List of Content Processes”. The table contains two columns: “site” and “pid”, which stands for process id. In the table, the first window, my-bank.com, and the last attacker.com window have the same PID.

如果没有 "站点隔离",火狐浏览器不会将网页内容分离到不同的进程中,不同的网站有可能被加载到同一个进程中。

想象一下,你在不同的标签中打开一些网站:www.my-bank.com、www.getpocket.com、www.mozilla.orgwww.attacker.com。如上图所示,my-bank.com和attacker.com完全有可能最终被加载在同一个操作系统进程中,这将导致它们共享进程内存。正如我们在前面的例子中看到的,在这种分离模式下,攻击者可以进行类似Spectre的攻击来访问my-bank.com的数据。

A hand drawn diagram titled “Loading Subframes With Current Browser Architecture”. There is one browser window drawn. The window, www.attacker.com, embeds a page from a different site, www.my-bank.com. The top level page and the subframe are loaded in the same process - process 3.

如果没有网站隔离,浏览器将在与顶级文档相同的进程中加载嵌入式页面,如银行页面或广告。

虽然可以直接理解为网站被加载到不同的标签中,但也有可能网站通过所谓的子框架被嵌入到其他网站中--如果你曾经访问过一个网站,上面有广告,那些可能就是子框架。如果你曾经有一个个人网站,并在其中嵌入了你最喜欢的歌曲的YouTube视频,那么YouTube视频就被嵌入了一个子框架。

在一个更危险的情况下,一个恶意网站可以在子框架中嵌入一个合法网站,并试图欺骗你输入敏感信息。在目前的架构下,如果一个页面包含任何来自不同网站的子框架,它们通常会与外部标签处于同一进程。

这导致页面和其所有的子框架共享进程内存,即使这些子框架来自不同的网站。在类似Spectre攻击成功的情况下,一个顶级网站可能会从它嵌入的子框架中访问它不应该访问的敏感信息(反之亦然)--Firefox中新的网站隔离安全架构将有效地使恶意网站更难执行此类攻击。

网站隔离在火狐浏览器中如何工作

在桌面版火狐浏览器中启用网站隔离时,每个独特的网站都在一个单独的进程中加载。更详细地说,加载 "mozilla.org "和同时加载 "getpocket.com "将导致 "站点隔离 "将这两个站点分离到它们自己的操作系统进程中,因为它们不被认为是 "同一站点"。

同样,"getpocket.com"(注意http和https之间的区别)也将被加载到一个单独的进程中--所以最终所有三个网站将在不同的进程中加载。

为了完整起见,有一些域名,如".github.io "或".blogspot.com",会过于笼统,无法识别一个 "网站"。这就是为什么我们使用社区维护的有效顶级域名(eTLD)列表来帮助区分网站的原因。

由于 "github.io "被列为eTLD,"a.github.io "和 "b.github.io "将在不同进程中加载。在我们运行的例子中,网站 "www.my-bank.com "和 "www.attacker.com "不被认为是相互之间的 "同网站",将被隔离在不同的进程中。

Two hand-drawn diagrams, with the first labeled “With Site Isolation, we will load these sites in different processes”. It shows two browser windows, one www.attacker.com , loaded in process 5, and www.my-bank.com loaded in process 16. On top of the banking window, there is a cartoon face that looks happy, personifying the browser. In contrast, the webpage area of the www.attacker.com window, contains a face that is looking at the banking window, with a mischievous smile. In the second diagram, labeled “Attacker.com tries to execute a sophisticated attack”, we see the same two browser windows. There is a 1 column table labelled “memory where my-bank’s data is stored in process 16” underneath the banking window . It has two entries: “credit card info” and “login password”. A hand extending from the malicious site tries to reach towards the table (aka memory of the banking window), but is unable to reach it, due to the process boundary. The face of the malicious site is frowning and looks unhappy, while the face, representing the browser, continues to look happy and carefree. The second window’s data is safe from the malicious site.

通过网站隔离,Firefox在自己的进程中加载每个网站,从而将它们的内存相互隔离,并依靠操作系统的安全保证。

假设现在,你打开同样的两个网站:www.attacker.comwww.my-bank.com,如上图所示。网站隔离认识到这两个网站不是 "同一网站",因此网站隔离架构将把来自attacker.com和my-bank.com的内容完全分离到独立的操作系统进程中。

这种来自不同网站内容的进程分离提供了安全浏览体验所需的内存保护,使网站更难执行类似Spectre的攻击,并最终为我们的用户提供安全的浏览体验。

The window, www.attacker.com, embeds a page from a different site, www.my-bank.com. The top level page is loaded in process 3 and the subframe corresponding to the bank site is loaded in process 5. The two sites are, thus, isolated from each other in different operating system processes.

通过网站隔离,火狐浏览器在自己的进程中加载来自不同网站的子框架。

与将网站加载到两个不同的标签中相同的是,当加载到子框架中时,两个不同的网站被分离。让我们再来看看先前的一个例子,在这个例子中,页面包含子框架,有了 "站点隔离",与顶层页面不在同一站点的子框架将在不同的进程中加载。

在上图中,我们看到页面www.attacker.com,嵌入了一个来自www.my-bank.com 的页面,并在不同的进程中加载。让来自不同网站的顶级文件和子框架在它们自己的进程中加载,可以确保它们的内存相互隔离,产生深刻的安全保障。

网站隔离的其他好处

有了站点隔离架构,我们就能为Firefox带来额外的安全加固,以保证你和你的数据安全。除了对可能的安全威胁提供额外的防御层,网站隔离还带来了其他的好处。

  • 通过将更多的页面放在独立的进程中,我们可以确保在一个页面上进行繁重的计算或垃圾收集不会降低其他进程中的页面的响应速度。
  • 使用更多的进程来加载网站,使我们能够将工作分散到许多CPU核心,并更有效地使用底层硬件。
  • 由于网站的细粒度分离,一个子框架或一个标签的崩溃不会影响在不同进程中加载的网站,从而提高应用程序的稳定性和更好的用户体验。

继续前进

我们目前正在桌面浏览器Nightly和Beta版上测试网站隔离,并将很快推广到更多的桌面用户。然而,如果你现在已经想从改进的安全架构中获益,你可以从这里下载Nightly或Beta浏览器,并按照以下步骤启用它。

要在Firefox Nightly上启用网站隔离。

  1. 导航到about:preferences#experimental
  2. 勾选 "Fission (Site Isolation) "复选框以启用。
  3. 重新启动火狐。

要在Firefox Beta或Release上启用网站隔离。

  1. 导航至about:config。
  2. 将 "fission.autostart "设置为 "true"。
  3. 重新启动Firefox。

关于我们如何将网站和子框架分组的技术细节,你可以在 "about:process"(在地址栏中输入)查看我们新的进程管理器工具,并关注wiki.mozilla.org/Project\_Fi…](wiki.mozilla.org/Project_Fis…)

在桌面版火狐浏览器上启用站点隔离后,Mozilla将其安全保障提升到了一个新的水平,并通过对每个站点的操作系统级进程分离的内存保护来保护你免受新一类恶意攻击。如果你有兴趣为Mozilla的开源项目做出贡献,如果你在启用站点隔离后遇到任何问题,你可以帮助我们在这里提交bug。