安全沙箱:⻚面和系统之间的隔离墙
从稳定性视⻆来看,单进程架构的浏览器是不稳定的,因为只要浏览器进程中的任意一个功
能出现异常都有可能影响到整个浏览器,如⻚面卡死、浏览器崩溃等。
浏览器架构是如何影响到操作系统安全的?
XSS攻击只是将恶意的Javascript脚本注入到页面中。而浏览器漏洞攻击是可以入侵到浏览器内部,可以读取和修改浏览器进程内部的任意内容,操作用户硬盘上的文件内容。
安全视⻆下的多进程架构
下面我们重点从操作系统安全的视⻆来看看浏览器的多进程架构,如下图:
浏览器被划分为浏览器内核和渲染内核两个核心模块,其中浏览器内核是由网络进程、浏览器主进程和 GPU 进程组成的,渲染内核就是渲染进程。
所有的网络资源都是通过浏览器内核来下载的,下载后的资源会通过 IPC 将其提交给渲染进程(浏览器内核和渲染进程之间都是通过 IPC 来通信的)。然后渲染进程会对这些资源进行解析、绘制等操作,最终生成一幅图片。但是渲染进程并不负责将图片显示到界面上,而是将最终生成的图片提交给浏览器内核模块,由浏览器内核模块负责显示这张图片。
安全沙箱
基于安全原因,我们需要在渲染进程和操作系统之间建一道墙,即便渲染进程由于存在漏洞被黑客攻击,但由于这道墙,黑客就获取不到渲染进程之外的任何操作权限。将渲染进程和操作系统隔离的这道墙就是我们要聊的安全沙箱。
浏览器中的安全沙箱是利用操作系统提供的安全技术,让渲染进程在执行过程中无法访问或者修改操作系统中的数据,在渲染进程需要访问系统资源的时候,需要通过浏览器内核来实现,然后将访问的结果通过 IPC 转发给渲染进程。
安全沙箱的最下单位是进程,单进程浏览器需要频繁访问或修改操作系统的数据,所以单进程浏览器是无法被安全沙箱保护的。
安全沙箱如何影响各个模块功能
我们知道安全沙箱最小的保护单位是进程,并且能限制进程对操作系统资源的访问和修改,
这就意味着如果要让安全沙箱应用在某个进程上,那么这个进程必须没有读写操作系统的功
能,比如读写本地文件、发起网络请求、调用 GPU 接口等。
那安全沙箱是如何影响到各个模块功能的呢?
- 持久化存储
现代浏览器将读写文件的操作全部放在了浏览器内核中实现,然后通过 IPC 将操作结果转发给渲染进程。 - 网络访问
在渲染进程内部也是不能直接访问网络的,如果要访问网络,则需要通过浏览器内核。不过浏览器内核在处理 URL 请求之前,会检查渲染进程是否有权限请求该 URL,比如检查 XMLHttpRequest 或者 Fetch 是否是跨站点请求,或者检测HTTPS 的站点中是否包含了 HTTP 的请求。 - 用户交互
在现代浏览器中,由于每个渲染进程都有安全沙箱的保护,所以在渲染进程内部是无法直接操作窗口句柄的,这也是为了限制渲染进程监控到用户的输入事件。由于渲染进程不能直接访问窗口句柄,所以渲染进程需要完成以下两点大的改变。
第一点,渲染进程需要渲染出位图。
第二点,操作系统没有将用户输入事件直接传递给渲染进程,而是将这些事件传递给浏览器内核。然后浏览器内核再根据当前浏览器界面的状态来判断如何调度这些事件。
站点隔离(Site Isolation)
所谓站点隔离是指 Chrome 将同一站点(包含了相同根域名和相同协议的地址)中相互关联的⻚面放到同一个渲染进程中执行。
最开始 Chrome 划分渲染进程是以标签⻚为单位,也就是说整个标签⻚会被划分给某个渲染进程。由标签页划分会存在一些问题,原因就是一个标签页中可能包含了多个iframe,而这些 iframe 又有可能来自于不同的站点,这就导致了多个不同站点中的内容通过 iframe 同时运行在同一个渲染进程中。这就导致了系统漏洞会被某个含有恶意iframe入侵到渲染进程,攻击到网页中所有iframe内容。
因此Chrome几年前就开始重构代码,将标签级进程重构为iframe级的渲染进程,然后严格按照同一站点的策略来分配渲染进程,这就是Chrome中的站点隔离。
此文章为5月Day1学习笔记,内容来源于极客时间《浏览器原理》,学习使我快乐,每天进步一点点💪💪
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net