C'est ici que je posterai des analyses d'exploits publics, ou certains de mes exploits 1day.
[ Analyse d'exploits publics ]
Personnellement, je pense que la meilleure façon d'apprendre un exploit public est de le comprendre ligne par ligne jusqu'à ce que je puisse saisir l'exploit dans sa totalité. Je posterai certains de ces exploits (surchargés de commentaires ;) ) afin que d'autres puissent peut-être en apprendre, et comme tentative de redonner quelque chose à la communauté. Aussi à des fins de documentation, car ces choses s'estompent de ma mémoire avec le temps.
Cet exploit écrase un pointeur d'objet dans un autre objet. Il utilise une attaque ret2dir pour faire pointer le pointeur corrompu vers une adresse fixe prédictible dans le noyau qui contient la charge utile de l'exploit. Cette technique d'exploit contourne PXN et PAN.
Cet exploit efface 16 octets d'un objet global utile, situé à une adresse fixe dans le noyau.
Un pointeur d'objet corrompu au sein de l'objet global référence la charge utile de l'exploit depuis l'espace utilisateur. Ce type d'attaque ne fonctionne pas sur les appareils/noyaux avec PAN (ou émulation de PAN).
extra_recipe
Ma tentative de comprendre le jailbreak extra_recipe
J'étais particulièrement intéressé par la partie contournement de kpp. Bien qu'il y ait eu quelques diapositives sur le sujet où je pouvais entrevoir une vague image du contournement, je voulais vraiment creuser les détails fins et voir ce qui se passe réellement dans le code
Je voulais aussi comprendre les ingrédients finaux d'un jailbreak (installation de Cydia, etc.)
yalu102 (ViewController.m)
J'ai commenté la partie pertinente au bug réel, et comment il a été exploité.
La raison pour laquelle je me suis penché sur yalu102 plutôt que sur l'exploit original est que la technique de port-feng-shui semblait plus propre et plus simple à comprendre.
L'analyse s'arrête juste avant le contournement de kpp
extra_recipe-master de xerub (jailbreak.c, unjail.m, patchfinder64.c, pte_stuff.h)
Je passe ici car il y avait un peu plus d'informations sur les différents décalages numériques.
En outre, le patchfinder.c est intact, contrairement à yalu102 où il n'y a qu'un fichier objet.
La partie cydia est en quelque sorte incomplète, donc je passe à la branche cydia après kpp
extra_recipe-cydia de xerub (unjail.m)
Essayer de comprendre les ingrédients d'un jailbreak après tfp0 et la post-exploitation
Il utilise des techniques étonnantes pour partir de primitives vraiment faibles, construire un AAR plus fort, et enfin bâtir un task port à part entière. La magie des ports derrière le code de l'exploit est incroyable. Tout cela avec un débordement de tas de 8 octets NULL. Absolument époustouflant.
J'ai griffonné quelques idées naïves pour améliorer la fiabilité. Espérons que quelqu'un publiera une version plus fiable de l'exploit à l'avenir. :)
Un immense merci à kudima(@begger_dd) pour l'article très clair et concis, minutieusement annoté ! :)
L'article explique le bug de type confusion JIT, certaines limitations sur les conversions de boxing/unboxing (qui pourraient introduire de l'irréliabilité), et une procédure détaillée de la façon dont les primitives AAR/AAW précoces/tardives sont construites. Il donne également un aperçu des changements dans les techniques d'exploitation après la dernière série de mitigations (masquage d'index, empoisonnement du stockage de sauvegarde d'ArrayBuffer, certains changements dans le mécanisme du JIT W^X, changements dans la structure JSObject, etc.)
jsc_ConcatMemcpy_infoleak
Ceci est une version commentée de l'exploit WebKit infoleak de kudima (corrigé le 27.08.2018).
Il provient d'un correctif incomplet de l'un des bugs signalés par lokihardt. Le correctif du rapport de lokihardt a réglé la primitive de type confusion Double -> Object, mais ne l'a pas réglée dans l'autre sens ; Object -> Double.
Il arrose le tas de webkit avec des butterflies contenant un seul objet et un marqueur, puis déclenche le bug concat et remplit une grande partie de plusieurs tableaux de doubles avec des données de tas non initialisées. Il parcourt les tableaux de doubles non initialisés produits par le bug concat jusqu'à ce qu'il trouve l'adresse de l'objet précédemment arrosé, et la fuit.
Encore merci kudima(@begger_dd) pour le bel exploit et l'article ! :)
jsc_prop_enum_uaf
Ceci est une autre contribution de kudima. Il s'agit d'une version commentée de l'exploit WebKit d'exécution de code à distance de kudima (corrigé dans ce commit). Il est corrigé dans iOS 12.1, et fonctionne jusqu'à iOS 12.0.1.
Le problème est que lors de l'exécution de code dans les boucles forin compilées en baseline-jit, on peut introduire du code qui libère l'objet StructureID soutenant le JSOBject et déclencher le ramasse-miettes, mais le ramasse-miettes ne marque pas le membre « JSPropertyNameEnumerator->m_cachedStructureID », et l'objet StructureID vers lequel pointe « JSPropertyNameEnumerator->m_cachedStructureID » est libéré pendant la phase de balayage, ce qui donne un pointeur pendant.
Après la libération de l'objet StructureID par le GC, on peut introduire du code qui crée un nouvel objet StructureID, lequel prend la place de l'« objet StructureID » précédemment libéré.
En libérant le StructureID de l'objet A, puis en faisant en sorte que l'objet B crée un nouveau StructureID qui prend sa place, il est possible de créer une situation de type confusion car « JSPropertyNameEnumerator->m_cachedInlineCapacity » est défini à la taille des propriétés inline de l'objet A, tandis que « JSPropertyNameEnumerator->m_cachedStructureID » pointe vers le nouvel objet Structure ID qui représente l'objet B. Cela permet de faire passer une vérification dans 'op_get_direct_pname' et laisse l'objet B accéder à des propriétés inline hors de ses limites.
Cela peut être abusé pour construire des primitives plus fortes telles que AAR/AAW, et utiliser cela pour exécuter du code arbitraire.
Merci kudima(@begger_dd) pour l'exploit cool et l'article très détaillé ! :)
[ 1Day ]
CVE-2017-2547
Un jour, j'ai regardé l'exploit de singi après sa présentation à Zer0con 2018, et j'ai décidé de l'améliorer.
Ceci est une version autonome de l'exploit, avant de l'intégrer dans pwnjs.
Les améliorations incluent
Une fiabilité accrue (fonctionne parfaitement après de longues sessions de navigation avec une mémoire contaminée)
Suppression de tous les décalages codés en dur pour le rendre compatible avec diverses versions de navigateurs
Utilisation d'une technique d'exploitation différente (la technique standard de désalignement)
Intégration éventuelle dans le framework pwnjs en créant un prototype webkit
Rendu du code beaucoup plus lisible, et ajout de nombreux commentaires
Remerciements particuliers
qwertyoruiop & Samuel Grob pour l'incroyable article phrack et les exploits publics
Brian Pak & Andrew Wesie pour l'excellent framework pwnjs !