浏览器系统安全
浏览器安全可以分为三大块:Web 页面安全、浏览器网络安全和浏览器系统安全。
一、浏览器安全架构
单进程架构的浏览器除了不稳定,还存在严重的安全问题,如果存在漏洞,就有可能被注入恶意程序。
最常见的是利用缓冲区溢出入侵到浏览器进程内部,它会穿透浏览器威胁操作系统安全,导致操作系统上所有资料都不安全,远比 XSS 漏洞可怕。
为了提高安全性,浏览器的采用了如下的多进程架构,并且提供了安全沙箱和站点隔离来进一步加强安全。
现代浏览器被划分为渲染内核和浏览器内核两个核心模块,其中渲染内核就是渲染进程,而浏览器内核由网络进程、浏览器主进程和 GPU 进程组成。
渲染进程和浏览器内核间通过 IPC 通信,如网络资源先通过浏览器内核下载,再通过 IPC 提交给渲染进程;渲染进程经过解析资源、绘制等操作,将最终生成的图片通过 IPC 提交给浏览器内核模块来渲染显示。
二、安全沙箱
渲染进程需要执行 DOM 解析、CSS 解析、网络图片解码等操作,若存在漏洞,黑客很容易利用渲染进程执行下载的恶意网络内容发起攻击。
因此,需要在渲染进程和操作系统之间建一道墙(安全沙箱)
1、什么是安全沙箱
现代浏览器的安全沙箱利用操作系统提供的安全技术,将渲染进程和操作系统隔离,渲染进程在执行过程中无法访问或修改操作系统中的数据,因此用户将无法获取渲染进程之外的任何操作权限。
渲染进程对系统资源的访问需要通过浏览器内核的 IPC 通信来实现。
安全沙箱最小的保护单位是进程,所以只有多进程的现代浏览器架构才能使用。
2、渲染进程数量和标签页的联系
若两个标签页位于同一浏览上下文组 (如页面 1 通过 a 标签或 JS 代码打开了页面 2),且属于同一站点 (不一定同源),则两个标签页会被分配到同一个渲染进程中,否则分配独立的渲染进程。
例外:若 a 标签中加入 rel=noopener 属性,通过链接打开的新标签页会新分配渲染进程,和源标签页不建立连接关系。
3、安全沙箱与操作系统的交互
由于渲染进程采用安全沙箱,所以在渲染进程内部不能与操作系统直接交互,于是在浏览器内核中实现了持久存储、网络访问和用户交互等与操作系统交互的功能,通过 IPC 与渲染进程交互。
2-1、持久存储
安全沙箱阻止了渲染进程的 Cookie、文件缓存等直接访问文件系统。
例如 Cookie,浏览器内核会维护一个存放所有 Cookie 的数据库,当渲染进程通过 JS 读取 Cookie 时会通过 IPC 通知浏览器内核,浏览器内核读取 Cookie 后再将内容通过 IPC 返回给渲染进程。
2-2、网络访问
安全沙箱阻止了渲染进程直接访问网络,在渲染进程内部也是不能直接访问网络的,如果要访问网络,则需要通过浏览器内核获取网络资源。
浏览器内核会对 URL 做额外权限检查,如同源策略、HTTPS 站点是否包含 HTTP 请求等。
2-3、用户交互
安全沙箱阻止了渲染进程直接访问用户输入,所有的键盘鼠标事件都由浏览器内核来接收,然后浏览器内核再通过 IPC 将这些事件发送给渲染进程。
三、站点隔离策略
最开始 Chrome 划分渲染进程是以标签页为单位,所以一个标签页中多个不同源的 iframe 也会被分配到同一个渲染进程中,很容易让黑客通过 iframe 攻击当前渲染进程。
Chrome 几年前开始重构代码,应用站点隔离策略。
站点隔离策略是指严格按照同一站点(根域名和协议相同,区别于同源)的策略分配渲染进程。
使用站点隔离后,不同站点的 iframe 分配到相互隔离的渲染进程中,即使渲染进程被攻击,也无法继续访问其他站点渲染进程的内容。
2019 年 10 月 20 日 Chrome 团队宣布安卓版 Chrome 已全面支持站点隔离。