
J'ai analysé la vulnérabilité communément appelée Pwnkit à des fins pédagogiques et j'ai écrit un PoC pour celle-ci. À utiliser strictement à des fins pédagogiques.
AVERTISSEMENT : Ce contenu est fourni à des fins exclusivement éducatives. L'utilisation de l'exploit sans le consentement écrit du propriétaire du système cible est contraire à l'éthique et peut faire l'objet de poursuites légales.
chmod +x build.sh../build.sh../mls_envp. Vous obtiendrez un accès root.Dans la version vulnérable de polkit (0.105), l'auteur, David Zeuthen, supposait que pkexec serait toujours invoqué depuis une console. Il partait du principe que argc (le nombre d'arguments) serait toujours supérieur à 1, puisque argv[0] correspond au nom du programme lui-même. Or, pkexec peut être invoqué via l'appel système execve en transmettant un tableau d'arguments vide. La logique du programme s'en trouve alors brisée.
Le code de pkexec présuppose de manière rigide que argv contient au moins un élément. Lorsque argc vaut 0, le programme tente malgré tout d'accéder à argv[1]. Cela provoque un dépassement des limites du tableau argv et la lecture du premier élément du tableau envp (les variables d'environnement). Dans notre cas, celui-ci contient la chaîne "exp_exe".
pkexec tente de localiser le programme exp_exe à l'aide de la fonction g_find_program_in_path. Pour cette recherche, elle utilise la variable PATH. Nous remplaçons PATH par GCONV_PATH=.. Ainsi, pkexec trouve le fichier factice exp_exe dans notre dossier local et renvoie le chemin GCONV_PATH=./exp_exe. En raison du bug lié à argc, ce chemin est réécrit dans envp[0], ce qui « légitime » la variable GCONV_PATH.
Avant de lancer le programme, pkexec vérifie les variables d'environnement (y compris SHELL). Nous transmettons un shell inexistant (SHELL=xyz) afin de provoquer une erreur. Lors de l'affichage de l'erreur, log_message est appelée, laquelle utilise les mécanismes de glibc. Glibc consulte la variable CHARSET=bohemcavanna et, ne trouvant pas de convertisseur standard, se tourne vers le répertoire indiqué par GCONV_PATH (que nous avons fourni). Elle y lit le fichier gconv-modules, charge notre bibliothèque exploit.so et exécute le code qu'elle contient avec les privilèges root.