深入探索Fenix安全漏洞挖掘:私有浏览模式绕过与实战技巧

本文详细介绍了在Firefox安卓版Fenix中挖掘安全漏洞的方法,重点分析私有浏览模式绕过漏洞的三种实例,探讨GeckoView与Mozac组件间的安全边界问题,并提供实用的HTTP请求监控技术。

客座博文:寻找Fenix安全漏洞的良好初步步骤(第二部分)

作者:Muneaki Nishimura
日期:2021年2月9日

本博文是我们漏洞赏金计划系列客座文章之一,邀请参与者分享他们向我们报告的安全漏洞。继第一部分之后,本文介绍在Fenix中寻找安全漏洞的一些实践方法。

Fenix架构特点

Fenix的架构具有独特性。许多浏览器功能并非在Fenix自身实现——它们来自独立可复用的库,如GeckoView和Mozilla Android Components(简称Mozac)。Fenix作为浏览器应用程序将这些库组合为内部构建模块,而fenix项目本身主要是一个用户界面。Mozac特别值得注意,因为它将在GeckoView中渲染的网页内容连接到原生Android世界。

网页内容与原生应用连接的安全隐患

在网页内容与原生应用连接处存在常见的安全隐患,容易导致安全漏洞。本文将重点关注其中一种隐患:私有浏览模式绕过。在寻找这类漏洞时,我发现了三个独立但相似的问题(Bug 1657251、1658231和1663261)。

私有浏览模式的隐患

观察以下两行HTML代码:

1
2
<img src="test1.png">
<link rel="icon" type="image/png" href="test2.png">

虽然这两个HTML标签看起来相似,都从服务器获取并渲染PNG图像,但它们的内部处理方式截然不同。在前者<img>标签中,GeckoView从服务器获取图像并在HTML文档中渲染;而在后者<link rel="icon">标签中,它标识页面的网站图标(favicon),Mozac中的代码获取图像并将其作为Android视图的一部分进行渲染。

在2020年秋季我发现这些漏洞时,从<img>标签发送的HTTP请求在User-Agent头部显示"Firefox"字符串,而从<link rel="icon">发送的请求则显示"MozacFetch"。

私有浏览模式的隔离问题

与其他浏览器一样,GeckoView为普通模式和私有浏览模式提供了分离的上下文。因此私有浏览模式中的cookie和本地存储区域与普通模式完全分离,这些值不共享。然而,Mozac拥有的URL获取类(用Kotlin编写)只有一个单一的cookie存储。如果网站图标请求响应中包含Set-Cookie头部,它将被存储在该cookie存储中,随后在私有浏览模式下获取网站图标时会使用相同的cookie,反之亦然(Bug 1657251)。

类似漏洞的其他实例

这类漏洞不仅出现在网站图标功能中。Web通知API是另一个例子。Web通知是通过JavaScript显示操作系统级通知的功能。与网站图标类似,图标图像可以出现在通知对话框中——它存在一个以完全相同方式在私有浏览模式和普通模式之间共享cookie的漏洞(Bug 1658231)。

这些漏洞不仅发生在加载图标图像时。Bug 1663261指出,在通过<a download>下载链接文件时也会发生类似的绕过。文件下载也由Mozac的下载功能处理,这满足了导致类似缺陷的相同条件。

安全保护机制的一致性挑战

如您所见,Mozac的URL获取是造成与网页内容不一致的地方之一。除了私有浏览模式外,网络世界还有各种其他安全保护机制,如端口阻塞、HSTS、CSP、混合内容阻止等。当从另一个组件发出HTTP请求时,这些保护措施有时会被忽略。通过关注这些常见的隐患,您很可能能够在未来持续发现新的安全漏洞。

实用的漏洞挖掘技术

使用User-Agent差异来区分请求发起者是寻找这类漏洞的有用技术,但在当今的Fenix中已不再可用。如果您可以自己构建Fenix,仍然可以通过设置自定义请求头部来使用此技术,如下所示:

GeckoViewFetchClient.kt

1
2
3
4
5
6
7
8
9
private fun WebRequest.Builder.addHeadersFrom(request: Request): WebRequest.Builder {
  request.headers?.forEach { header ->
    addHeader(header.name, header.value)
  }

+ addHeader("X-REQUESTED-BY", "MozacFetch") // 添加
  
  return this
}

对于监控HTTP请求,远程调试非常有用。从MozacFetch发送的请求将输出到远程调试窗口中多进程工具箱进程的网络标签页。您可以通过过滤字符串"MozacFetch"来查找来自Mozac的请求。

祝您漏洞挖掘顺利!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计