Chrome 67 以后浏览器会默认启用名为 Site Isolation 的安全功能于避免之前的 Meltdown 和 Spectre 等旁路攻击
CPU 预执行
从所周知的,CPU 的速度比内存的读写快非常多,所以为了提高 CPU 的利用率人们想到 预执行 这个方案。比如下面这段代码,
if (a > 10) {
a += 100;
}
正常的流程是先执行 if 的条件判断,如果成功再执行加法运算。而预执行的流程则是直接先把加运算执行,如果判断成功就保留结果,不成功则抛弃这个结果。
而这时我们把 if 代码块改为一个数组的访问,
const arr = [1, 2, 3];
if (a > 10) {
x = arr[100];
}
通常我们访问的索引超出了这个数组的长度,程序检查后就会返回 undefined。但是预执行是 CPU 的行为,所以这里就会跳过程序的检测,直接读到内存中其他块的内容。于是就造成了敏感信息泄露的风险。
进程模型
Chrome 之前的进程模型叫做 process-per-site-instance (一个 Tab 一个进程),现在引入了一个新的模型 site-per-process (一个站点一个进程)。
这两个看起来似乎差不多,因为通常一个 Tab 只会有一个站点的内容,但是我们可以通过 iframe 去引用非本站的页面,这样就能将非本站的内容读入到当前的进程中。
Cross-Origin Read Blocking (CORB)
在通进程模型限制让不同站点的页面在不同进程以后,我们仍然可以通过其他手段去读取其他页面的内容。例如黑客在扫描内网服务时,通常会使用 img / link / video 等等标签去尝试加在内网页面以探测内网启用的服务。
<link ref="stylesheet" href="http://192.168.0.1" ></link>
这时这部分资源浏览器在尝试解析的时候,发现格式不正确解析失败,但是这些内容仍然会驻留在当前进程中,就可以通过上提到的旁路攻击去尝试读那部分内存。
但是我们不能限制非同源的静态资源,或者将这些静态资源也分割到不同进程中去,因为如果这些资源是正确的,是应该允许加载并且显示在页面上的。
所以浏览器对于静态资源又增加了一个 MIME 类型的检查。例如上面的 link 标签,我们在 ref 里申明了请求是一个 css 文件,但是浏览器在收到服务器响应的 Content-Type 是 text/html,这时浏览器就会直接将响的内容丢弃。