
Prueba de concepto para CVE-2021-4034 (con explotación experimental sin rastros)
pkwned: Prueba de concepto para CVE-2021-4034
Este PoC ejecutará PAYLOAD_PATH (según se define en constants.h) con privilegios de root desde una versión vulnerable de pkexec que se ejecuta en glibc. El directorio "GCONV_PATH=." debe contener un archivo ejecutable que lleve el nombre del directorio que contiene el módulo gconv.
Como se describe en el aviso de Qualys [1], esto generará un mensaje de syslog. Hasta ahora he encontrado dos enfoques para evitarlo:
641 if (access (path, F_OK) != 0) 642 { 643 g_printerr ("Error accessing %s: %s\n", path, g_strerror (errno)); 644 goto out; 645 }
Este repositorio contiene la utilidad gconv-fuse que monta un sistema de archivos FUSE sobre "GCONV_PATH=.", que aparece vacío después de una llamada a access("gconv", X_OK). Solo funciona si la opción de configuración user_allow_other de FUSE está habilitada.
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 }
Se pueden usar espacios de nombres de montaje para montar un archivo ilegible sobre él, pero eso también requiere un espacio de nombres de usuario, que mapea a un usuario sin privilegios a root y hace ineficaz el bit setuid de pkexec (p. ej., "unshare -r -u -m").
Ten en cuenta que GLib ha incorporado una corrección para g_find_program_in_path (probablemente para las próximas versiones estables después de v2.70.3 y v2.71.0) que hará que este exploit sea inviable al devolver siempre rutas completas reales. [2]
[1] https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt [2] https://gitlab.gnome.org/GNOME/glib/-/commit/13ee46538f901a8eca8e7a4c167a8838ed0858d4