作者:蒸米

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

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

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

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

再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸的更多相关文章

  1. iOS开发之获取沙盒路径

    iOS开发之沙盒机制(SandBox)具体解说了沙盒的一些机制.在开发中,我们须要对沙盒进行操作.所以我们须要获取到沙盒路径. 沙盒里的目录包含Documents.Library.tmp.这三个目录的 ...

  2. iOS开发之应用沙盒

    1.应用沙盒概述 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应用必须待在自己的沙盒里,其他应用不能访问该沙盒. 应用沙盒的文件系统目录,如下图所示(假设应用的名 ...

  3. iOS存储数据字典到沙盒

    1.创建一个账号数据模型 用来存放从服务器返回的数据,一般返回的是一个字典,里面包含了这个登陆用户的各种信息,这个数据模型就是用来存放这些东西的 创建一个数据模型  YYCAccount 继承 NSO ...

  4. iOS 文件操作:沙盒(SandBox)、文件操作(FileManager)、程序包(NSBundle)

    版权声明:本文为博主原创文章,转载请声明出处:http://blog.csdn.net/jinnchang 1.沙盒机制介绍 iOS 中的沙盒机制(SandBox)是一种安全体系.每个 iOS 应用程 ...

  5. APNS IOS 消息推送沙盒模式和发布模式

    在做.NET向IOS设备的App进行消息推送时候,采用的是PushSharp开源类库进行消息的推送,而在开发过程中,采用的是测试版本的app,使用的是测试的p12证书采用的是ApnsConfigura ...

  6. Swift iOS 文件操作:沙盒(SandBox)、程序包(NSBundle)

    1.沙盒机制介绍 iOS 中的沙盒机制(SandBox)是一种安全体系.每个 iOS 应用程序都有一个单独的文件系统(存储空间),而且只能在对应的文件系统中进行操作,此区域被称为沙盒.所有的非代码文件 ...

  7. 【精】iOS 文件操作:沙盒(SandBox)、文件操作(FileManager)、程序包(NSBundle)

    1.沙盒机制介绍 iOS 中的沙盒机制(SandBox)是一种安全体系. 每一个 iOS 应用程序都有一个单独的文件系统(存储空间).并且仅仅能在相应的文件系统中进行操作,此区域被称为沙盒. 全部的非 ...

  8. iOS模拟器的应用沙盒在MAC中的位置

    每个iOS应用都有自己专属的应用沙盒.分别为 应用程序包 Documents/ Library/Caches/ Library/Preferences/ tmp/ 当运行模拟时,在MAC下找到对应路径 ...

  9. iOS篇之有沙盒缓存

    内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时 ...

随机推荐

  1. django-xadmin中APScheduler的启动初始化

    环境: python3.5.x + django1.9.x +  xadmin-for-python3 APScheduler做为一个轻量级和使用量很多的后台任务计划(scheduler)包,可以方便 ...

  2. 【Android Developers Training】 24. 保存键值对

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. jq-toggle

    jq-toggle: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  4. 把本地git仓库中的项目引入到码云上

    一.安装git软件和TortoiseGit客户端(git需配置环境变量,但安装时已经配置好,无需考虑) 二.生成公钥和私钥(建立与码云的连接) 三.在码云上新建项目(建议在组织的基础上)   四.在码 ...

  5. 《javascript高级程序设计》笔记七

    第五章 引用类型(三) 今天首先说的就是Function类型.下面就是定义函数的两种方法,第一种使用函数声明语法定义,第二种使用函数表达式定义.这两种定义函数的方式几乎没有什么区别. function ...

  6. mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程)

    写在最前 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生M ...

  7. jquery.jqprint-0.3.js打印table表格遇到的坑

    在谷歌控制台输入window.print();可以调起当前整个页面的打印预览,那么要想打印页面某块区域内容怎么办呢? 我找到了jqprint插件,其原理是运用iframe 元素创建另外一个文档的内联框 ...

  8. Java自学手记——泛型

    泛型在集合中的应用 泛型在集合经常能看到,有两个好处:1.把运行时出现 的问题提前至了编译时:2.避免了无谓的强制类型转换. 用法:两边泛型的类型必须相同,可允许一边不写,只是为了兼容性,并不推荐. ...

  9. Java自学手记——Java中的关键字

    Java中的一些关键字对于初学者来说有时候会比较混乱,在这里整理一下,顺便梳理一下目前掌握的关键字. 权限修饰符 有四个,权限从大到小是public>protected>defaul(无修 ...

  10. 网络请求工具类WebServiceUtils

    如果对WebService一无所知的话,建议先看看这两篇博客,对你WebService很有帮助. http://blog.csdn.NET/eyu8874521/article/details/912 ...