
Эксплойт для 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 сообщит о вероятности успеха для предполагаемого значения, сгенерированного на основе списка. Если вас устраивает вероятность, возьмите это значение и замените им значение GUESSED_OSDATA_BUFFER_PTR в начале IOMobileFramebufferUserClient.c.
Очень важно не включать выбросы в этот список. После нескольких запусков теста вы, скорее всего, столкнетесь с диапазоном, который выбивается из остальных уже имеющихся диапазонов.
Вам потребуется найти смещения для вашего устройства/версии, чтобы запустить этот тест.
Во-первых, чтобы найти kernel_memory_allocate, просто сделайте перекрестную ссылку (xref) на kernel_memory_allocate: VM is not ready. Когда у вас будет смещение, установите значение kma на него внутри install_kernel_memory_alloc_hook.
Во-вторых, чтобы изолировать тест от других выделений, которые делает XNU, я проверяю конкретный адрес возврата. Этот адрес находится внутри OSData::initWithCapacity. Вы можете легко найти vtable OSData, сделав перекрестную ссылку (xref) на строку "OSData". Первая перекрестная ссылка на эту строку будет в функции, имеющей перекрестную ссылку на vtable для OSData::MetaClass. Прямо над этим vtable находится vtable OSData, а OSData::initWithCapacity находится по смещению +0x78.
Как только вы найдете OSData::initWithCapacity, найдите единственную инструкцию BL к kernel_memory_allocate и возьмите смещение инструкции непосредственно под ней. Внутри kernel_hooks.c используйте это смещение в единственном операторе if в единственной функции этого файла.
Для A12+ потребуется использовать что-то вроде Correlium.