雷锋网(公众号:雷锋网)注:该报告转载自360信息安全部涅槃团队博文,原文标题为《iPhone BootROM 漏洞说明及威胁评估》。
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)退出dfu
2.通过发送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的情况下控制所有较高的寄存器,因为您的虚假任务将添加到列表中并在以后的某个时刻运行。
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 的固件,破坏了苹果对相关组件的封闭性保护,进而可以用来评估相关模块的安全性,下面是利用该能力解密出来的固件密码:
; iOS-v13.1.1-17A854, iPhone X
; iBoot.d22.RELEASE.im4p
IV: 1ef67798a0c53116a47145dfff0aac60
KEY: 9a6ddfb9f432a971be8ae360c6ce0a8e3170f372d4e3158bb04e61d81798929f
使用 AP 的 UID 进行加解密的能力
根据笔者目前所掌握的知识,用户相关数据的密钥主要是使用 SEP 的 UID 进行的加解密,因此尚不清楚使用 AP 的 UID 进行加解密的能力是否会对用户数据造成直接的威胁。
对用户数据的威胁评估
对用户数据威胁的评估结论:笔者认为这个漏洞对用户数据仅构成间接威胁,没有构成直接威胁。
对用户数据威胁评估基于的前提:用户设置了锁屏密码。
一些离散的、iPhone 数据安全相关的知识:
1、 iPhone 的磁盘是加密的(SEP UID 相关)。
2、 设备中保存密码是加密的(SEP UID 相关,且与锁屏密码相关)。
3、 iPhone 中的用户文件是加密的(SEP UID 相关,且间接地与锁屏密码相关)。
4、 用户相关的数据,只有在设备重启后,第一次解锁屏幕后,才有可能被解密,即:绕过锁屏不会造成用户数据解密。
5、 破解锁屏密码主要在 SEP 上进行,根据苹果的文档[8],苹果做了相关的防暴力破解的防护。
通过上面的一些知识点,以及我们前面提到的漏洞限制条件:需要将设备置入 DFU 模式(DFU 模式意味着需要将设备重启)笔者可以得到如下 2 个结论:
1、 利用该漏洞,攻击者虽然无法直接解密用户数据,但是可以解密 iPhone 磁盘的数据分区,该分区中包含一些系统日志及程序行为的日志。
2、 利用该漏洞,从取证的角度,攻击者可以暴力破解锁屏密码,但仍会面临一些限制。
但事情没有绝对的,做过应用防护的应该清楚:如果端被攻破,那么端上产生的数据会变得不安全;端上使用的数据也会变得不安全。前面我们说过,利用这个漏洞攻击者可以破坏内核完整性,进而破坏内核的安全特性,获得内核空间的任意代码执行能力,获得用户空间的任意代码执行能力,因此:虽然攻击者无法利用该漏洞直接获取用户数据,但是配合一些其它的攻击手段,攻击者还是可以获取用户数据。
0x05 安全建议
1、不要将自己的受此漏洞影响的苹果设备交给他人。
2、将锁屏密码设置为 6 位数字,或者设置为更复杂的由字母+数字构成的密码。
3、定期重启设备。
0x06 参考资料
1、https://twitter.com/axi0mX/status/1177542201670168576
2、https://github.com/axi0mX/ipwndfu
3、https://twitter.com/axi0mX/status/1177542362853040129
4、https://twitter.com/axi0mX/status/1177544539046703104
5、https://twitter.com/littlelailo/status/1177554568626024448
6、https://twitter.com/littlelailo/status/1177555154549313537
7、https://gist.github.com/littlelailo/42c6a11d31877f98531f6d30444f59c4
8、《iOS Security Guide》,iOS 12.3
0x07 时间线
2019-09-28 安全人员 @axi0mX 通过 Twitter 公开漏洞
2019-09-30 360信息安全部 涅槃团队 完成本次报告
2019-09-30 360CERT发布本次报告
雷锋网版权文章,未经授权禁止转载。详情见。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/118253.html