首页 » 漏洞 » Mac OS X Safari 8.0.5 UXSS: 浏览器漏洞利用冒险记(二)

Mac OS X Safari 8.0.5 UXSS: 浏览器漏洞利用冒险记(二)

 

分享到:

Mac OS X Safari 8.0.5 UXSS: 浏览器漏洞利用冒险记(二)

(小编没有找到Mac OS X Safari 8.0.5的配图 假装一下这个是8.0.5 我读书多不会骗你们的)

这篇Post是我早先在Mac OS X Safari 8.0.5发现的UXSS的漏洞说明,它在之前的允许恶意网站下任意域运行JavaScript更早被发现。UXSS漏洞是同源策略崩溃——这是保证数据在浏览器中安全的基本安全策略。UXSS漏洞出现的非常多,它对于知道漏洞范围来说是一件好事,因为它可以让你知道Safari浏览器的工作信任边界。

这个漏洞

首先,我来看一下这个漏洞。这一切都源于一个错误页面——Safari的本地错误和警报页面实际上都是文件URL: 你可以通过使用浏览器查看这些:http://localhost:12345,拉起调试器控制台,并运行:

> window.location.href
< "file:///Applications/Safari.app/Contents/Resources/"

因此,错误页面是通过一个文件URL管理的。这点很常见(AOSP浏览器就这样),并且这种方式浏览器中报错。然而,它允许任意网站在file://中获得窗口引用。即使你不能得到本地Safari错误页面在嵌入式的iframe中显示出来,但是你可以弹出新窗口(诱使用户点击页面上的任何地方):

window.onclick = function() {
  var fileWin = window.open('http://localhost:12345', '_blank');
}

可变的fileWin现在引用包含属于file://URL的上下文。这当然不是问题,因为同源策略应给组织我们进入或者阻止脚本注入到跨域窗口。这是实际漏洞发生的地方。浏览器允许在跨域窗口中跨域访问到一组有线属性,包括位置、post消息和历史。例如:

> console.log(fileWin.history)
< [Object object]
> fileWin.history.replaceState({},{},'/');
SecurityError

所以,尽管我们访问历史纪录对象,我们不能访问pushState或者replaceState对象的属性。如果我们尝试在跨域历史对象上调用属于当前历史对象的replaceState函数呢?

history.replaceState.call(fileWin.history, {}, {}, 'file:///');

什么都没发生。这是因为只有这个状态改变了——一个新的页面没有被请求。让我们尝试重载页面:

history.replaceState.call(fileWin.history, {}, {}, 'file:///');
fileWin.location.reload();

Safari浏览器以外崩溃。

好吧…在深入了解之后,发现Safari在一个文件到file://URL周围有一些其他的安全性措施。基本上,浏览器保存 file://URL的白名单,它知道用户明确浏览并允许浏览这些URL。如果所需的URL不在列表中,或者不再列表的字母哭中,浏览器就会崩溃。这真是很棒的消息!它应该阻止武装了这个我继续深入挖掘的漏洞的攻击者。

绕过URL白名单

除了白名单的一个例外外——浏览器历史纪录页面被导航后退被允许在file://URL中。这是为了适应Safari退出和重启之后的重载窗口——这些窗口也回恢复了历史状态,因此可能需要导航”back”到file://URL,即用户在退出前访问的页面。

因此,绕过的整个过程:

history.replaceState.call(fileWin.history, {}, {}, 'file:///');
fileWin.location = 'about:blank';
fileWin.history.back();

这应该弹出打开Finder窗口指向/。因为跟file://路径现存于历史,一个攻击者可以浏览这个窗口到任意有效的文件URL。

Safari 中 file://URL权限

HTML文件服务file://URL,它有自己的一套权限:他们可以读取任意filesystem中的文件内容,他们可以注入到JavaScript的任意域(UXSS)。然而,有一个重要限制:如果HTML文件file有用Apple的检疫属性(下载文件中自动设置和安全文件系统),然后在沙箱中运行没有特殊权限。

我花了一些时间想办法使用普通file://权限来drop文件。结果是不管隔离属性的存在,.webarchive文件仍然有通常不可思议的一些权限。通过安装含有恶意.webarchive的匿名FTP驱动,攻击者就可以浏览用户浏览器的这些特权文件了。

现在,攻击者可以读取文件系统上的任意文件,并可以把脚本注入到得到任意域,从哪里开始呢?安装Safari浏览器的扩展是非常有用的——这将在每次用户和浏览器交互时给攻击者留下一个永久的hook。Safari用户可以从https://extensions.apple.com直接安装扩展,所以我调查什么API可能看起来像它,结果非常简单:

safari.installExtension("https://data.getadblock.com/safari/AdBlock.safariextz", "com.betafish.adblockforsafari-UAMUU4S2D9");

上面这行,在运行extensions.apple.com时,会静默安装AdBlock Safari扩展。使用相同的方式,攻击者可以在一个窗口中加载extensions.app.com,然后滥用恶意文件.webarchive权限进行脚本注入这个安装他们选择的扩展的窗口。

泄露

该漏洞被分配CVE-2015-1155,于2015年5月在Safari 8.0.5, 7.1.5, 和 6.2.5.中被修复。苹果信息纰漏可以在这里找到:https://support.apple.com/en-us/HT204826。

此外,我已经提交了这个漏洞的Metasploit模块,可以在这里找到:https://support.apple.com/en-us/HT204826。这个模块可以演示获取cookie数据库和ssh密钥,以及静默安装扩展。

本文由 360安全播报 翻译,转载请注明“转自360安全播报”,并附上链接。
原文链接:http://joevennix.com/2015/06/24/Adventures-in-Browser-Exploitation-Part-II--Safari-8-UXSS.html

原文链接:Mac OS X Safari 8.0.5 UXSS: 浏览器漏洞利用冒险记(二),转载请注明来源!

0