CVE-2016-7661
漏洞详细分析在这里
这个漏洞主要讲的是一个叫做power的进程在处理通知消息时进行了一些错误的处理,导致本不应该被释放的消息的port被释放,最终造成对power进程的拒绝服务,接下来在Ian beer的write up上简单学习一下漏洞大概的因果
首先power进程是通过pmServerMachPort来进行消息的处理,在这期间调用mig_server_callback函数来处理pmServerMachPort上的新消息,
|
|
|
|
当接收到消息的msgh_id
与MACH_NOTIFY_DEAD_NAME
的值进行比较,如果相同,则将直接调用mach_port_deallocate
对消息进行销毁。
由这个消息的头标志位我们了解到这是一个简单消息,
所以not_port
参数可以将mach_dead_name_notification_t
消息直接传递给mach_port_deallocate
进行销毁
一旦这个消息被异常释放,紧接着其他power中有关这个消息的函数将全部奔溃,最终导致power这个进程奔溃
漏洞利用
|
|
由于目标是让power进程奔溃重启,结合利用代码,当我们向power进程发送消息时,以0x103
作为参数值时,则会使power调用mach_port_deallocate
对目标port进行释放,然后又对消息进行虚拟内存分配,由于消息已经被释放了,所以内存分配理应失败。
但是power却不知道此时内存分配早已失败,并且对一个无效的地址指针进行取值,于是power进程就会发生奔溃,
mach_portal的利用方法
众所周知,想要完成越狱,最少需要两个漏洞,一个是获取root权限,另一个则是绕过内核的保护。mach_portal通过前三个漏洞组合起来可以实现内核的任意读写,然后就是对一些内核保护比如沙盒等的绕过。
漏洞利用:
- 首先通过CVE-2016-7637,替换launch中的iohideventsystem port,接收到原本发往特权port的消息,实现中间人攻击。
- 然后通过CVE-2016-7661,使得powerd进程崩溃重启,获取powerd的task port,进而获得host_priv
- 最后通过CVE-2016-7644,造成内核UAF,获得内核task port,实现内核地址空间任意读写
小结
这几篇漏洞利用的学习,断断续续写了好几天,当初在看《深入解析macOS/iOS操作系统》
时也了解了一些深入mach_ipc
的一些知识,但真正去参考别人的poc去分析的时候还是会发现很多不足,从cve-2016-1757
开始一直学习有关mach_ipc
的知识,也有一定的经验,个人认为了解详细的内核知识,一些相关的xnu源码
是必读不可的
参考:
《深入解析macOS/iOS操作系统》
《iOS Internals Volume 3》
http://bobao.360.cn/learning/detail/3740.html
http://turingh.github.io/2017/01/15/CVE-2016-7644-三谈Mach-IPC/
https://bugs.chromium.org/p/project-zero/issues/detail?id=965&can=1&q=apple&sort=-id