
Exploit de kernel de iOS 14 para CVE-2021-30807 dirigido a IOMobileFramebuffer, con asignación de memoria ajustable para el desarrollo de jailbreak en dispositivos A11+.
El informe está aquí: https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
Exploit para CVE-2021-30807. Si realmente quieres construir un jailbreak a partir de él, requerirá ajustes para tu dispositivo y versión de iOS porque no tengo una fuga de información que usar para esto.
Para ajustar para A11 y anteriores, usa pongo para cargar xnuspy y compila con
SAMPLING_MEMORY=1 make -B. Esto habilitará una prueba que recopila
la memoria devuelta por kernel_memory_allocate, ordena esos punteros,
y luego escupe un rango. Verás algo como esto:
sample_kernel_map: 0xffffffe8ebe9c000 [0x10000 bytes from behind]
sample_kernel_map: to add to alloc_averager:
[0xffffffe8ce934000, 0xffffffe8ebf98000],
(solo ignora las advertencias que escupe)
La prueba está diseñada para ejecutarse 30 segundos después de que el dispositivo arranque.
Dentro de alloc_averager.py hay un par de muestras que ya ejecuté para
mis teléfonos. Toma el promedio de todos los promedios de cada rango.
Crea una "lista de muestras" para tu dispositivo y agrega el rango a ella.
Repite la prueba un par de veces hasta que tengas de 5 a 10 entradas en esa
lista. alloc_averager.py reportará una tasa de éxito para la estimación que
genera basándose en la lista. Si te gusta la tasa de éxito, toma la estimación
y reemplaza el valor de GUESSED_OSDATA_BUFFER_PTR al inicio de
con ella.
IOMobileFramebufferUserClient.cEs muy importante no incluir valores atípicos en esta lista. Después de ejecutar la prueba un par de veces, probablemente te encontrarás con un rango que se diferencie del resto de los rangos que ya tienes.
Necesitarás encontrar offsets para tu dispositivo/versión para ejecutar esta prueba.
Primero, para encontrar kernel_memory_allocate, simplemente haz xref a
kernel_memory_allocate: VM is not ready. Cuando tengas el offset,
establece el valor de kma dentro de install_kernel_memory_alloc_hook.
Segundo, para aislar la prueba de las otras asignaciones que hace XNU,
pruebo una dirección de retorno específica. Esa dirección está dentro de
OSData::initWithCapacity. Puedes encontrar fácilmente la vtable de OSData
haciendo xref a la cadena "OSData". La primera xref a esa cadena
estará en una función que tiene una xref a la vtable de OSData::MetaClass.
Justo encima de esa vtable está la vtable de OSData, y OSData::initWithCapacity
está en +0x78.
Una vez que tengas OSData::initWithCapacity, encuentra el único BL a
kernel_memory_allocate y toma el offset de la instrucción justo debajo de él.
Dentro de kernel_hooks.c, usa ese offset en la única sentencia if
de la única función en ese archivo.
A12+ necesitará usar algo como Correlium.