L'azienda Qualys ha individuato una vulnerabilità (CVE-2021-4034) nel componente di sistema Polkit (precedentemente PolicyKit), utilizzato nelle distribuzioni per consentire a utenti non privilegiati di eseguire azioni che richiedono elevati diritti di accesso. La vulnerabilità consente a un utente locale non privilegiato di elevare i propri privilegi a quelli dell'utente root, ottenendo il pieno controllo del sistema. Il problema è stato soprannominato PwnKit ed è notevole per il fatto che è stato preparato un exploit funzionante con la configurazione predefinita nella maggior parte delle distribuzioni Linux.
Il problema si trova nell'utility pkexec, inclusa in PolKit, fornita con il flag SUID root e progettata per eseguire comandi con i privilegi di un altro utente secondo le regole stabilite di PolKit. A causa della gestione errata degli argomenti della riga di comando passati a pkexec, un utente non privilegiato potrebbe eludere l'autenticazione e far eseguire il proprio codice con i diritti di root, a prescindere dalle regole di accesso stabilite. Per l'attacco non importa quali configurazioni e restrizioni siano impostate in PolKit, è sufficiente che il file eseguibile dell'utility pkexec abbia il flag SUID root impostato.
Pkexec non controlla la correttezza del conteggio degli argomenti della riga di comando (argc) passati durante l'avvio di un processo. Gli sviluppatori di pkexec ritenevano che la prima voce dell'array argv contenesse sempre il nome del processo (pkexec) e la seconda sarebbe stata o NULL o il nome del comando da eseguire tramite pkexec. Poiché il conteggio degli argomenti non era verificato rispetto al contenuto effettivo dell'array e si presumeva fosse sempre maggiore di 1, nel caso venisse passato un array argv vuoto al processo, cosa consentita dalla funzione execve in Linux, pkexec interpretava NULL come il primo argomento (nome del processo) e la memoria successiva al di fuori del buffer come il contenuto successivo dell'array. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | … | argv[argc] | envp[0] | envp[1] | … | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| V V V V V V «program» «-option» NULL «value» «PATH=name» NULL
Il problema è che subito dopo l'array argv viene posizionato in memoria un array envp, che contiene le variabili d'ambiente. Così, con un array argv vuoto, pkexec estrae i dati del comando da eseguire con privilegi elevati dal primo elemento dell'array delle variabili d'ambiente (argv[1] diventa identico a envp[0]), il cui contenuto può essere controllato dall'attaccante.
Dopo aver ottenuto il valore di argv[1], pkexec cerca, tenendo conto dei percorsi dei file in PATH, di determinare il percorso completo del file eseguibile e di scrivere un puntatore alla stringa con il percorso completo di nuovo in argv[1], il che porta a sovrascrivere anche il valore della prima variabile d'ambiente, dato che argv[1] è identico a envp[0]. Tramite la manipolazione del nome della prima variabile d'ambiente, l'attaccante può sostituire un'altra variabile d'ambiente in pkexec, ad esempio sostituire la variabile d'ambiente "LD_PRELOAD", che non è consentita nei programmi suid, e organizzare il caricamento nel processo della sua libreria condivisa.
Nell'exploit in uso viene sostituita la variabile GCONV_PATH, che viene utilizzata per determinare il percorso della libreria di riconversione dei caratteri, caricata dinamicamente quando si chiama la funzione g_printerr(), nel cui codice si utilizza iconv_open(). Ridefinendo il percorso in GCONV_PATH, un attaccante può forzare il caricamento di una libreria iconv non autorizzata, ma la propria libreria, i cui gestori verranno eseguiti durante la visualizzazione di un messaggio di errore nella fase in cui pkexec è ancora in esecuzione con i diritti di root e prima della verifica delle autorizzazioni di esecuzione.
Si segnala che, nonostante il problema sia causato da un danneggiamento della memoria, può essere sfruttato in modo affidabile e ripetibile indipendentemente dall'architettura hardware utilizzata. L'exploit preparato è stato testato con successo su Ubuntu, Debian, Fedora e CentOS, ma può essere utilizzato anche su altre distribuzioni. L'exploit originale non è ancora disponibile pubblicamente, il che indica che è triviale e può essere facilmente ricreato da altri ricercatori; pertanto, è fondamentale installare al più presto l'aggiornamento correttivo sui sistemi multiutente. Polkit è disponibile anche per sistemi BSD e Solaris, ma non è stata condotta alcuna valutazione sulla possibilità di sfruttamento in questi sistemi. Si sa solo che l'attacco non può essere eseguito su OpenBSD, poiché il kernel di OpenBSD non consente la trasmissione di un valore nullo argc durante la chiamata execve().
Il problema è presente dal maggio 2009, da quando è stata aggiunta la funzione pkexec. La correzione della vulnerabilità in PolKit è attualmente disponibile come patch (una release correttiva non è stata formata), ma poiché gli sviluppatori delle distribuzioni sono stati avvisati in anticipo del problema, la maggior parte delle distribuzioni ha pubblicato un aggiornamento contemporaneamente alla divulgazione della vulnerabilità. Il problema è stato risolto in RHEL 6/7/8, Debian, Ubuntu, openSUSE, SUSE, Fedora, ALT Linux, ROSA, Gentoo, Void Linux, Arch Linux e Manjaro. Come misura temporanea per bloccare la vulnerabilità, è possibile rimuovere il flag SUID root dal programma /usr/bin/pkexec («chmod 0755 /usr/bin/pkexec»).
Fonte: opennet.ru
