
Exploit de noyau iOS 14 pour CVE-2021-30807 ciblant IOMobileFramebuffer, avec allocation mémoire réglable pour le développement de jailbreak sur les appareils A11+.
Le compte-rendu est ici : https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html
Exploit pour CVE-2021-30807. Si vous voulez vraiment construire un jailbreak avec, il nécessitera un réglage pour votre appareil et votre version iOS car je n'ai pas de fuite d'informations à utiliser pour cela.
Pour le réglage pour A11 et inférieurs, utilisez pongo pour charger xnuspy et compilez avec SAMPLING_MEMORY=1 make -B. Cela activera un test qui collecte la mémoire renvoyée par kernel_memory_allocate, trie ces pointeurs, puis affiche une plage. Vous verrez quelque chose comme ceci :
sample_kernel_map: 0xffffffe8ebe9c000 [0x10000 bytes from behind]
sample_kernel_map: to add to alloc_averager:
[0xffffffe8ce934000, 0xffffffe8ebf98000],
(ignorez simplement les avertissements qu'il affiche)
Le test est censé être exécuté 30 secondes après le démarrage de l'appareil.
À l'intérieur de alloc_averager.py se trouvent quelques échantillons que j'ai déjà exécutés pour mes téléphones. Il prend la moyenne de toutes les moyennes de chaque plage. Créez une "liste d'échantillons" pour votre appareil et ajoutez-y la plage. Répétez le test plusieurs fois jusqu'à avoir 5 à 10 entrées dans cette liste. alloc_averager.py rapportera un taux de succès pour l'estimation qu'il génère à partir de la liste. Si vous aimez le taux de succès, prenez l'estimation et remplacez la valeur de en haut de par celle-ci.
GUESSED_OSDATA_BUFFER_PTRIOMobileFramebufferUserClient.cIl est très important de ne pas inclure de valeurs aberrantes dans cette liste. Après avoir exécuté le test plusieurs fois, vous rencontrerez probablement une plage qui se démarque des autres plages que vous avez déjà.
Vous devrez trouver des offsets pour votre appareil/version pour exécuter ce test.
D'abord, pour trouver kernel_memory_allocate, faites simplement une référence croisée à kernel_memory_allocate: VM is not ready. Lorsque vous avez l'offset, définissez la valeur de kma sur celui-ci à l'intérieur de install_kernel_memory_alloc_hook.
Deuxièmement, pour isoler le test des autres allocations que XNU effectue, je teste une adresse de retour spécifique. Cette adresse se trouve à l'intérieur de OSData::initWithCapacity. Vous pouvez facilement trouver la vtable d'OSData en faisant une référence croisée à la chaîne "OSData". La première référence croisée à cette chaîne sera dans une fonction qui a une référence croisée à la vtable pour OSData::MetaClass. Juste au-dessus de cette vtable se trouve la vtable d'OSData, et OSData::initWithCapacity est à +0x78.
Une fois que vous avez OSData::initWithCapacity, trouvez le seul BL vers kernel_memory_allocate et prenez l'offset de l'instruction juste en dessous. À l'intérieur de kernel_hooks.c, utilisez cet offset dans la seule instruction if de la seule fonction de ce fichier.
A12+ devra utiliser quelque chose comme Correlium.