macOS PID Reuse
Last updated
Last updated
Lorsqu'un service XPC macOS vérifie le processus appelé en fonction du PID et non du jeton d'audit, il est vulnérable à une attaque de réutilisation de PID. Cette attaque est basée sur une condition de course où une exploitation va envoyer des messages au service XPC en abusant de la fonctionnalité et juste après, exécuter posix_spawn(NULL, binaire_cible, NULL, &attr, argv_cible, environ)
avec le binaire autorisé.
Cette fonction fera en sorte que le binaire autorisé possède le PID, mais le message XPC malveillant aura été envoyé juste avant. Ainsi, si le service XPC utilise le PID pour authentifier l'expéditeur et le vérifie APRÈS l'exécution de posix_spawn
, il pensera qu'il provient d'un processus autorisé.
Si vous trouvez la fonction shouldAcceptNewConnection
ou une fonction appelée par celle-ci appelant processIdentifier
et ne faisant pas appel à auditToken
, il est très probable qu'elle vérifie le PID du processus et non le jeton d'audit.
Comme par exemple dans cette image (prise de la référence) :
Vérifiez cet exemple d'exploitation (encore une fois, tiré de la référence) pour voir les 2 parties de l'exploit :
Une qui génère plusieurs forks
Chaque fork enverra la charge utile au service XPC tout en exécutant posix_spawn
juste après l'envoi du message.
Pour que l'exploit fonctionne, il est important d'exporter
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES
ou de le mettre à l'intérieur de l'exploit :
Première option utilisant NSTasks
et l'argument pour lancer les enfants pour exploiter le RC