UnjailMe
Une évasion de sandbox basée sur :
- le proof-of-concept (CVE-2018-4087) par Rani Idan (Zimperium)
- le proof-of-concept de débordement de securityd par @cheesecakeufo (zeroday, aucun CVE connu, merci Abraham !)
À propos du PoC ZIMPERIUM
Rani a utilisé sbtool de Jonathan Levine pour découvrir quels services étaient accessibles pour la communication depuis l'intérieur du sandbox.
Il a ensuite trouvé davantage dans bluetoothd et a mis en place du code pour intercepter les messages provenant du service et à destination de celui-ci.
Ce faisant, il a découvert qu'il pouvait détourner la session de nombreux daemons et divulguer le port client.
De cette manière, il a constaté qu'il était possible d'ajouter un callback avec des données supplémentaires à la connexion du client à bluetoothd.
La conséquence est que le contrôle peut être obtenu sur le compteur de processus (callback) et le registre x3 (données supplémentaires) des daemons système dont un port client (session) est intercepté.
Offrant la possibilité de faire sortir une application sandboxée vers un contexte privilégié, lui permettant d'exécuter du code avec les privilèges système.
Apple a corrigé les vulnérabilités dans iOS 11.2.5 en utilisant un arc4random() pour l'identifiant de session.
Il ne semble plus possible d'obtenir le port d'un client, mais l'interception des sessions reste possible.
Il faut environ 5 jours pour bruteforcer cet arc4random() dans ce nouveau correctif (4.294.967.296 possibilités) et j'attends donc toujours un correctif définitif, car cela n'est pas considéré comme une solution au problème de sécurité.
Source : Blog Zimperium
À propos du PoC d'Abraham Masri
Pour autant que je sache, il s'agit d'un buffer overflow dans la communication avec securityd.
Cela se fait en fournissant un message XPC, qui est un message basé sur un dictionnaire de paires clé-valeur, avec une longueur invalide.
Le service reçoit le message et l'underflow se produit.
Abraham semble avoir trouvé un moyen de contrôler de nombreux registres du processeur, rendant possible l'exécution de code avec les droits système pour les applications tournant à l'intérieur du système.
Le PoC d'Abraham montre qu'Abraham essaie de créer lui-même un exploit pour cette vulnérabilité, car du code existe pour divulguer les adresses de base, ce qui est considéré comme le début de la création d'une chaîne ROP.
On ne sait pas si Abraham prévoit d'écrire cet exploit lui-même ou de nous indiquer la bonne direction.
Prérequis
- Un appareil iOS 64 bits fonctionnant sous iOS 10 jusqu'à 11.3.1
À propos de ce projet
- Ce projet n'est pas un jailbreak et ne contribuera pas à un jailbreak, car il n'opérera qu'en userland
- Ce projet ne peut pas et ne pourra jamais obtenir la capacité d'écrire sur le rootfilesystem, car celui-ci est monté en lecture seule, comme imposé par le noyau.
- Ce projet ne permettra pas facilement l'exécution de code arbitraire sous forme de bibliothèques dynamiques, comme le fait cydia substrate.
- Le projet a pour objectif principal d'élever une application conteneurisée en sandbox vers les droits système.
- AMFI impose que tous les binaires soient valablement signés, et ce projet ne peut pas patcher AMFI.
- Le projet vise à obtenir la permission de lecture et d'écriture sur la partition userdata (/var/root, /var/mobile).
- Le projet vise à obtenir l'accès au stockage protégé du trousseau de clés pour la récupération d'identifiants et à des fins forensiques.
- Le projet vise également à fournir des fonctionnalités de serveur pour exécuter du code en tant que root et pour le transfert de fichiers.
- Le projet était destiné à servir d'aide aux développeurs et aux chercheurs pour leurs contributions.
- Le projet facilitera la tâche des développeurs de jailbreak et des chercheurs en sécurité pour trouver des bugs dans les pilotes du noyau qui ne sont accessibles que depuis un contexte privilégié, ou des bugs en userland, en utilisant des techniques de fuzzing.
- Le projet facilitera la tâche des développeurs de tweaks de jailbreak pour rechercher les nouvelles fonctionnalités d'iOS 11 et déboguer le développement de tweaks sur un appareil réel.
- Ce projet se concentre principalement sur iOS 10 jusqu'à 11.2.5, mais peut en théorie prendre en charge 11.2.5 jusqu'à 11.3 inclus lorsque des exploits seront développés.
Capture d'écran
- L'application n'apporte aucune valeur au projet, mais sert de démonstration visuelle à ceux qui l'ont demandée (Beaucoup de personnes enthousiastes de la communauté l'ont demandée)
- L'application extraira des informations des bibliothèques et frameworks, y compris la mémoire, les informations mach-o et ses adresses de base, ce qui est utile pour le développement ROP.
- La logique de l'application peut prendre jusqu'à 15 minutes pour s'exécuter en raison des nombreux parsings et affichages ; cela ne sera pas le cas dans les versions finales.
- L'application n'apportera aucune valeur à votre iPhone ni ne modifiera le comportement du logiciel tel quel ; certains daemons peuvent planter, mais aucun dommage permanent n'est causé au système.
- Il est recommandé aux chercheurs d'exécuter ce projet dans Xcode à la place
DÉPANNAGE (pas nécessaire, mais juste au cas où)
- Supprimez l'application
- Désactivez le bluetooth
- Redémarrez
- Activez le bluetooth
- Désactivez le bluetooth
Fonctionnalités
- Accès FTP (sandboxé actuellement, non sandboxé à l'avenir)
- PoC visuel
- PoC par zerodium (Enfin légèrement amélioré, peut faire un appel à la fonction system())
- PoC par Abraham, qui devrait être capable d'exécuter du code arbitraire en tant que root, parfait pour ssh.
- PoC par Sem Voigtlander (DoS d'allocation d'espace d'adressage du noyau, pour la fonction de redémarrage de l'appareil).
Prévu
- Exploit complet incluant l'obtention du contrôle total sur l'espace d'adressage des autres daemons.
- Accès shell SSH distant (dropbear ou un dérivé).
Choses à considérer pour l'avenir
- Injection de code dans SpringBoardd (Bonjour les amateurs de jailbreak)
launchd (Pas possible car nous ne pouvons pas obtenir de session pour celui-ci).
Hypothèse (simple spéculation)
- Trouver un daemon avec des entitlements launchd / injecter des entitlements.
Injecter du code qui charge le framework BaseBoard
- Divulguer les adresses des bibliothèques dans le dyld_shared_cache.
- Trouver un ropgadget dans n'importe quelle bibliothèque du dyld_shared_cache.
- Appeler la chaîne ROP en définissant le callback et les données supplémentaires du callback.
- Utiliser la logique de rétro-ingénierie de BaseBoard pour faire exécuter à launchd amfid avec des arguments et l'aslr désactivé.
- patcher amfid
- Utiliser la logique de rétro-ingénierie de BaseBoard pour faire exécuter à afcd des arguments pour / et l'aslr désactivé. (comme afc2).
- Utiliser la logique de rétro-ingénierie de BaseBoard pour exécuter unjaild, un daemon qui peut être utilisé comme wrapper autour de launchd et qui gère les privilèges de tâches et l'injection de code
- obtenir un taskport sur launchd avec l'aslr désactivé en utilisant la logique de BaseBoard
À examiner
- Patchs AMFI (Pas facile, nous ne pouvons pas obtenir de sessions via amfi, mais nous pouvons peut-être élever les privilèges en utilisant d'autres daemons).
- Injection d'entitlements (Pas vraiment nécessaire, nous avons le contrôle sur tant de daemons que nous n'en avons pas besoin).
- Élever davantage les privilèges en utilisant des API privées (BaseBoard.framework peut lancer des processus avec l'ASLR désactivé avec les droits système) ???
- ressusciter et porter liblorgnette sur iOS (TERMINÉ)
Télécharger l'ipa
https://github.com/MTJailed/UnjailMe/releases/tag/0.1
Crédits
- Abraham (@cheesecakeufo) pour son zeroday securityd
- Vulnérabilité et PoC initial : Rani Idan (Zimperium) <3
- PureFTPd
- le projet liblorgnette (avec mes propres légères améliorations)
- NEWUI par @ringarang
Faire un don ou contribuer
- Le code source peut être fourni sur demande via DM sur Twitter (@MTJailed)
- Merci de faire un don, j'ai très peu de temps et de moyens pour travailler sur de tels projets ! (http://paypal.me/devsupport)
- Bientôt, le code source (sauf pour ftp) sera disponible ici sur GitHub.