作者:蒸米

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/p...
2、http://keenlab.tencent.com/zh...
3、http://newosxbook.com/article...

英文版链接:https://jaq.alibaba.com/commu...

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

再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸相关推荐

  1. IOS模拟登录之沙盒原理

    IOS模拟登录之沙盒原理 info.plist 文件

  2. iOS 照片存储到沙盒 和读取

    iOS 照片存储到沙盒 和读取 这里介绍简单的ios照片保存到沙盒,然后读取出来. 1. 照片保存到沙盒 UIImage *image=[UIImage imageNamed:@"20141 ...

  3. 浅谈NPM,vm,vm2,Node.js沙盒逃逸

    NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准. NPM由三部分组成:网站,注册表(registry),命令 ...

  4. iOS开发 - 内购沙盒测试正常,因产品返回数为0被苹果审核多次拒绝 (In-app purchase products return 0)

    最近给app增加内购移除广告功能,刚开始还比较顺利,把网上找到的内购代码,简单修改加入到app内,基本能用,测试完成后,提交审核.第一次提交,有点问题被拒,根据具体问题进行改正后,再提交,审核就通过了 ...

  5. IOS数据存储 —— 1 沙盒(数据存储目录)

    沙盒结构 沙盒的文件系统⽬录,如下图所示(假设应用的名称叫Layer) 1.Documents 目录 您应该将所有的应用程序数据文件写入到这个目录下. 这个目录用于存储用户数据或其它应该定期备份的信息 ...

  6. iOS打开沙盒html,ios 开发中,沙盒目录解释

    在iPhone的沙箱模型有四个文件夹,分别是documents.tmp.app.library. 创建文件的时候会先创建文件的路径,方法如下: 1.Documents:这是文档目录.有关应用的所有数据 ...

  7. IOS文件管理系统:沙盒、NSFileManager、NSFileHandle、NSCoding、NSKeyedArchiver解析

    什么是沙盒? 苹果为我们每个app都分配了一个固定的文件夹,我们在开发过程中可以向文件夹存入我们想要存储的数据,同时也能从这些文件夹取这些数据,但是我们不能取到其他app所存储的数据.简单说,沙盒就是 ...

  8. ios沙箱软件_iOS沙盒管理工具FHHSandBoxViewer

    KeyWord:沙盒文件递归遍历.Swift里的闭包多个weak修饰.iOS使用AirDrop 操作演示.gif 平时真机开发调试App的时候想查看沙盒具体内容一般做法是连接Xcode下载整个App的 ...

  9. ios沙箱软件_iOS沙盒获取

    屏幕快照 2017-04-11 上午11.08.53.png 1.获取沙盒中home目录(主目录,沙盒的最外层)的路径 NSString *homeDir = NSHomeDirectory(); N ...

最新文章

  1. Linux命令学习总结:hexdump
  2. R语言构建回归模型并获取对于新数据预测的预测区间实战:给出预测区间而不是一个具体的预测值、置信区间与预测区间的异同
  3. hbuilderx 2.9.8 公用css样式_浅谈关于vue中scss公用的解决方案
  4. logstash使用,结果输出到stdout
  5. iOS多线程GCD 研究
  6. 学习之旅——工作记录日志2017.7.09
  7. tf.app.flags和tf.app.run的使用
  8. [转载] java-继承和多态
  9. qtabwidget放大_Qt自定义弹窗屏蔽父窗口(QWidget设置setWindowModality(Qt::ApplicationModal);以后再show)...
  10. 测试常用——linux 基础命令
  11. Python学习笔记:爬取网页图片
  12. English trip V1 - 20.Look at me 看着我 Teacher:Solo Key: 声调(英语默认就声调[rising]和降调[falling]两种)...
  13. 傻瓜看完都可以简单使用Git
  14. Jzoj5231 序列问题
  15. checksum建立的索引
  16. java web项目_一个完整JavaWeb项目开发总结
  17. Hadoop文章收集汇总 - 如禁止转载,请及时联系本人 收集学习互联网各位前辈分享的文章
  18. 微博情感分析 mysql_利用500万条微博语料对微博评论进行情感分析
  19. 2021全国大学生电子设计竞赛F题参赛简记
  20. 大一下c语言笔记本电脑,大一新生上大学笔记本电脑推荐

热门文章

  1. flutter 应用场景_Flutter混合开发的路由栈管理
  2. mysql proxy性能差_两种MySQL-Proxy架构的测试对比记录
  3. mysql 缓存怎么设置_mysql中缓存如何设置
  4. python文本分类特征选择_文本挖掘之特征选择(python 实现)
  5. IC基础知识(2)模拟和数字电子学导论
  6. 【 FPGA 】UltraFast设计方法学笔记(RTL代码风格1)
  7. Angular组件——投影
  8. Lync 2013 与 Elastix 2.40 语音通信设置全过程(1)
  9. GO语言基础之reflect反射
  10. MyBatis之传入参数