
Exploit del kernel per iOS 14 per CVE-2021-30807 che colpisce IOMobileFramebuffer, con allocazione di memoria regolabile per lo sviluppo di jailbreak su dispositivi A11+.
Il write-up è qui: https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
Exploit per CVE-2021-30807. Se vuoi davvero costruirci un jailbreak, richiederà messa a punto per il tuo dispositivo e versione di iOS perché non ho un info leak da usare per questo.
Per sintonizzarsi per A11 e inferiori, usa pongo per caricare xnuspy e compila con SAMPLING_MEMORY=1 make -B. Questo abiliterà un test che raccoglie la memoria restituita da kernel_memory_allocate, ordina quei puntatori, poi restituisce un intervallo. Vedrai qualcosa del genere:
sample_kernel_map: 0xffffffe8ebe9c000 [0x10000 bytes da dietro]
sample_kernel_map: da aggiungere a alloc_averager:
[0xffffffe8ce934000, 0xffffffe8ebf98000],
(ignora semplicemente gli avvisi che produce)
Il test è pensato per essere eseguito 30 secondi dopo l'avvio del dispositivo.
All'interno di alloc_averager.py ci sono un paio di campioni che ho già eseguito per i miei telefoni. Prende la media di tutte le medie di ciascun intervallo. Crea una "lista di campioni" per il tuo dispositivo e aggiungi l'intervallo ad essa. Ripeti il test un paio di volte finché non hai 5-10 voci in quella lista. alloc_averager.py riporterà un tasso di successo per la stima che genera in base alla lista. Se ti piace il tasso di successo, prendi la stima e sostituisci con essa il valore di GUESSED_OSDATA_BUFFER_PTR all'inizio di .
IOMobileFramebufferUserClient.cÈ molto importante non includere valori anomali in questa lista. Dopo aver eseguito il test un paio di volte, probabilmente ti imbatterai in un intervallo che si distingue dal resto degli intervalli che hai già.
Dovrai trovare gli offset per il tuo dispositivo/versione per eseguire questo test.
Prima, per trovare kernel_memory_allocate, semplicemente incrocia kernel_memory_allocate: VM is not ready. Quando hai l'offset, imposta il valore di kma su di esso all'interno di install_kernel_memory_alloc_hook.
Secondo, per isolare il test dalle altre allocazioni che XNU fa, testo per un indirizzo di ritorno specifico. Quell'indirizzo è all'interno di OSData::initWithCapacity. Puoi trovare facilmente la vtable di OSData incrociando la stringa "OSData". Il primo incrocio a quella stringa sarà in una funzione che ha un incrocio alla vtable per OSData::MetaClass. Subito sopra quella vtable c'è la vtable di OSData, e OSData::initWithCapacity è a +0x78.
Una volta ottenuto OSData::initWithCapacity, trova l'unico BL a kernel_memory_allocate e prendi l'offset dell'istruzione subito sotto di esso. Dentro kernel_hooks.c, usa quell'offset nell'unico if statement nell'unica funzione in quel file.
A12+ dovrà usare qualcosa come Correlium.