再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸

2023-10-08 00:40

本文主要是介绍再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

作者:蒸米

-----------------

0x00 序

Ian Beer@google发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@keenlab也发表了关于Triple_Fetch的分析[2],但由于这个漏洞和exp有非常多的亮点,所以还剩很多可以深入挖掘的细节。因此,我们简单分析一下漏洞形成的原因,并具体介绍一下漏洞利用的细节,以及如何利用这个漏洞做到iOS 10.3.2上的沙盒逃逸。

 

0x01 CVE-2017-7047 Triple_Fetch漏洞形成的原因

因为chenliang对漏洞成因的分析非常详细,这里我就简单描述一下,因为使用XPC服务传输大块内存的话很影响效率,苹果为了减少传输时间,对大于0x4000的OS_xpc_data数据会通过mach_vm_map的方式映射这块内存,然后将这块数据的send right以port的方式发送到另一方。但这段内存的共享是基于共享物理页的方式,也就是说发送方和接收方会共享同一块内存,因此我们将数据发送以后再在发送端对数据进行修改,接收方的数据也会发生变化。

因此通过race condition,可以让接收端得到不同的数据(接收端认为是相同的数据),如果接收端没有考虑到这一点的话就可能会出现漏洞。比如我们刚开始让接收端获取的字符串是@”ABCD”(包括@和”),那么接收端会为这个字符串分配7个字节的空间。随后在进行字符串拷贝的时候,我们将字符串变为@"ABCDOVERFLOW_OVERFLOW_OVERFLOW",接收端会一直拷贝到遇到”符号为止,这样就造成了溢出。

Triple_Fetch攻击所选择的函数是CoreFoundation里的___NSMS1()函数,这个函数会对我们构造的恶意字符串进行多次读取操作,如果在读取的间隙快速对字符串进行三次修改,就会让函数读取到不同的字符串,让函数产生判断失误,从而造成溢出并让我们控制pc,这也是为什么把这个漏洞称为Triple_Fetch的原因。下图就是攻击所使用的三组不同的字符串:

攻击所选择的NSXPC服务是“com.apple.CoreAuthentication.daemon”。对应的二进制文件是/System/Library/Frameworks/LocalAuthentication.framework/Support/coreauthd。原因是这个进程是root权限并且可以调用processor_set_tasks() API从而获取系统其他进程的send right[3]。下图是控制了pc后的crash report:

 

0x02 Triple_FetchJOP &ROP&任意代码执行

利用漏洞Triple_Fetch虽然可以控制pc,但是还不能控制栈,所以需要先做stack_pivot,好消息是x0寄存器指向的xpc_uuid对象是我们可以控制的:

因此我们可以利用JOP跳转到_longjmp函数作为来进行stack pivot,从而控制stack:

最终发送的用来做JOP的格式伪造的xpc_uuid对象如下:

控制了stack就可以很容易的写rop了。但是beer目标不仅仅是执行rop,它还希望获取目标进程的task port并且执行任意二进制文件,因此除了exp,攻击端还用mach msg发送了0x1000个带有send right的port到目标进程中:

这些port的mach msg在内存中的位置和内容如下(msgh_id都为0x12344321):

随后,exp采用rop的方法对这些port进行遍历并且发送回发送端:

随后,攻击端会接收mach msg,如果获取到的msgh_id为0x12344321的消息,说明我们成果得到了目标进程的task port:

得到了task_port后,sploit()函数就结束了,开始进入do_post_exploit()。do_post_exploit()也做了非常多的事情,首先是利用coreauthd的task port以及processor_set_tasks()获取所有进程的task port。这是怎么做到的呢?

利用coreauthd的task port我们可以利用mach_vm_* API任意的修改coreauthd的内存以及寄存器,所以我们需要先开辟一段内存作为stack,然后将sp指向这段内存,再将pc指向我们想要执行的函数地址就可以让目标进程执行任意的函数了,具体实现在call_remote()中:

随后我们控制coreauthd依次执行task_get_special_port(), processor_set_default(), host_processor_set_priv(),processor_set_tasks()等函数,来获得所有进程的task port并返回给攻击端(具体实现在get_task_ports())中。接着,攻击端会遍历这个列表并筛选出amfid,launchd,installd,springboard这四个进程的task port。然后利用之前patch amfid的技巧,对amfid打补丁。最后再启动debugserver。

其实这个exp不但可以执行debugserver,还可以用来在沙盒外执行任意的二进制文件。只要把pocs文件夹下的hello_world二进制文件替换成你自己的想要执行的二进制文件,编译安装后,点击ui中的exec bundle binary即可:

具体怎么做到的呢?秘密在spawn_bundle_binary()函数中,先在目标进程中调用chmod将bin改为0777,然后通过一系列的posix_spawn API(类似fork())在目标进程中执行该bin文件。

