Skip to content

烦人的CROB #14

@spruceatmc

Description

@spruceatmc

烦人的CROB

spruce 2022/07/16 人已麻

Cross-Origin Read Blocking

有一天, 打开浏览器看到控制台报错:

Cross-Origin Read Blocking (CORB) 已屏蔽 MIME 类型为 text/html 的跨域响应 https://xx.xxxx.com/a.js 如需了解详情,请参阅 https://www.chromestatus.com/feature/5629709824032768
于是乎, 就去了解一下什么是 CORB. 具体如下

什么是 CORB

Cross-Origin Read Blocking (CORB)是一个新的 web 平台安全功能, 它能够帮助减少线程之间的旁路攻击(side-channel attacks);

CORB 的目的是防止浏览器向网页接收某些跨源网络响应,因为这些响应可能包含敏感信息,而且现有的网页功能不需要这些响应。
例如: 它将清除一个从 script 或者 img 标签发起的跨源text/html响应. 将响应的内容,用空值代替.

这是网站隔离(Site Isolation)非常重要的一部分.

为什么要有 CORB

在同源策略(same-origin policy)下通常会阻止一个网站读取其它源的任意网络资源.

但是, 在实际情况中, 实施同源策略并非只是简单阻止所有的跨域资源.

浏览器对于有些情况是允许加载跨域资源的, 例如 img , script 标签, 它们可以加载跨域的资源

并且跨源资源共享(CORS)选择性地可以读取跨域的资源;

允许加载跨域资源, 意味着存在着安全隐患.

场景: 用户登录了 victim.com 之后, 又去访问了 evil.com 的恶意站点.

在 evil.com 中有 script src="victim.com/login" 的元素, 则浏览器会向 victim.com 发起请求, 且会把敏感信息返回给浏览器. 此时, 用户在 evil.com 页面所在的内存中就留有的 victim.com 的敏感数据;

CORB 会在敏感信息加载到页面内存之前,将其拦截掉,如此,敏感信息既不会暴露于浏览器,也不会进驻内存空间,得到了很好的保护。

CORB 可以减少下面的攻击

Cross-Site Script Inclusion (XSSI)

XSSI 是一种攻击方式. 它通过 script 指向一个不是 JavaScript 代码文件的目标资源, 并且让浏览器执行.

具体的情况, 可以看看 JSON_Hijacking_Gareth_Heyes

<script charset="ISO-8859-1" src="polyglot/uploads/xss.jpg"></script>

CORB 阻止了这一类攻击, 因为 CORB 将阻止 script 标签发起的这种请求;

通过 CPU 预测执行,而引起的旁路攻击 (例如 Spectre).

例如: 攻击者会使用 img标签来加载跨域的文件, 让 JavaScript 在执行过程中, 将进程中的信息暴露给攻击者

<img src="https://example.com/secret.json" />

CORB 通过阻止 JSON 的资源加载到进程的内存中, 可以阻止这一类攻击.

CORB 不会影响的内容

navigation requests或者请求的[request destination]

(https://fetch.spec.whatwg.org/#concept-request-destination) 是"document", “embed”, “frame”, “iframe”, 或者 “object”.

Download requests

<a href="/images/myw3schoolsimage.jpg" download></a>

XHR and fetch()

ping, navigator.sendBeacon()

<link rel="prefetch" ...>

下列地址的请求

“image” 请求图片, /favicon.ico, SVG图片, CSS背景图片, etc.

“audio”, “video” or “track”

“font”

“style”

什么样的内容会被 CORB-protected

当跨域请求回来的数据 MIME type 同跨域标签应有的 MIME 类型不匹配时,浏览器会启动 CORB 保护数据不被泄漏.

例如: script 标签请求的响应是 json. img 标签请求回来的是 json.

目前, 针对下面的响应类型会触发 CORB

JSON

HTML

XML

pdf 以及More CORB-protected MIME types - adding protected types one-by-one

JSONP 与 CORB

JSONP 算是一种讨巧的跨域请求方式. 具体的情况可以看看 说说 JSON 和 JSONP,也许你会豁然开朗,含 jQuery 用例, 这里不再赘述;

JSONP 和 CORB 有什么关系呢?

在某些情况下, JSONP 会触发 CORB
例如:

响应体 Body: 是 js 代码

Content-Type: text/html

X-Content-Type-Options: ‘nosniff’

通过 script 标签, 获取到 html 的内容(因为指定了 nosniff, 浏览器会直接认为响应内容是 text/html). 从而会触发 CORB, 响应会被清空;

怎样解决

首先,看到不会影响iframe我就去用了,结果发现没办法获取,因为不同域的不能使用contentDocument

所以,没办法解决,只有把CROB内容换成不是CROB内容!!! :(

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions