
Voici mon implémentation simple d'un exploit pour la vulnérabilité PwnKit.
Remarque: Ce dépôt et son contenu font partie d'un travail de fin d'études (GrAL), créés uniquement à des fins pédagogiques et de recherche académique.
Ce dépôt contient une preuve de concept (PoC - Proof of Concept) pour la vulnérabilité CVE-2021-4034 (également connue sous le nom de PwnKit). Cette vulnérabilité de corruption de mémoire affecte le composant pkexec de Polkit sur les systèmes Linux. En exécutant pkexec avec une liste d'arguments vide (argc == 0), les variables d'environnement peuvent être manipulées pour forcer le chargement d'une bibliothèque partagée arbitraire, obtenant ainsi une élévation locale de privilèges.
Ci-dessous sont décrites les étapes à suivre pour préparer l'environnement d'exécution afin d'exploiter la faille. Ce processus détaille comment l'erreur de lecture/écriture en mémoire de pkexec est exploitée :
gconv)Cet exploit abuse de la manière dont GLib gère la conversion de caractères lorsqu'il tente d'imprimer un message d'erreur. Pour ce faire, la première étape consiste à créer une structure de répertoire spécifique qui servira de référentiel local pour les modules de conversion GCONV de GLib.
La clé de la vulnérabilité consiste à injecter la variable d'environnement GCONV_PATH, en exploitant l'écriture hors limites provoquée par l'état argc == 0 de pkexec. De cette manière, le programme est forcé d'utiliser un jeu de caractères anormal, ce qui indique à GLib qu'il doit rechercher les modules de conversion de caractères dans le répertoire contrôlé créé à l'étape précédente.
.so)Pour exécuter notre code, une bibliothèque partagée (shared object ou .so) doit être compilée. Lorsque pkexec tente de traiter un jeu de caractères qu'il ne peut pas trouver, il chargera cette bibliothèque depuis notre faux répertoire gconv. Comme pkexec est un binaire avec le bit SUID activé (il s'exécute en tant que root), le chargement de cette bibliothèque permettra à notre code d'obtenir les privilèges root, prenant ainsi le contrôle total du système (par exemple, en ouvrant un shell root).
gconv-modulesEnfin, un fichier de configuration nommé gconv-modules doit être créé dans ce répertoire local. Ce fichier agit comme un index : il indique à GLib quelle bibliothèque spécifique (.so) charger pour effectuer la conversion du jeu de caractères spécifique demandé. Ce fichier relie la conversion demandée par pkexec à la bibliothèque partagée créée à l'étape 3.
Le projet contient un Makefile pour automatiser la compilation du binaire C et le nettoyage de l'environnement.
Pour compiler le projet : $ make
Pour nettoyer les fichiers générés (fichiers temporaires, dossiers et binaires) : $ make clean