简介
由于iOS的普及,吸引了大量安全研究人员的注意。苹果不断提升iOS的安全性,快速开发适应新的缓解措施。就缓解措施的有效性而言,苹果增加了黑客入侵iOS设备的复杂性,使其成为最难被黑客攻击的平台之一,但是,这还不足以阻止熟练的个人和资金雄厚的团体通过提升权限实现远程代码执行,并在设备上持久化。
这篇文章是在iOS上实现特权提升系列文章中的第一篇,这个系列的文章将一直持续更新,直到获得特权访问、用户空间利用以及重新启动后在设备上的持久性。
我们将详细介绍链接中的几个bug,从而在iOS内核上下文中运行代码。将这些漏洞与其他漏洞(例如,iOS MailDemon漏洞,或基于webkit的漏洞)链接起来,可以获得对iOS设备的远程控制。
这个exploit是ZecOps赏金活动的一部分,我们感谢@08Tc3wBB参与ZecOps赏金活动,以及在此项目中提供帮助的所有人。我们还要感谢Apple安全团队修复了这些漏洞,并防止在最新版本的iOS中进一步滥用这些漏洞。
当我们计划发布到博客时,我们已经发布了完整的本地特权提升(LPE)链,可以在iOS 13.7和更早的PAC和非PAC设备上运行。我们将这个版本完全开源;我们相信,这是改善iOS研究和平台安全性的最佳成果。
Part I – 漏洞
AppleAVE2是一个图形IOKit驱动,运行在内核层,只存在于iOS上,与其他iOS专用驱动一样,它不是开源的,而且大多数符号已经被删除了。
该驱动程序无法从默认的应用程序沙箱环境访问,这降低了苹果工程师或其他研究人员进行全面分析的机会。这个驱动程序的旧版实现似乎是一个很好的攻击表面,下面恰好地证明了这一点。
早在2017年,Zimperium zLabs团队的Adam Donenfeld就在同一个驱动中揭漏了7个漏洞,从这些漏洞的描述来看,有些漏洞甚至在今天仍然很吸引人,尽管存在诸如PAC(针对A12及以上版本的iPhone/iPad)和zone_require(iOS 13及以上版本)等强大的缓解措施,但任意内存操作漏洞(如CVE-2017-6997、CVE-2017-6999)的作用远远大于执行劫持类型,在具有各种信息泄漏漏洞链中使用时潜力更大。
尽管这些漏洞都有CVE,这表明它们已经被修复了,但苹果之前并没有一次性修复漏洞,甚至无法修复漏洞。考虑到这一点,让我们开始寻找下一个AVE漏洞!
我们将从用户内核数据交互界面开始:
AppleAVE2通过重写IOUserClient :: externalMethod公开了9个(索引0-8)方法。
两个公开的方法(索引0和1)允许按FIFO顺序添加或删除clientbuf。
其余所有方法(索引3-8)最终都通过IOCommandGate调用AppleAVE2Driver::SetSessionSettings以确保线程安全并避免竞争。
*1 针对dyld的重叠段(Segment)攻击,以实现不受束缚的越狱,第一次出现在ios6越狱工具evasi0n中,之后类似的方法出现在每个公开越狱中,直到Pangu9之后,苹果似乎终于解决了这个问题。
*2 苹果不小心在新版本中重新引入了之前修复的安全漏洞。
我们主要使用索引7的方法对clientbuf进行编码,这基本上意味着要通过从userland提供的ID加载多个IOSurface,并使用索引6的方法来触发触发位于AppleAVE2Driver::SetSessionSettings内部的多个安全漏洞。
下面是对象之间的关系图:
clientbuf是通过IOMalloc分配的内存缓冲区,其大小相当大(iOS 13.2中为0x29B98)。
要添加的每个clientbuf objext都包含指向前后的指针,从而形成一个双向链表,因此AppleAVE2Driver的实例仅存储第一个clientbuf指针。
clientbuf包含多个MEMORY_INFO结构。当用户空间提供IOSurface时,将分配iosurfaceinfo_buf,然后将其用于填充这些结构。
iosurfaceinfo_buf包含一个指向AppleAVE的指针,以及与从用户空间到内核空间映射的有关变量。
作为clientbuf结构的一部分,这些InitInfo_block的内容是通过IOSurface从用户控制的内存中复制的,这种情况发生在用户在添加新的clientbuf之后首次调用另一个公开的方法(索引7)时。
m_DPB与任意内存读取原语有关,这将在后面的文章中介绍。
IOSurface 简介
如果你不熟悉IOSurface,请阅读以下内容:
根据Apple的描述,IOSurface用于在多个进程之间更有效地共享硬件加速的缓冲区数据(用于framebuffers和textures)。
与AppleAVE不同,可以通过任何用户态进程使用IOSurfaceRootUserClient轻松创建IOSurface对象。当创建一个IOSurface对象时,你会得到一个32位长的Surface ID号,用于在内核中进行索引,以便内核能够将与该对象关联的用户空间内存映射到内核空间。
现在让我们来谈谈AppleAVE的漏洞。
第一个漏洞 (iOS 12.0 – iOS 13.1.3)
第一个AppleAVE漏洞是CVE-2019-8795,其他两个漏洞:一个击败了KASLR的内核信息泄漏(CVE-2019-8794)和一个沙盒逃逸(CVE-2019-8797)访问AppleAVE,在iOS 12上创建了一个能够越狱设备的漏洞利用链。直到iOS 13的最终版本发布为止,该版本通过将沙盒规则应用于易受攻击的进程并阻止其访问AppleAVE来实现沙盒逃逸(Sandbox-Escape),因此,沙盒逃逸被之前讨论的另一个沙盒逃逸漏洞替代。
iOS 13.2更新后,第一个AppleAVE漏洞最终被修复。
这里有一个简短的描述,如果想了解更多细节,你可以查看之前的writeup。
当用户释放clientbuf时,它将遍历clientbuf包含的每个MEMORY_INFO,并将尝试取消映射并释放相关的内存资源。
如果你比较一下苹果是如何修复它的,这个安全漏洞是相当明显的:
由于越界访问权限,未修复的版本仍然有缺陷,允许攻击者劫持内核代码在常规和PAC支持的设备中执行。这个缺陷也可以通过操作符delete成为任意内存释放原语。而在苹果修复iOS 13.6上的zone_require漏洞之前,这就足以在最新iOS设备上实现越狱。
今天发布的POC只是一个初始版本,将允许其他人进一步使用它。POC与ZecOps共享基本的分析数据,以发现更多的漏洞,帮助进一步保护iOS,这个选项可以在源代码中禁用。
在下一篇文章中,我们将介绍:
- 内核中的其他漏洞
- 利用这些漏洞
- 用户空间的漏洞
- 最终的持久性机制可能永远不会被修补