
Prova de Conceito para CVE-2021-4034 (com exploração experimental sem rastros)
pkwned: Prova de Conceito para CVE-2021-4034
Este PoC executará PAYLOAD_PATH (conforme definido em constants.h) com privilégios de root a partir de uma versão vulnerável do pkexec rodando em glibc. O diretório "GCONV_PATH=." precisa conter um arquivo executável com o nome do diretório que contém o módulo gconv.
Conforme descrito no advisory da Qualys [1], isso produzirá uma mensagem de syslog. Até agora, encontrei duas abordagens para evitar isso:
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 repositório contém o utilitário gconv-fuse que monta um sistema de arquivos FUSE sobre "GCONV_PATH=.", que parece vazio após uma chamada de access("gconv", X_OK). Ele só funciona se a opção de configuração user_allow_other do FUSE estiver 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 }
Namespaces de montagem podem ser usados para montar um arquivo ilegível sobre ele, mas isso também requer um namespace de usuário, mapeando um usuário sem privilégios para root e tornando o bit setuid do pkexec ineficaz (por exemplo, "unshare -r -u -m").
Observe que o GLib incorporou uma correção para g_find_program_in_path (provavelmente nas próximas versões estáveis após v2.70.3 e v2.71.0) que tornará este exploit inviável ao sempre retornar caminhos completos reais. [2]
[1] https://www.qualys.com/2022/01/25/cve-2021-4034/pwnkit.txt [2] https://gitlab.gnome.org/GNOME/glib/-/commit/13ee46538f901a8eca8e7a4c167a8838ed0858d4