Cross-Origin Read Blocking (CORB)
背景
有一天, 打开浏览器看到控制台报错:
Cross-Origin Read Blocking (CORB) 已屏蔽 MIME 类型为 text/html 的跨域响应 https://xx.xxxx.com/stat/record?it=0&lshowp=2560x1440&0.1996155506933639 如需了解详情,请参阅 https://www.chromestatus.com/feature/5629709824032768
于是乎, 就去了解一下什么是 CORB. 具体如下
什么是 CORB
Cross-Origin Read Blocking (CORB) 是一个新的 web 平台安全功能, 它能够帮助减少线程之间的旁路攻击(side-channel attacks)
;
CORB 的目的是防止浏览器向网页接收某些跨源网络响应,因为这些响应可能包含敏感信息,而且现有的网页功能不需要这些响应。
例如: 它将清除一个从<script>
或者 <img>
标签发起的跨源text/html
响应. 将响应的内容,用空值代替.
这是网站隔离(Site Isolation)
非常重要的一部分.
In Chrome M68 and later CORB is active by default - no special actions need to be taken to activate CORB
为什么要有 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 可以减少下面的攻击
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 是如何阻止响应的呢?
当 CORB 判断出需要对响应做出 CORB-protected
, 响应则会
- 响应体被替换为空值
- 响应头被移除
为了有效地对抗预测执行的旁路攻击,CORB 阻塞必须在响应到达承载跨源请求发起者的进程之前发生。
CORB 不会影响的内容
CORB 并不会影响下面的情况
- navigation requests或者请求的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" ...>
- Requests with the following request destination
- “image” requests like
<img>
tag, /favicon.ico, SVG‘s<image>
, CSS’ background-image, etc. - “audio”, “video” or “track”
- “font”
- “style”
- “image” requests like
什么样的内容会被 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
浏览器判断响应类型: 浏览器拥有Content_sniffing的功能, 会尝试判断响应类型, 并不依赖Content-Type
;
除非响应头指定 “X-Content-Type-Options: nosniff”, 此时浏览器会直接根据Content-Type
的格式进行处理;
例如:
一个 img 标签, 请求一个 html 的数据
- 响应体 Body: 是一个 HTML document
- Content-Type: text/html
- No X-Content-Type-Options header
此时, 浏览器尝试判断响应内容, 如果发现是 html 标签. 则触发 CORB-protected
更多具体的案例: determining-whether-a-response-is-corb_protected
一个 JSON 的小案例
攻击场景:
- 登录 victim 网站, 返回用户的 cookie
- 请求 victim 网站的数据
secret-info.json
- 点击 evil 网站
- evil 网站通过
JSON Vulnerability
来窃取信息; (JSON Vulnerability 只存在于特别老的浏览器)
<!-- evil 网站代码 -->
<script>
var secrets;
Array = function () {
secrets = this;
};
</script>
<!-- the request for that script file is being made by your browser with your credentials. -->
<script src="https://victim.com/demos/secret-info.json"></script>
<script>
var yourData = '';
var i = -1;
while (secrets[++i]) {
yourData += secrets[i] + ' ';
}
alert('I stole your data: ' + yourData);
</script>
如果返回的 json 数据是["Philha", "my-confession-to-crimes", 7423.42]
, 数据则有可能被窃取;
CORB 可以阻止此类事情的发生.
<script>
// 下面这行代码,在script中是报错的;
{"d": ["Philha", "my-confession-to-crimes", 7423.42]}
</script>
实例代码
https://anforowicz.github.io/xsdb-demo/index.html
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, 响应会被清空;
参考
- 30 分钟理解 CORB 是什么
- 掘金 Cross-Origin Read Blocking (CORB)
- Feature: Cross-Origin Read Blocking (CORB)
- corb-for-developers
- google developers site-isolation
- chromium-security/site-isolation
- anatomy-of-a-subtle-json-vulnerability
- jsonp 跨域资源引起 CORB
- More CORB-protected MIME types - adding protected types one-by-one