
Exploit Bluetooth RCE zero-click pour Android 8-9 (CVE-2020-0022) avec heap spraying, fuite d'adresse et exécution de chaîne JOP pour l'exécution de code à distance via la vulnérabilité BlueFrag.
Un grand merci à Insinuator pour leur excellent article de blog et code!
Toutes les étapes mentionnées dans l'article d'Insinuator ont été réalisées, et même plus. Ce sont beaucoup d'étapes à mettre dans un fichier README.md, alors n'hésitez pas à consulter l'article d'Insinuator mentionné ci-dessus.
L'exploit est entièrement complet jusqu'au point où :
Cet exploit diffère de l'implémentation d'Insinuator de les manières suivantes :
libandroid_runtime.so plutôt que dans libicuuc.so, car cela fonctionnait mieux sur ce téléphone/cibleexecv directement et l'autre qui appelle fork puis execvlibandroid_runtime.so et extrait les décalages des fonctions et des gadgets (pour faciliter le portage de l'exploit vers d'autres cibles)Ceci est une démo vidéo montrant l'exploit modifiant le PC pour pointer vers une adresse personnalisée :

La première itération de la chaîne est celle que l'on peut voir dans jop_experiment. Cette chaîne appelle execv directement sans appeler fork. Elle se trouve dans le commit ca28fdf. Voici ce qui se produit en utilisant cette chaîne :

La deuxième itération de la chaîne est celle qui appelle fork puis execv. Les détails complets de cette chaîne se trouvent ici. Voici ce qui se produit en utilisant cette chaîne :

Heureusement, le Pixel 3 XL dispose de protections qui empêchent le processus Bluetooth d'appeler fork et/ou execv. En termes de partage de connaissances ou de démonstration, mon travail ici est terminé. Si j'écris et partage quelque chose de plus avancé, cela pourrait être trop utile pour les black-hats.
Je considère cet exploit comme complet. Les améliorations futures pourraient être :
dlsym puis mprotect afin d'exécuter un shellcode personnaliséToutes ces choses transforment ce projet d'un projet amusant de partage de connaissances à un exploit black-hat qui peut être transformé en arme, donc c'est là que mon voyage s'arrête, pour l'instant... Si vous avez des questions, n'hésitez pas à me contacter.
Pour exécuter l'exploit, il suffit de lancer :
make build run ARGS="00:00:00:00:00:00"
Où 00:00:00:00:00:00 est l'adresse MAC du dispositif cible/victime. Mis à part make clean, le reste des cibles de build ne sont utiles que si vous essayez de modifier, améliorer ou réimplémenter l'exploit, donc il n'est pas nécessaire de les mentionner en détail.
gdbserver d'Android se trouve dans le dossier NDK# On target
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# On host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# On host
adb push ./gdbinit /data/local/tmp/gdbinit
# On target
su
/data/data/com.termux/files/usr/bin/gdb -q -x /data/local/tmp/gdbinit -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# OR
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
Vous pouvez redémarrer le service Bluetooth sur la machine de l'attaquant au cas où il cesserait de fonctionner :
sudo systemctl restart bluetooth.service
Cette section explique certains des phénomènes observés lors du développement de cet exploit :

base::MessageLoop utilisé via get_message_loop :
unordered_map partial_packets. Cela a été déterminé en utilisant map_experiment