沙盒外的代码执行提供了更多可以攻击内核的接口。并且可以读取甚至修改其他应用或者系统上的文件。比如,漏洞可以读取一些个人隐私数据(比如,短信,聊天记录和照片等)并发送到黑客的服务器上:

所以建议大家早日更新iOS系统到最新版本。

 

0x03 总结

本文介绍了beer发现的通用NSXPC漏洞。另外,还分析了iOS用户态上,用JOP做stack pivot以及利用ROP做到任意代码执行的攻击技术。当然,这些漏洞只是做到了沙盒外的代码执行,想要控制内核还需要一个或两个XNU或者IOKit的漏洞才行,并且苹果已经修复了yalu102越狱用的kpp绕过方法,因此,即使有了Triple_Fetch漏洞,离完成全部越狱还有很大一段距离。

 

0x04 参考文献

1、https://bugs.chromium.org/p/project-zero/issues/detail?id=1247

2、http://keenlab.tencent.com/zh/2017/08/02/CVE-2017-7047-Triple-Fetch-bug-and-vulnerability-analysis/

3、http://newosxbook.com/articles/PST2.html

 

英文版链接:https://jaq.alibaba.com/community/art/show?articleid=1020

------------------

* 作者:蒸米,更多安全知识分享和热点信息,请关注阿里聚安全的官方博客

 

转载于:https://my.oschina.net/AliMobileSecurity/blog/1506886

这篇关于再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/161543

相关文章

iOS HTTPS证书不受信任解决办法

之前开发App的时候服务端使用的是自签名的证书,导致iOS开发过程中调用HTTPS接口时,证书不被信任 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAu

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

iOS Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:]

iOS Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:]  2015-04-24 11:40  956人阅读  评论(0)  收藏  举报   分类:   iOS 基础篇(208)  版权声明:本文为博主原创文章,未经博主允许不得转载。 Assertion

iOS:编译时出现no such file or directory:xxx以及use twice...filenames are used to distinguish private dec

简    注册  登录   添加关注 作者  婉卿容若 2016.04.29 11:22 写了21870字,被16人关注,获得了14个喜欢 iOS:编译时出现"no such file or directory:xxx"以及"use twice...filenames are used to distinguish private

iOS 到处 ipa包的时候 会有四个选项分别代表什么

如图 在 iOS 到处 ipa包的时候 会有四个选项  1.Save for iOS App Store Deployment 保存到本地 准备上传App Store 或者在越狱的iOS设备上使用 2.Save for Ad Hoc Deployment 保存到本地 准备在账号添加的可使用设备上使用(具体为在开发者账户下添加可用设备的udid),该app包是发布证书编

iOS 7适配上存在的各种问题

谈谈项目中遇到的各种iOS7适配问题 由于我的项目要适配到iOS7.1, 而现在已经是9时代了,在实际工作中我也是遇到了各种奇葩的坑,所以我想尽快把遇到的iOS7适配问题和解决方案分享出来,以后这些东西可能就用处不大了。   1.字体问题 iOS7中的字体适配恐怕是最麻烦的坑了,原因是iOS7以上的许多字体在7都是不存在的,甚至包括一些system-字体。比如system-

git fetch.git merge,git pull

git fetch origin branch1:branch2 首先执行上面的fetch操作 使用远程branch1分支在本地创建branch2(但不会切换到该分支),  如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,  如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作. Git pus

潜艇伟伟迷杂交版植物大战僵尸2024最新免费安卓+ios苹果+iPad分享

嗨,亲爱的游戏迷们!今天我要给你们种草一个超有趣的游戏——植物大战僵尸杂交版。这款游戏不仅继承了原有经典游戏的核心玩法,还加入了许多创新元素,让玩家能够体验到前所未有的乐趣。快来跟随我一起探索这个神奇的世界吧! 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🔥 创新与经典的完美结合 植物大战僵尸杂交版在保持了原游戏经典玩

libssh-cve_2018_10933-vulfocus

1.原理 ibssh是一个用于访问SSH服务的C语言开发包,它能够执行远程命令、文件传输,同时为远程的程序提供安全的传输通道。server-side state machine是其中的一个服务器端状态机。   在libssh的服务器端状态机中发现了一个逻辑漏洞。攻击者可以MSG_USERAUTH_SUCCESS在身份验证成功之前发送消息。这样可以绕过身份验证并访问目标SSH服务器。 本来是靶机要

浏览器在iOS或Android中的一些方法

判断当前应用 var deviceType="H5"if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {deviceType='ios'} else if (/(Android)/i.test(navigator.userAgent)) {// alert("Android");deviceType='android'} else