Chrome 站点隔离

2,165 阅读2分钟

什么是站点隔离?

Chrome 自版本67起默认开启了站点隔离。站点隔离是一项安全特性,它确保来自不同站点的页面处于不同的进程中,每个进程运行在沙箱中。这里站点的定义仅包括 schema 和 注册的域名,比如 https://google.co.uk 和 https://maps.google.co.uk 属于同个站点。它同时还阻止进程从其它站点接收特定类型的敏感数据。

站点隔离使不受信任/恶意网站更难读取或窃取网站数据,因此提供了额外的安全保护。

CORB (Cross-Origin Read Blocking)

即使不同站点的页面被放进不同的进程,依然可以合理地请求跨站资源,比如使用 img、script 标签。

恶意网站可能使用 <img> 元素加载包含敏感数据的 json 文件:

<img src="https://your-bank.example/balance.json">

如果没有站点隔离,json 文件会被保存在渲染进程的内存中,即使渲染进程不会渲染图像。这样,攻击者随后就可能利用 Spectre 之类的漏洞读取该内存块。

攻击者还可以使用 <script> 元素将敏感数据提交到内存:

<script src="https://your-bank.example/balance.json"></script>

CORB 是一项新的安全特性,它可以根据 MIME 类型,防止 balance.json 文件的内容进入渲染进程的内存中。

CORB 是如何工作的?

网站可能从服务器请求2种类型的资源:

  1. 数据资源,如 HTML、XML、JSON 文件
  2. 媒体资源,如 images、JavaScript、CSS、fonts
网站可以从同源站点或带有许可的 CORS 头(如Access-Control-Allow-Origin: *)的非同源站点接收数据资源,但是媒体资源可以来自任何其它站点,即使没有 CORS 头。

满足以下条件的响应(即响应是 HTML/XML/JSON),将受到 CORB 保护:

被 CORB 策略阻止的响应将被修改:

  • 响应主体被替换为空
  • 响应头被移除

这样,渲染进程接收到的数据为空,恶意站点就很难将跨站数据拉入进程进行窃取。

参考内容