什么是站点隔离?
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种类型的资源:
- 数据资源,如 HTML、XML、JSON 文件
- 媒体资源,如 images、JavaScript、CSS、fonts
Access-Control-Allow-Origin: *)的非同源站点接收数据资源,但是媒体资源可以来自任何其它站点,即使没有 CORS 头。满足以下条件的响应(即响应是 HTML/XML/JSON),将受到 CORB 保护:
- 响应带有
X-Content-Type-Options: nosniff头,且 Content-Type 是以下之一: - HTML MIME type
- XML MIME type (除了 image/svg+xml)
- JSON MIME type
- text/plain
- 响应状态码是206,且 Content-Type 是以下之一:
- HTML MIME type
- XML MIME type (除了 image/svg+xml)
- JSON MIME type
- 否则,CORB 尝试嗅探响应主体
- HTML MIME type 嗅探为 HTML
- XML MIME type (除了 image/svg+xml) 嗅探为 XML
- JSON MIME type 嗅探为 JSON
- text/plain 嗅探为 HTML/XML/JSON
- 任何以 JSON 安全前缀开头的响应(除了text/css)
被 CORB 策略阻止的响应将被修改:
- 响应主体被替换为空
- 响应头被移除
这样,渲染进程接收到的数据为空,恶意站点就很难将跨站数据拉入进程进行窃取。