
Preuve de concept pour CVE-2021-4034 (avec exploitation expérimentale sans traces)
pkwned : Preuve de concept pour CVE-2021-4034
Ce PoC exécutera PAYLOAD_PATH (tel que défini dans constants.h) avec les privilèges root à partir d'une version vulnérable de pkexec fonctionnant sur glibc. Le répertoire "GCONV_PATH=." doit contenir un fichier exécutable nommé d'après le répertoire contenant le module gconv.
Comme indiqué dans l'avis de Qualys [1], cela produira un message syslog. J'ai trouvé jusqu'à présent deux approches pour l'éviter :
641 if (access (path, F_OK) != 0) 642 { 643 g_printerr ("Error accessing %s: %s\n", path, g_strerror (errno)); 644 goto out; 645 }
Ce dépôt contient l'utilitaire gconv-fuse qui monte un système de fichiers FUSE sur "GCONV_PATH=.", qui apparaît vide après un appel de access("gconv", X_OK). Cela ne fonctionne que si l'option de configuration user_allow_other de FUSE est activée.
356 if (!g_file_get_contents ("/etc/shells", 357 &contents, 358 NULL, /* gsize *length */ 359 &error)) 360 { 361 g_printerr ("Error getting contents of /etc/shells: %s\n", error->message); 362 g_error_free (error); 363 goto out; 364 }
Les espaces de noms de montage peuvent être utilisés pour monter un fichier illisible par-dessus, mais cela nécessite également un espace de noms utilisateur, mappant un utilisateur non privilégié à root et rendant le bit setuid de pkexec inefficace (par exemple "unshare -r -u -m").
Notez que GLib a fusionné un correctif pour g_find_program_in_path (probablement pour les prochaines versions stables après v2.70.3 et v2.71.0) qui rendra cet exploit irréalisable en renvoyant toujours des chemins complets réels. [2]
[1] https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt [2] https://gitlab.gnome.org/GNOME/glib/-/commit/13ee46538f901a8eca8e7a4c167a8838ed0858d4