
Exploit determinista del kernel basado en CVE-2023-32434.
Trigon es un exploit de kernel determinista y un bypass de PPL basado en CVE-2023-32434. Es compatible con dispositivos A9 - A16 que ejecutan iOS 13 - 16.5.1. Ser determinista significa que este exploit nunca provocará un panic durante o después de la explotación y es completamente fiable.
Trigon explota un desbordamiento de entero en la capa VM de XNU. La vulnerabilidad nos permite construir una primitiva de mapeo de direcciones físicas arbitrarias. Esto nos proporciona primitivas de lectura/escritura a casi cualquier dirección física, pero la estrategia de explotación posterior varía entre los distintos dispositivos y versiones.
Si te interesan los writeups técnicos relacionados con iOS, te recomendaría leer la serie de Trigon. He intentado que sea lo más comprensible posible para que quienes no son investigadores de iOS también puedan seguirla.
Nota: los dispositivos arm64 no son compatibles actualmente con iOS 16, solo los dispositivos arm64e (A12+).
El soporte para arm64e requiere varios valores hardcodeados, que deben colocarse en unique_offsets.h. La mayoría se pueden encontrar muy fácilmente, algunos son offsets de estructuras que se pueden localizar en el código fuente de Dopamine, y otros se pueden encontrar ejecutando XPF. Sin embargo, hay tres offsets que no podemos encontrar antes de la explotación, y voy a explicar ahora cómo encontrarlos.
UniqueValues.addresses.base es la dirección física base del mapeo de memoria malicioso para Trigon. Una forma sencilla de encontrarla es usar el valor existente como dirección base estimada y luego leer una dirección física reconocible como 0x41410000. Después puedes restar el offset de la dirección física en el registro del panic para determinar la dirección base correcta del mapeo.
pv_head_table y pp_attr_tableUniqueValues.offsets.pv_head_table y UniqueValues.offsets.pp_attr_table son offsets relativos de las dos estructuras de datos del kernel respecto a la base física del kernel. Como se asignan tan temprano durante la inicialización del kernel, siempre están en el mismo offset exacto respecto a la base del kernel en memoria física. Para encontrarlos, puedes usar un exploit de kernel existente (como kfd) para localizar y traducir estas estructuras a la dirección física correcta, y luego calcular los offsets de esa forma.
Para los dispositivos que se pueden jailbreakear mediante Dopamine, he incluido una herramienta de línea de comandos fácil de usar que encontrará todos los offsets requeridos para Trigon en arm64e aquí. Puedes usarla para configurar el exploit y que funcione en tu combinación de dispositivo y versión.