Cross-Origin Read Blocking (CORB)

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 并不会影响下面的情况

<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”

什么样的内容会被 CORB-protected

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

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

浏览器判断响应类型: 浏览器拥有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, 响应会被清空;

参考

上一篇:sklearn FKold K折交叉验证 k-fold cross validation


下一篇:留一法交叉验证 Leave-One-Out Cross Validation