
Ho analizzato la vulnerabilità comunemente nota come Pwnkit a scopo didattico e ho scritto un PoC per essa. Da utilizzare rigorosamente a scopo didattico
DISCLAIMER: Questo materiale è fornito esclusivamente a scopo educativo. L'utilizzo dell'exploit senza il consenso scritto del proprietario del sistema di destinazione è non etico e può essere perseguito per legge.
chmod +x build.sh../build.sh../mls_envp. Si otterrà l'accesso root.Nella versione vulnerabile di polkit (0.105), l'autore, David Zeuthen, presumeva che pkexec venisse sempre invocato dalla console. Partiva dal presupposto che argc (il numero di argomenti) fosse sempre maggiore di 1, poiché argv[0] è il nome del programma stesso. Tuttavia, pkexec può essere invocato tramite la chiamata di sistema execve, passando un array di argomenti vuoto. A causa di ciò, la logica del programma si rompe.
Nel codice di pkexec è rigidamente codificata l'aspettativa che argv contenga almeno un elemento. Quando argc è uguale a 0, il programma tenta comunque di accedere a argv[1]. Ciò provoca un accesso fuori dai limiti dell'array argv e la lettura del primo elemento dell'array envp (le variabili d'ambiente). Nel nostro caso, lì si trova la stringa "exp_exe".
pkexec tenta di trovare il programma exp_exe tramite la funzione g_find_program_in_path. Per la ricerca utilizza la variabile PATH. Sostituiamo PATH con GCONV_PATH=.. Di conseguenza, pkexec trova il file fittizio exp_exe nella nostra cartella locale e restituisce il percorso GCONV_PATH=./exp_exe. A causa del bug con argc, questo percorso viene riscritto in envp[0], "legalizzando" la variabile GCONV_PATH.
Prima di avviare il programma, pkexec controlla le variabili d'ambiente (inclusa SHELL). Passiamo una shell inesistente (SHELL=xyz) per provocare un errore. Durante la visualizzazione dell'errore viene chiamata log_message, che utilizza i meccanismi di glibc. Glibc esamina la variabile CHARSET=bohemcavanna e, non trovando un convertitore standard, accede alla directory indicata in GCONV_PATH (quella che abbiamo inserito). Lì legge il file gconv-modules, carica la nostra libreria exploit.so ed esegue il codice al suo interno con privilegi root.