Una vulnerabilità critica in PolKit consente di ottenere accesso root nella maggior parte delle distribuzioni Linux

L'azienda Qualys ha identificato una vulnerabilità (CVE-2021-4034) nel componente di sistema Polkit (ex PolicyKit), utilizzato nelle distribuzioni per consentire agli utenti senza privilegi di eseguire azioni che richiedono diritti di accesso elevati. La vulnerabilità consente a un utente locale non privilegiato di elevare i propri diritti a quelli dell'utente root e ottenere il pieno controllo sul sistema. Il problema è stato soprannominato PwnKit ed è notevole per la preparazione di un exploit funzionante in configurazione predefinita nella maggior parte delle distribuzioni Linux.

Il problema si presenta nell'utility pkexec, inclusa in PolKit, fornita con il flag SUID root e destinata all'esecuzione di comandi con privilegi di un altro utente, in base alle regole stabilite da PolKit. A causa di una gestione errata degli argomenti della riga di comando passati a pkexec, un utente non privilegiato poteva superare l'autenticazione e fare in modo che il proprio codice fosse eseguito con diritti root, indipendentemente dalle regole di accesso stabilite. Non importa quali impostazioni e restrizioni siano state configurate in PolKit, è sufficiente che l'utility pkexec abbia il flag SUID root.

Pkexec non controlla la correttezza del contatore degli argomenti della riga di comando (argc) passati all'avvio del processo. Gli sviluppatori di pkexec presumevano che la prima voce dell'array argv contenesse sempre il nome del processo (pkexec), e la seconda fosse null oppure il nome del comando da eseguire tramite pkexec. Poiché il contatore degli argomenti non veniva verificato rispetto al contenuto effettivo dell'array e si assumeva che fosse sempre maggiore di 1, nel caso venisse passato un array argv vuoto al processo, consentito dalla funzione execve in Linux, pkexec trattava null come primo argomento (nome del processo), e la memoria successiva al di fuori del buffer come contenuto successivo dell'array.

Il problema è che subito dopo l'array argv in memoria si trova l'array envp, che contiene le variabili d'ambiente. Pertanto, con un array argv vuoto, pkexec estrae i dati riguardanti il comando eseguito con privilegi elevati dal primo elemento dell'array delle variabili d'ambiente (argv[1] diventava identico a envp[0]), il cui contenuto può essere controllato dall'attaccante.

Ottenuto il valore di argv[1], pkexec cerca di determinare il percorso completo del file eseguibile tenendo conto dei percorsi dei file in PATH e di scrivere il puntatore alla stringa con il percorso completo di nuovo in argv[1], il che porta alla sovrascrittura anche del valore della prima variabile d'ambiente, poiché argv[1] è identico a envp[0]. Attraverso la manipolazione del nome della prima variabile d'ambiente, l'attaccante può sostituire un'altra variabile d'ambiente in pkexec, ad esempio, inserire la variabile d'ambiente "LD_PRELOAD", che non è consentita nei programmi suid, e organizzare il caricamento della propria libreria condivisa nel processo.

Nel payload funzionante viene utilizzata la variabile GCONV_PATH, che serve a determinare il percorso della libreria di codifica dei caratteri, caricata dinamicamente durante la chiamata della funzione g_printerr(), nel cui codice viene utilizzato iconv_open(). Ridefinendo il percorso in GCONV_PATH, l'attaccante può ottenere il caricamento di una libreria iconv non standard, la cui gestione sarà eseguita durante la restituzione di un messaggio di errore, mentre pkexec è ancora in esecuzione con i diritti di root e prima della verifica dei privilegi di avvio.

Si segnala che, nonostante il problema sia causato da un danneggiamento della memoria, esso 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 suggerisce che sia banale e possa essere facilmente ricreato da altri ricercatori; pertanto, è importante installare l'aggiornamento corretto il prima possibile su sistemi multiutente. Polkit è inoltre disponibile per sistemi BSD e Solaris, ma non è stata condotta un'analisi della possibilità di sfruttamento su di essi. Si sa solo che l'attacco non può essere effettuato su OpenBSD, poiché il kernel di OpenBSD non consente il passaggio di un valore nullo a argc durante la chiamata a execve().

Il problema è presente dal maggio 2009, dall'introduzione del comando pkexec. La correzione della vulnerabilità in PolKit è attualmente disponibile sotto forma di patch (non è stata rilasciata una nuova versione correttiva), ma poiché gli sviluppatori delle distribuzioni sono stati avvertiti in anticipo del problema, la maggior parte delle distribuzioni ha pubblicato un aggiornamento contestualmente 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
Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster