聚焦源代码安全,网罗国内外最新资讯!
编译:奇安信代码卫士团队
安全研究员 Barak Tawily 说明了如何发现了这个 0day。如下是博客正文:
最近我在研究同源策略攻击时,发现火狐浏览器当前版本67易受本地文件盗取攻击(在任意 OS 上均如此),原因是文件模式 URI 的同源策略实现不当。先来看下 PoC,之后再来解释为何该漏洞还未被修复。
攻击场景

1、攻击者向受害者发送带附件的邮件/受害者浏览恶意网站并下载文件
2、受害者打开恶意 HTML 文件
3、文件在一个 iframe 中加载包含的文件夹(因此我的文件路径是 file:///home/user/-malicious.html,而 iframe 的来源是file:///home/user/)
4、受害者认为自己点击的是恶意 HTML 上的一个按钮,但实际上点击的是 iframe 目录列表中的恶意文件html(使用 ClickJacking 技术,目的是利用“文本转换 bug”,访问包含文件夹的目录列表)。
5、恶意 iframe 现在提升了权限,能够读取包含恶意文件的文件夹中的任意文件(在多数情况下下载文件夹,在本案例中是file:///home/user/)
6、恶意文件能够读取包含文件夹中的任意文件 (file:///home/user/),如通过提取URL file:///home/user/.ssh/ida_rsa的SSH 密钥,并通过含有文件内容的恶意网站的超过1个提取请求窃取任意文件。
7、攻击者利用这个漏洞获得文件夹中包含恶意文件在内的所有文件。
详情

我认为核心问题始于 IETF在 RFC 发布的 web 源概念,它并未说明文件图式 URI 同源策略的良好实现。它在第10页写道,“如果 uri-scheme 是’file’,那么实现可能返回实现定义的值。注意:从历史上看,用户代理已给予文件图式中内容大量权限。然而,给予所有本地文件如此多的权限可导致权限提升攻击。某些用户代理已成功获得给予本地文件目录的权限,但这种方式并未广泛接受。其它用户代理为每个文件 URI使用全局唯一标识符,而这是最安全的选择。”
因此,RFC 指出“实现可能返回由实现定义的值”,按我的理解它实际上是说,“你可以随心所欲”,而我认为它是不合理的。另外也出现了一些相关方式:
给予本地文件大量权限——这样做是不安全的(目前所有浏览器均未实现)
给予本地文件目录的权限——这样做是不安全的,不过要比上一条安全(目前只有火狐浏览器这么做了)
给予”local files” 文件的权限——这样做是安全的(目前 Chromium 和 Edge 实现)
我们都知道第一种选择是不安全的,但第二种选择也有问题但火狐的确这么做了,而这也是我能够设法执行文章开头提到的攻击的确切原因。
向量 |
火狐 |
Chromium |
Safari |
Edge |
给予目录的同源策略 |
√ |
× |
× |
×× |
禁止提取文件图式 |
× |
√ |
√ |
√√ |
除了只有火狐浏览器支持基于目录的同源策略实现外,所有的现代浏览器禁止提取文件图式请求,而火狐也接受这一点。

从安全角度看,我认为应当在 RFC 端解决,应该强制用户代理(浏览器)实现最安全的方式,且禁止开发人员犯这种错误,避免客户端易受此类攻击。
尽管 RFC 指出,文件图式 URI 的同源策略实现可能是不安全的,但火狐浏览器采用了不安全的方式。而Mozilla 安全工程师 Frederik Braun 表示,“我们的同源策略实现允许所有 file:// URL 获取对相同文件夹和子文件夹中文件的访问权限。”也就是说火狐并无修复计划。
值得注意的是,火狐浏览器只是说明了基于目录的同源策略实现以及文件可读取目录中文件的事实,但并未说明能够读取同样目录中所有文件这一事实的任何信息,导致攻击更为严重。
我曾好奇火狐浏览器是何时忽视用户抱怨并实现这一不安全的方式的,似乎一直如此。结果发现17年之前就已经存在关于几乎一模一样的漏洞的报告(除了目录列表上下文转换 bug)。
所以,火狐似乎是知道这个 bug 存在的,我认为这是一个需要尽快解决的重大安全问题,而 RFC 也不应该如此放任不管。我认为在 file:URI 图式中打开的恶意文件不应该仅通过一次点击就窃取所有文件列表或者无需点击就窃取某个特定的文件路径。希望本文能引发人们对漏洞的关注,火狐能够理解它存在的危险并尽快解决。
PoC 地址:https://youtu.be/XU223hfXUVY
原文链接
https://quitten.github.io/Firefox/
题图:Pixabay License
本文由奇安信代码卫士编译,不代表奇安信观点,转载请注明“转自奇安信代码卫士 www.codesafe.cn”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。

