使用 checkm8 和 Ramdisk 破解 iPad 锁屏密码
本文在 iPad mini 1 和 iOS 7 环境下测试。
在之前的文章利用 checkm8 漏洞访问 iPad 文件系统中,笔者记录了如何维修一台屏幕完全损坏的 iPad mini 1,并使用 Arduino、checkm8 和 SSH Ramdisk 访问其中的文件系统。当时已经可以把照片等文件复制出来,也可以通过修改 SpringBoard 配置解除锁屏密码的尝试次数限制,但要在屏幕上手工尝试最多 10000 组四位数字,仍然不太现实。
最近,笔者继续研究了旧款 iOS 设备的 Data Protection 机制,发现普通 SSH Ramdisk 不能直接用于密码破解,并制作出一套可以访问设备 UID 密钥的 iOS 6 Ramdisk,成功在设备端自动尝试锁屏密码。
iOS 如何使用锁屏密码保护数据
iOS 并不会直接保存锁屏密码。设备初始化时会生成一组用于保护不同类别文件的 Class Key,并把它们包装后保存在 System Keybag 中。这台设备的 Keybag 位于数据分区的/mnt2/keybags/systembag.kb。用户输入密码后,系统会将密码、Keybag 中的 Salt 以及设备内部独有的 UID 密钥一起送入密钥派生函数(KDF),计算出 Passcode Key,再用它解开 Keybag 中的 Class Key。只有这一整套过程成功,系统才能访问受到 Data Protection 保护的文件。
这也解释了为什么不能把 Keybag 复制到性能更高的电脑上离线破解。UID 密钥写在芯片内部,软件无法直接读出,只能请求设备的 AES 硬件使用它进行运算。因此,即使候选密码在 Mac 上生成,最关键的 KDF 仍然必须由这台 iPad 自己完成。
早期 iOS 安全研究项目 iphone-dataprotection 提供了一个名为bruteforce的设备端程序。它会读取 System Keybag,依次测试四位数字密码,并通过 AppleKeyStore 和硬件 AES 验证结果。找到正确密码后,程序还会生成 Passcode Key 和所有 Class Key,供后续解密数据使用。后文提到的bruteforce就是这个工具。


