iOS 10.2越狱研究

原文

首先了解一下tfp0
tfp0中的tfp表示task_for_port,是一个为了获取进程任务端口的Mach陷阱。任务端口可以看作是一个IPC机制,可以在一个目标进程的内存空间进行读取和访问。它甚至比随机内存读写还要好,因为我们可以利用内核中的偏移(比如KASLR)直接访问(*咳*patch*咳*)代码。

关于Async Wake漏洞
构成这个漏洞利用的2个BUG,一个是信息泄露(CVE-2017-13865),另一个是Use-After-Free(CVE-2017-13861)。信息泄露是由proc_pidlistuptrs中一个不正确的边缘检测结果导致的,这个错误使得程序多读取了7个字节,更重要的是这几个字节被直接由内核层拷贝到用户层。接着是Use-After-Free,它的产生是因为UISurfaceRootUserClient在其子程序出错时没有正确处理引用,当它的上一个调用(还有他后面的async函数,wake_port)在内核层释放一个悬挂指针时便会触发。它—与一些创新的堆栈风水结合在一起便能创造一次任意内核态的读写操作,通过激励的争吵将一个指针放入内核任务进程,就是tfp0。

为了正确利用Use-After-Free,大量的kalloc分配请求将会指向目标端口,然后一定数量的mach端口会被分配出来以确保当前页只包含属于我们PID的mach端口。之后IOSurface悬挂指针BUG将通过缓慢的内存重新分配直到垃圾回收器回收了IOSurface指针引用的那一片代码页来触发。

这些重新分配的内存中包含一些改造过的ipc_kmsg消息,这些消息中有一个假的IKOT_TASK任务端口是指向一个process block structure(bsd_info)的,bsd_info中含有一个假的任务结构。这样便可在后面用来构成一个任意读取的基本操作。

当利用读取操作找到内核中的vm_map和ipc_space之后,就可以通过重新分配之前的kalloc.4096实现任务端口覆盖。

Ian的XCode Project中有一个奇妙的README文件对该原理有着更详细的表述。

根据个人经验,有一个值得注意的问题,在不考虑内核完整性校验的情况下,你有3此机会利用此漏洞,在第4次的时候内核会崩溃,而手机则会重启(11.1.2/15B202)。

你可能感兴趣的:(ios)