
Prova di concetto per CVE-2021-4034 (con sfruttamento sperimentale senza tracce)
pkwned: Proof of Concept per CVE-2021-4034
Questo PoC eseguirà PAYLOAD_PATH (come definito in constants.h) con privilegi di root da una versione vulnerabile di pkexec in esecuzione su glibc. La directory "GCONV_PATH=." deve contenere un file eseguibile che prende il nome dalla directory che contiene il modulo gconv.
Come indicato nell'advisory di Qualys [1], questo produrrà un messaggio syslog. Finora ho trovato due approcci per prevenirlo:
641 if (access (path, F_OK) != 0) 642 { 643 g_printerr ("Error accessing %s: %s\n", path, g_strerror (errno)); 644 goto out; 645 }
Questo repository contiene l'utility gconv-fuse che monta un filesystem FUSE su "GCONV_PATH=.", che appare vuoto dopo una chiamata di access("gconv", X_OK). Funziona solo se l'opzione di configurazione FUSE user_allow_other è abilitata.
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 }
I mount namespace possono essere usati per montare un file illeggibile sopra di esso, ma ciò richiede anche un user namespace, mappando un utente non privilegiato a root e rendendo inefficace il bit setuid di pkexec (ad es. "unshare -r -u -m").
Nota che GLib ha integrato una correzione per g_find_program_in_path (probabilmente per le prossime versioni stabili dopo v2.70.3 e v2.71.0) che renderà questo exploit impraticabile restituendo sempre percorsi completi reali. [2]
[1] https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt [2] https://gitlab.gnome.org/GNOME/glib/-/commit/13ee46538f901a8eca8e7a4c167a8838ed0858d4