
Exploit for CVE-2021-30807
完整文章见:https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
针对 CVE-2021-30807 的漏洞利用。如果你真的想以此为基础构建越狱工具,则需要针对你的设备和 iOS 版本进行调整,因为我没有可用的信息泄露用于此目的。
对于 A11 及以下设备,使用 pongo 加载 xnuspy,并用 SAMPLING_MEMORY=1 make -B 进行编译。这将启用一个测试,收集 kernel_memory_allocate 返回的内存,对这些指针排序,然后输出一个范围。你会看到类似这样的内容:
sample_kernel_map: 0xffffffe8ebe9c000 [0x10000 bytes from behind]
sample_kernel_map: to add to alloc_averager:
[0xffffffe8ce934000, 0xffffffe8ebf98000],
(忽略它输出的警告即可)
该测试应在设备启动后 30 秒运行。
alloc_averager.py 中包含了我已为我的手机运行的一些样本。它会计算每个范围所有平均值的平均值。为你的设备创建一个“样本列表”,并将该范围添加到其中。重复测试几次,直到列表中有 5-10 个条目。alloc_averager.py 会报告基于列表生成的猜测的成功率。如果你对成功率满意,则将该猜测值替换到 IOMobileFramebufferUserClient.c 顶部的 GUESSED_OSDATA_BUFFER_PTR 中。
非常重要的一点是:不要将异常值包含在该列表中。运行测试几次后,你很可能会遇到一个与你已有范围有明显差异的范围。
你需要为你的设备/版本找到偏移量才能运行此测试。
首先,找到 kernel_memory_allocate:只需交叉引用 kernel_memory_allocate: VM is not ready。当你有偏移量后,在 install_kernel_memory_alloc_hook 中将 kma 的值设置为它。
其次,为了将测试与 XNU 的其他内存分配隔离,我会检测一个特定的返回地址。该地址位于 OSData::initWithCapacity 内部。你可以通过交叉引用字符串 "OSData" 轻松找到 OSData 的 vtable。该字符串的第一个交叉引用会定位到一个函数,该函数中又有一个交叉引用指向 OSData::MetaClass 的 vtable。该 vtable 的正上方就是 OSData 的 vtable,而 OSData::initWithCapacity 位于 +0x78 偏移处。
找到 OSData::initWithCapacity 后,找到唯一一个跳转到 kernel_memory_allocate 的 BL 指令,然后取其下方紧邻指令的偏移量。在 kernel_hooks.c 中,使用该偏移量作为该文件中唯一函数的唯一 if 语句的条件。
A12 及以上设备需要使用类似 Correlium 的工具。