La vulnérabilité est liée à la variable d’environnement DYLD_PRINT_TO_FILE qui est en rapport avec l’éditeur de liens dynamiques dydl. Le paramétrage de cette variable d’environnement indique à dydl où conserver les messages d’erreur.
« Quand les garanties habituelles qui sont nécessaires lors de l’ajout d’un support pour de nouvelles variables d’environnement ont été ajoutées à cette variable, l’éditeur dynamique de lien n’a pas été utilisé. Par conséquent, il est possible d’utiliser cette fonctionnalité même avec des binaires SUID racine. C’est dangereux parce que cela permet d’ouvrir et de créer des fichiers arbitraires appartenant à l’utilisateur racine n’importe où dans le système de fichiers. En outre, le fichier de journalisation ouvert n’est jamais fermé et par conséquent son descripteur de fichier fait l’objet d’une fuite dans les processus engendrés par les binaires SUID. Ce qui signifie que les processus enfants des processus SUID racine peuvent écrire dans des fichiers arbitraires appartenant à l’utilisateur racine n’importe où dans le fichier système. Ce qui facilite une élévation des privilèges dans OS X 10.10.x ».
« Quand Apple a changé le code de l’éditeur de liens dynamiques pour OS X 10.10 afin qu’il prenne en charge la nouvelle variable d’environnement DYLD_PRINT_TO_FILE, ils ont ajouté le code suivant directement dans la fonction _main de dydl. Comme vous pouvez le constater, la valeur de la variable d’environnement est directement utilisée comme nom de fichier pour le fichier de journalisation ouvert ou créé ».
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | const char* loggingPath = _simple_getenv(envp, "DYLD_PRINT_TO_FILE"); if ( loggingPath != NULL ) { int fd = open(loggingPath, O_WRONLY | O_CREAT | O_APPEND, 0644); if ( fd != -1 ) { sLogfile = fd; sLogToFile = true; } else { dyld::log("dyld: could not open DYLD_PRINT_TO_FILE='%s', errno=%d\n", loggingPath, errno); } } |
Il a remarqué qu’Apple a corrigé cette vulnérabilité dans la bêta d’OS X 10.11 en enlevant tout simplement le code de cette nouvelle variable d’environnement de la fonction processDyldEnvironmentVariable(), ce qui a pour conséquence de protéger cette mouture. « Ceci pourrait cependant être le résultat d’un épurement du code et non la résultante d’une action de sécurité. Toutefois, s’il s’agit là du résultat d’un correctif de sécurité, alors Apple a une fois de plus montré combien il ne supporte pas ses versions courantes dès lors qu’une nouvelle bêta est en développement ».
Le chercheur en sécurité a publié une PoC (Proof of Concept) pour illustrer ses propos, donnant même une instruction à exécuter en ligne de commande pour tester si votre système est vulnérable à cette attaque.
Que le constructeur d’iPhone soit au courant de la faille et prépare un correctif ou non, le chercheur a pris les devants et publié sur GitHub le code source d’une extension noyau qui implémente des mesures de protection sous le nom SUIDGuard.
SUIDGuard (GitHub)
Source : SektionEins