欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

iPhone BootROM 漏洞说明及威胁评估

来源:本站整理 作者:佚名 时间:2019-10-06 TAG: 我要投稿

0x00 相关词汇
AP:应用处理器。
SEP:安全协处理器。
SecureROM:又称 BootROM 是固化在 iPhone 只读区域中的一段代码,该区域中的代码是启动链及启动信任链的起点,主要负责加载后续的启动链,该区域中的代码无法通过系统更新来更新,所以该区域中的代码一旦出现安全问题,影响是非常大,并且这种影响是持久的,只能通过召回设备修复问题。关于 SecureROM 的具体功能,可以参考笔者之前写的一篇文章 《SecureROM 分析笔记》。
GID:GID 是固化在 iPhone 加密引擎中的 AES 密钥,所有相同型号的设备具有相同的密钥,比如:所有 iPhone X 都具有相同的密钥。该密钥主要用来解密系统更新固件。SEP 有独立的 GID,与 AP 的不同。
UID:UID 也是固化在 iPhone 加密引擎中的 AES 密钥,但每台手机都有不同的 UID,UID 主要用来加解密用户相关的数据。SEP 有独立的 UID,与 AP 的不同。
 
0x01 事件起因
北京时间9月 28 日凌晨,国外安全人员 @axi0mX 通过 Twitter 公开了一个 iPhone BootROM 的漏洞[1],同时公开了相关的利用代码[2]。
就像 @axi0mX 在推文中所说[3],这是从 2010 开始,9 年间,第一个公开的针对 64 位苹果设备的可以利用的 BootROM 的漏洞。我们知道越狱社区一直在跟苹果设备的安全性做着“斗争”,随着苹果不断地提高 iPhone 的安全性,越狱变得越来越难,而 BootROM 漏洞不仅可以用来越狱当前最新的 iOS 版本,还可以用来越狱将来的 iOS 版本(因为硬件漏洞无法通过系统更新进行修补),所以该漏洞在越狱社区中引起了巨大的轰动。
 
0x02 受影响的设备
影响从 iPhone 4s 到 iPhone X 的所有设备,同时影响这段时间内生产的 iPad 设备。
 
0x03 漏洞成因说明
@axi0mX 是通过二进制对比发现的这个漏洞[4],同时 @littlelailo 独立的通过代码审计的方式也发现了这个漏洞[5]。@littlelailo 对这个漏洞的成因及利用思路做了说明[6][7]。
由于 @littlelailo 对漏洞的成因已经说得非常清楚了,这里就不再画蛇添足,下面是@littlelailo 说明的直接机器翻译结果。下文中的图像并不是指图片,而是指 img4 固件文件。
这个错误一开始也被称为Moonshine基本上,我查看过的所有bootrom中都存在以下错误:1.当usb开始通过dfu获取图像时,dfu注册一个接口来处理所有命令,并为输入和输出分配一个缓冲区2.如果您将数据发送到dfu,则设置包由主代码处理,然后调出接口代码3.接口代码验证wLength短于输入输出缓冲区的长度,如果是这种情况,它将使用指向输入输出缓冲区的指针更新作为参数传递的指针4.然后返回wLength,这是它要接收到缓冲区的长度5. USB主代码然后使用长度更新全局变量,并准备接收数据包6.如果接收到数据包,则通过作为参数传递的指针将其写入输入输出缓冲区,并使用另一个全局变量来跟踪已经接收了多少字节7.如果接收到所有数据,则再次调用dfu特定代码,然后继续将输入输出缓冲区的内容复制到以后从中引导映像的存储位置8.之后,usb代码将重置所有变量并继续处理新软件包9.如果dfu退出,则释放输入输出缓冲区,并且如果映像解析失败,则bootrom重新输入dfu
退出dfu可以通过发送dfu中止包或通过触发USB重置触发解析来完成
问题:在第5步,将更新全局变量,并且Bootrom准备接收数据,但是使用便宜的控制器,您可以违反USB规范并且不发送任何信息(arduino主机控制器或类似的东西)。然后,您可以触发USB重置以触发图像解析。如果解析失败,bootrom将再次输入dfu,但未执行步骤8,因此全局变量仍包含所有值。但是,执行了步骤9,因此释放了输入输出缓冲区,而在步骤3中作为参数传递的指针仍然指向它。因此,您可以通过将数据发送到设备来轻松触发对已释放缓冲区的写入。
对A8的利用:1.将0x40的随机数据发送到dfu,必须发送此数据,否则您将无法使用USB重置ctrlReq(bmRequestType = 0x21,bRequest = 1,wLength = 0x40)退出dfu2.通过发送ctrlReq(0x21,1,0)ctrlReq(0xa1,3,1)ctrlReq(0xa1,3,1)ctrlReq(0xa1,3,1)ctrlReq(0xa1,3,1)使dfu处于等待USB重置的状态ipwndfu dfu.py)3.仅发送了带有bmRequestType 0x21和bRequest 1以及有效载荷大小的wLength的设置数据包(此数据包将更新全局变量)4.发送一个状态包以标记控制传输的结束(即使将wLength设置为一个值,我们也会跳过数据阶段)5.触发总线复位6.等待设备重新输入dfu(现在将释放输入输出缓冲区,并且将在释放的缓冲区下分配usb任务)7.发送设置的配置请求ctrlReq(bmREQ_SET,USB_REQUEST_SET_CONFIGURATION,wLength = Payloadsize),但将有效载荷与数据阶段一起发送(bootrom中的设置配置处理程序忽略wLength)
有效负载将覆盖usb任务结构,并且将成为usb堆栈之后的下一个分配。通过定位USB任务结构中的链接列表,您可以插入伪造的任务。而且您可以将usb任务堆栈用作暂存空间,因为看起来它永远都不会写到那么高。当dfu退出并且usb任务停止时,将生成该代码。因此,您可以在第7步之后发送dfu中止数据包,并在该代码执行exec的情况下控制所有较高的寄存器,因为您的虚假任务将添加到列表中并在以后的某个时刻运行。
〜31.05.19莱洛
 
0x04 能力及威胁评估
限制条件
漏洞利用的限制条件:需要将设备置入 DFU (Device Firmware Upgrade)模式。
漏洞及利用目前所具有的能力
1、BootROM 中的任意代码执行能力。
2、开启 CPU 的硬件调试能力(JTag)。
3、使用 AP 的 GID 进行加解密。
4、使用 AP 的 UID 进行加解密。
任意代码执行能力及 CPU 级调试能力
BootROM 是 iPhone 启动信任链的基础,在 BootROM 中具有了任意代码执行能力,意味着 iPhone 的整个启动信任链被打破了,最终可以用来加载修改过的 iOS 内核,从而破坏 iOS 的基础安全特性。这部分能力主要会被用来做越狱(这里的越狱是指越狱所带来的能力,而不仅仅指越狱行为)。
CPU 级调试能力,这个能力主要会被用来分析 iPhone 的安全启动链及调试相关的漏洞及利用。
使用AP 的 GID 进行加解密的能力
使用 AP 的 GID 进行加解密的能力主要会被用来解密 iPhone 的固件,破坏了苹果对相关组件的封闭性保护,进而可以用来评估相关模块的安全性,下面是利用该能力解密出来的固件密码:

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载