今天继续来聊浏览器的安全策略。
最近,Chrome 116
版本为 COOP
增加了一个新的属性 restrict-properties
。
COOP
(Cross Origin Opener Policy
:跨源程序打开策略)是我们之前在文章中多次提到的一个浏览器安全策略,它可以帮助我们的网站创建一个安全的隔离环境,从而避免一些 Web
安全风险。
COOP
其实主要可以防止两类攻击,第一类是跨站点数据泄漏(又名 XS-Leaks
),还有一类就是臭名昭著的 Spectre
(幽灵漏洞)。
这次新增的 restrict-properties
属性,其实是为它提供了一种更丝滑的配置方式,我们分别从两种风险的角度来看看:
XS-Leaks
攻击XS-Leaks
攻击是一种利用浏览器在不同源之间共享信息的安全漏洞,攻击者可以通过利用这些共享的机制来获取用户敏感数据的攻击方式。比如可以错误处理、资源加载、计时等机制来推断出用户的隐私信息。
比如 window.opener
属性就是一种常用的利用目标,攻击者可以通过利用 window.opener
属性来获取敏感信息。
攻击者创建一个恶意网站(Site A
),并在其中包含以下代码:
// 在Site A中打开一个新窗口
var newWindow = window.open('https://target-site.com', '_blank');
// 监听新窗口加载完成事件
newWindow.addEventListener('load', function() {
// 获取新窗口的window对象
var targetWindow = newWindow.window;
// 通过window.opener获取源页面的window对象
var sourceWindow = targetWindow.opener;
// 获取源页面的敏感信息
var sensitiveData = sourceWindow.document.getElementById('sensitive-data').innerText;
// 将敏感信息发送到攻击者的服务器
// ...
});
攻击者诱使用户访问恶意网站(Site A
)。在用户访问时,Site A
会打开一个新的窗口或标签页,并加载目标网站(target-site.com
)。当目标网站加载完成后,攻击者的恶意代码会通过 window.opener
属性获取源页面(用户当前所在的页面)的 window
对象。然后,攻击者可以通过源页面的 window
对象访问并获取敏感信息。
为了减轻这种风险,我们就可以配置 Cross-Origin-Opener-Policy(COOP)
标头,在以前它有三个属性:
same-origin
:COOP
的默认值,只有同源页面可以通过 Window.opener 属性访问彼此的信息,不同源的页面之间的信息共享被禁止。same-origin-allow-popups
:更加宽松,还允许同源页面与其通过 window.open()
打开的弹出窗口之间共享信息。unsafe-none
:完全禁用了 COOP
策略,所有页面都可以共享信息,不推荐。前两个属性都有点太严格了,如果实施了,我们想要和一些弹出窗口做一些交互会变得非常困难,比如单点登录、三方支付等页面,这也造成了 COOP
的实施困难。
而新增的 restrict-properties
属性,可以在禁用 Opener 信息共享的情况下,允许通过 postMessage
或者 closed
进行通信。这实际上是提供了一种可信的信息共享方式,同时禁用了有风险的方式。
主要就是为了避免通过一些浏览器的高敏 Web API
(SharedArrayBuffer、Performance.measureUserAgentSpecificMemory()
) 造成的 Spectre
攻击风险,在启用了跨域隔离环境的情况下,这些 API 会被允许使用,而且能够和其他源的网站进行隔离。
在以前,我们必须要设置 Cross-Origin-Opener-Policy: same-origin
,会破坏和一些弹出框的交互能力,还是比较困难的。
现在我们可以通过 Cross-Origin-Opener-Policy: restrict-properties
来替代 Cross-Origin-Opener-Policy: same-origin
启用跨域隔离,也就是下面两个组合:
Cross-Origin-Opener-Policy: restrict-properties
Cross-Origin-Embedder-Policy: require-corp
或者
Cross-Origin-Opener-Policy: restrict-properties
Cross-Origin-Embedder-Policy: credentialless
这其实也算降低了跨域隔离的开启条件~