
Детерминированный эксплойт ядра, основанный на CVE-2023-32434.
Trigon — это детерминированный эксплойт для ядра и обход PPL, основанный на CVE-2023-32434. Он поддерживает устройства A9 - A16 под управлением iOS 13 - 16.5.1. Детерминированность означает, что этот эксплойт никогда не вызовет панику во время или после эксплуатации и является полностью надёжным.
Trigon эксплуатирует целочисленное переполнение в слое VM ядра XNU. Уязвимость позволяет нам построить примитив произвольного отображения физических адресов. Это даёт нам примитивы чтения/записи по почти любому физическому адресу, но последующая стратегия эксплуатации различается для разных устройств и версий.
Если вам интересны технические статьи об iOS, рекомендую прочитать серию Trigon! Я постарался сделать её максимально понятной, чтобы её могли понять и те, кто не является iOS-исследователем.
Примечание: устройства arm64 в настоящее время не поддерживаются на iOS 16, поддерживаются только устройства arm64e (A12+).
Поддержка arm64e требует нескольких жёстко заданных значений, которые следует поместить в unique_offsets.h. Большинство из них можно найти очень легко: некоторые смещения структур можно найти в исходном коде Dopamine, а другие — запустив XPF. Однако есть три смещения, которые мы не можем найти до эксплуатации, и сейчас я объясню, как их найти.
UniqueValues.addresses.base — это физический базовый адрес вредоносного отображения памяти для Trigon. Простой способ найти его — использовать существующее значение в качестве предполагаемого базового адреса, а затем прочитать распознаваемый физический адрес, например 0x41410000. После этого можно вычесть смещение из физического адреса в логе паники, чтобы определить правильный базовый адрес отображения.
pv_head_table и pp_attr_tableUniqueValues.offsets.pv_head_table и UniqueValues.offsets.pp_attr_table — это относительные смещения двух структур данных ядра от физической базы ядра. Поскольку они выделяются так рано во время инициализации ядра, они всегда находятся по одному и тому же смещению от базы ядра в физической памяти. Чтобы найти их, можно использовать существующий эксплойт для ядра (например, kfd), чтобы найти эти структуры и перевести их в правильный физический адрес, а затем вычислить смещения таким образом.
Для устройств, поддающихся джейлбрейку через Dopamine, я включил простой в использовании инструмент командной строки, который найдёт все необходимые смещения для Trigon на arm64e здесь. Вы можете использовать его, чтобы настроить эксплойт для работы на вашей комбинации устройства и версии.