在阅读 Gareth 的博客文章之前几周,白帽小哥花了一些时间尝试了解 Chrome 中的“新”导航 API(现阶段,导航 API 仅在 Chromium 浏览器中实现)。本文不会详细介绍 API 的具体用法(有兴趣可以参阅 MDN)。简单来说,导航 API 旨在解决‘旧’的历史记录 API 存在的一些已知问题。这两个 API 之间的一个显著区别是它们如何处理从 iframe 或跨站点请求发起的导航。导航 API 删除了有时难以遵循的历史逻辑,而只考虑在单个框架内启动的导航。 该界面还有一些有趣的功能,对安全研究人员来说可能值得深入研究。 首先,导航 API 允许应用程序拦截导航事件,在阅读 API 时,白帽小哥的目标是找到导航 API 本身允许打破同源策略(SOP)的某种方法。假设如前所述拦截请求功能可以让我们做一些‘邪恶’的事,API 只影响从特定框架内部发起的导航,并且没有发现当前实现有任何问题。导航 API 中在安全性方面最著名的部分就是navigation.navigate() 方法。该方法允许一种新的载体,可以利用 JavaScript URL 模式。它可以用 navigation.navigate("javascript:PAYLOAD") 替换 location = "javascript:PAYLOAD" ,尽管这本身不是 API 实现中的漏洞,而是浏览器导航的一个功能,但在处理跨站脚本过滤器绕过时需要牢记这一点。同一 API 的另一个较少被提及的功能是 navigation.entries() 方法。此方法允许开发人员访问当前窗口会话的历史条目列表。文档中指出:
The entries() method of the Navigation interface returns an array of NavigationHistoryEntry objects representing all existing history entries. 导航接口的entries()方法返回表示所有现有历史记录条目的NavigationHistoryEntry对象的数组。https://developer.mozilla.org/en-US/docs/Web/API/Navigation/entries
对于 NavigationHistoryEntry 文档中指出:
The Navigation API only exposes history entries created in the current browsing context that have the same origin as the current page 导航 API 仅公开在当前浏览上下文中创建的与当前页面具有相同来源的历史记录条目 https://developer.mozilla.org/en-US/docs/Web/API/NavigationHistoryEntry
NavigationApi usuaslly gets entries() from the browser process for a cross-document navigation, but when navigating to about:blank, we copy from the previous NavigationApi object (because the browser process isn’t involved in about:blank navigations). NavigationApi通常从浏览器进程获取entries()来进行跨文档导航,但是当导航到about:blank时,我们从之前的NavigationApi对象复制(因为浏览器进程不参与about:blank导航)。I didn’t consider the cross-origin -> about:blank case in implementing that copy logic. 在实现该复制逻辑时,我没有考虑跨源 -> about:blank 情况。
As creis@ noted, site isolation defends against the worst variants of this leak (only cross-origin-but-same-site will leak with site isolation enabled; without it, cross-site will leak, too). 正如 creis@ 所指出的,站点隔离可以防御这种泄漏的最严重变体(启用站点隔离后,只有跨源但同一站点才会泄漏;如果没有启用站点隔离,跨站点也会泄漏)。That’s because the cross-site case swaps processes when navigating to about:blank with site isolation enabled, and that allows us to use the correct logic in the browser process. 这是因为跨站点情况在启用站点隔离的情况下导航到 about:blank 时会交换进程,这使我们能够在浏览器进程中使用正确的逻辑。这一注意事项(仅影响同一站点域)确实降低了这一发现的影响,但它仍然具有原始 baseURI 泄漏中不存在的特征。
评论