了解24kpwn

24kpwn也称为“ 0x24000段溢出漏洞”,是iOS历史上的第一个越狱事件。

你们中的许多人以前可能听说过越狱,也许有人正在对此进行研究。 关于我自己的一些简介,我是一名安全研究员。 去年,我在Facebook Inc.中发现了一个bug,Facebook为此奖励了我。 这样,我就可以使用我的第一台iDevice。 我一直对移动安全感到好奇,然后Luca Todesco(@qwertyoruiopz)为64位设备的iOS 10开发了越狱软件。 从那时起,我开始学习有关iOS安全的知识。 我阅读书籍,文章,帖子,PoC和观看的视频。 但是由于资源较少,很难进入iOS安全领域。 我发现在线资源不多,如何上手以及指向何处。

因此,对于那些想加入该领域的人来说。 我建议他们从Binary Exploitation开始。 这就是我的开始方式,“ iOS Hackers Handbook”是一本很棒的书。 无论如何,您在这里不是为了我的故事而了解24kpwn。

因此,让我们开始吧,在开始之前,让我先介绍一些术语,以免引起您的混淆。

LLB — 底层BootLoader

SRAM — 静态随机存取存储器

IMG3- iOS启动期间使用的新版本的 IMG2

S5L8720 — 应用处理器

S5L8920 — 应用处理器

NOR — NOR闪存(可通过电擦除和重新编程的存储器)

IDB — 调试过程

SoC — 片上系统

我想我介绍了我将在本文中使用的所有术语。

什么是24kpwn?

24kpwn也称为0x24000段溢出 ,一些研究人员在第一个iPod Touch 2G中发现了24kpwn ,该溢出允许绕过LLB上的bootrom签名检查并最终获得不受限制的越狱。 之后,在2009年10月,Apple修复了此漏洞。

背景:-

设备启动时, S5L8720S5L8920具有MIU配置,该配置将安全ROM映射到0x0地址,从而为新打开的设备提供ARM异常向量和第一个要执行的代码。 此MIU配置还将S5L8720的某些SRAM映射到0x22000000 ,而S5L8920的某些SRAM映射到0x84000000 。 静态分配的变量,堆和堆栈必须使用SRAM ,因为Secure ROM是不可写的。 从(SRAM Start)+ 0x24000开始的内存区域,用于加载引导加载程序的下一个阶段的缓冲区,这只是一些存储在NOR中的 LLB代码。 并且此NORLLB代码以及其他引导阶段代码(例如引导徽标等)一起存储,这些代码提供给XNU Kernel 。 现在,(SRAM起始地址)+ 0x24000处的0x160字节内存的第一部分用于初始化静态分配的变量。 引导后,将从Secure ROM初始化该区域的值。

漏洞:

现在,这里没有什么可疑的,那么漏洞在哪里。 该漏洞存在于代码中,该代码将NORLLB IMG3文件复制到内存中,但它不会检查正在加载的LLB图像的大小,而是从IMG3的未签名部分获取整个大小。 NOR的标头(ROM偏移量0x2178 )。 任何长度大于0x24000字节的映像都将开始覆盖用于存储Secure ROM静态分配的变量的内存部分。

而且,这些易受攻击的数据包括用于DFU模式的USB数据结构,用于Secure ROM的调度程序的bdev列表结构的指针,以及硬件SHA1寄存器的地址。 所有这些都是潜在的剥削途径。

利用:-

该漏洞利用的目的是获得任意代码执行功能。

该漏洞利用溢出来覆盖SHA1寄存器中的地址之一,这是唯一负责将哈希码复制到硬件中的地址。 通过专门重写执行“ SHA1寄存器 ”写操作的函数的LR来实现代码执行,以便代替返回主SHA1例程 ,它将返回到包含有效载荷代码的内存中的选定位置。 并且选择的位置在充满LLB的IMG3的内存中,因此有效负载可以放置在LLB的IMG3上

面临的挑战是确定将SHA1寄存器放置在何处,以便使用有效负载LR覆盖堆栈的右侧部分。 在没有访问任何类型的异常转储的情况下,这非常困难,而且Apple已经在bootrom中禁用了崩溃寄存器转储。 最后,在对Bootrom代码中的S HA1硬件的两次调用进行了非常详细的IDB的静态分析和理论上的调用堆栈之后,他们发现了一种更改IMG3 DER的方法,以便在不进行SHA1硬件的第二次调用的情况下影响第一。

选择了最终的SHA1寄存器地址,因此LLB IMG3DATA标签的第一个双字将替换sub_5E54LR 。 这是因为可以在不更改IMG3的结构的情况下更改IMG3的第一个双字 。 必须在首次触发漏洞利用程序时执行LR替换,否则bootrom将会崩溃。 由于sub_5E54一次获取了前0x40字节的数据,因此替换后的LR应该在要散列的数据的0x40字节之内。 从IMG3的开头开始,对数据进行散列的操作从0xC字节开始,而DATA标签id为0x20字节的第一个双字IMG3的开始开始。 因此,在sub_5E54LR之前,所选的SHA1寄存器地址为0x20–0xC = 0x14字节。 因此它必须是0x2202FE24。 请注意,该漏洞利用还会浪费0x2202FE24 + 0x40 = 0x2202FE64。 因此, doComputeSHA1堆栈的相当大一部分也将被丢弃

因此,最终利用IMG3的是常规IMG3 ,其填充最大为0x24000字节。 接下来的0x100字节取自0x22024000的原始初始化值。 但是,对于0x240FC, SHA1寄存器地址的偏移量已更改为0x22023000。 有效负载代码位于0x23000。

有效载荷:

现在我们知道了它将如何利用,现在有效载荷是什么。

因此,有效负载的目标是允许加载未签名的LLB

有几种方法可以做到这一点,其中一种就是简单地使用JumpToMemory函数,该函数旨在准备SoC并调用LLB代码 。 但是,它设计用于解密代码,并且LLB代码当前以加密形式驻留在IMG3 DATA标签中 。 ewas上的简单解决方案是简单地使用Apple自己的bootrom机制解密并执行代码。

然后,最后的有效载荷将通过LLB的IMG3中的历元和其他标签的验证,返回到从存储器中加载并解密DATA标签之前的位置。 R5设置为0,以确保不会跳过解密。 然后,有效负载将DATA dword的原始值写回到0x22000020,并将原始SHA1寄存器值写回到0x2202FE24,以确保仅激活一次。

因此,这就是有关24kpwn的全部故事希望这将有助于您深入了解iOS。 这是第一个漏洞,并且从最近十年开始,Apple一直在通过修补bug和应用现代漏洞利用缓解技术来对抗越狱事件。

Interesting Posts