
Preuve de concept pour CVE-2020-27949, démontrant la lecture/écriture arbitraire en mémoire dans les processus macOS via l'ioctl DTrace fasttrap sans permissions élevées.
Le périphérique /dev/fasttrap pour créer des nœuds de trap dans les processus en espace utilisateur pour les providers pid et objc a les permissions 666. Contrairement à /dev/dtrace, qui est également 666, fasttrap n'a pas de vérification de permission. Cela permet à tout processus d'envoyer un ioctl FASTTRAPIOC_MAKEPROBE ou FASTTRAPIOC_GETINSTR.
Un attaquant peut créer des probes dans n'importe quel autre processus pour n'importe quel emplacement mémoire en utilisant FASTTRAPIOC_MAKEPROBE. Lors de l'activation de ces probes, les valeurs à l'emplacement mémoire spécifié sont remplacées par une instruction de trap (0xCC sur x86) et la valeur originale est placée dans une mémoire fantôme. La récupération de la valeur originale est possible avec l'ioctl FASTTRAPIOC_GETINSTR. Cela permet à l'attaquant de lire la mémoire arbitraire d'un autre processus en plaçant plusieurs traps.
Cette vulnérabilité est suivie sous le nom CVE-2020-27949, corrigée dans macOS Big Sur 11.1, Security Update 2020-001 Catalina, Security Update 2020-007 Mojave.
0xCC sur x86) à n'importe quel emplacement mémoire d'autres processus exécutés sous DTrace sans permissions élevées. Même l'écriture en mémoire vers des processus s'exécutant en tant que root est possible. En faisant partie d'autres instructions ou adresses de saut, le flux de contrôle de la victime peut être modifié, permettant une escalade des privilèges.En tant qu'utilisateur, je m'attends à ce que l'activation de DTrace n'autorise que les processus avec des permissions root à tracer, instrumenter ou modifier d'autres processus. DTrace est un outil précieux pour les tâches administratives offrant des outils comme dtruss, iotop, etc.
Notre victime (target) est un exécutable fonctionnant en tant que root. L'attaquant (memaccess) est un exécutable fonctionnant avec des permissions utilisateur normales. Le script de traçage libc_monitor.d enregistre le nombre d'appels aux fonctions dans l'objet partagé libsystem_c.dylib (ce n'est qu'un exemple simple d'un script administratif qu'un propriétaire de machine pourrait exécuter).
libc_monitor.d).FASTTRAPIOC_GETINSTR pour lire les valeurs mémoire des probes créées.L'étape 4 remplace la mémoire dans le processus victime par la valeur de l'instruction de trap. Selon l'application, un attaquant peut utiliser cela pour écrire une valeur précédemment connue à un emplacement mémoire critique. Par exemple, l'attaquant pourrait contrôler la graine d'un RNG ou remplacer des clés cryptographiques dans un processus.
Note : L'attaquant n'a jamais besoin de permissions élevées ou root.
Note 2 : Les scripts DTrace auto-écrits ne sont pas nécessaires. Par exemple, dapptrace utilise également le provider pid pour tracer n'importe quelle fonction.
Implémenter des vérifications de privilèges dans /dev/fasttrap comme dans /dev/dtrace ou supprimer la permission d'écriture mondiale.
Note : Nous n'avons pas vérifié le correctif publié.
target et suivez les instructions à l'écran