Vulnerabilità critica in PolKit che consente l'accesso root sulla maggior parte delle distribuzioni Linux

Qualys ha identificato una vulnerabilità (CVE-2021-4034) nel componente di sistema Polkit (precedentemente PolicyKit) utilizzato nelle distribuzioni per consentire agli utenti non privilegiati di eseguire azioni che richiedono diritti di accesso elevati. La vulnerabilità consente a un utente locale non privilegiato di aumentare i propri privilegi a root e ottenere il pieno controllo del sistema. Il problema aveva il nome in codice PwnKit ed è noto per aver prodotto un exploit funzionante che viene eseguito nella configurazione predefinita sulla maggior parte delle distribuzioni Linux.

Il problema è presente nell'utilità pkexec di PolKit, che viene fornita con il flag SUID root ed è progettata per eseguire comandi con i privilegi di un altro utente secondo le regole PolKit specificate. A causa della gestione errata degli argomenti della riga di comando passati a pkexec, un utente senza privilegi potrebbe ignorare l'autenticazione ed eseguire il proprio codice come root, indipendentemente dalle regole di accesso impostate. Per un attacco, non importa quali impostazioni e restrizioni siano specificate in PolKit, è sufficiente che l'attributo root SUID sia impostato per il file eseguibile con l'utilità pkexec.

Pkexec non controlla la validità del conteggio degli argomenti della riga di comando (argc) passati all'avvio di un processo. Gli sviluppatori di pkexec presuppongono che la prima voce nell'array argv contenga sempre il nome del processo (pkexec) e la seconda un valore NULL o il nome del comando lanciato tramite pkexec. Poiché il conteggio degli argomenti non veniva confrontato con il contenuto effettivo dell'array e si presumeva fosse sempre maggiore di 1, se a un processo veniva passato un array argv vuoto, come consentito dalla funzione execve di Linux, pkexec tratterebbe NULL come primo argomento ( il nome del processo) e quello successivo all'esterno della memoria buffer, come il successivo contenuto dell'array. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | envp[0] | envp[1] | ... | envp[envc] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "programma" "-opzione" NULL "valore" "PATH=nome" NULL

Il problema è che dopo l'array argv c'è un array envp in memoria contenente variabili di ambiente. Pertanto, se l'array argv è vuoto, pkexec estrae i dati sul comando eseguito con privilegi elevati dal primo elemento dell'array con variabili di ambiente (argv[1] è diventato identico a envp[0]), il cui contenuto può essere controllato dall'attaccante.

Dopo aver ricevuto il valore di argv[1], pkexec tenta, tenendo conto dei percorsi dei file in PATH, di determinare il percorso completo del file eseguibile e scrive un puntatore alla stringa con il percorso completo di ritorno ad argv[1], che porta a sovrascrivere il valore della prima variabile d'ambiente, poiché argv[ 1] è identico a envp[0]. Manipolando il nome della prima variabile d'ambiente, un utente malintenzionato 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 fare in modo che la propria libreria condivisa venga caricata nel file processi.

L'exploit funzionante prevede la sostituzione della variabile GCONV_PATH, che viene utilizzata per determinare il percorso della libreria di transcodifica dei simboli, caricata dinamicamente quando si chiama la funzione g_printerr(), il cui codice utilizza iconv_open(). Ridefinendo il percorso in GCONV_PATH, un utente malintenzionato può garantire che non venga caricata la libreria iconv standard, ma la propria libreria, i cui gestori verranno eseguiti quando viene visualizzato un messaggio di errore nella fase in cui pkexec è ancora in esecuzione con vengono controllati i diritti di root e le autorizzazioni prima dell'avvio.

Si noti che nonostante il problema sia causato dalla corruzione 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 al pubblico, il che significa che è banale e può essere facilmente ricreato da altri ricercatori, quindi è importante installare l'aggiornamento patch il prima possibile sui sistemi multiutente. Polkit è disponibile anche per sistemi BSD e Solaris, ma non è stato studiato per l'utilizzo su di essi. Ciò che è noto è che l'attacco non può essere effettuato su OpenBSD, poiché il kernel di OpenBSD non consente il passaggio di un valore argc nullo quando viene chiamato execve().

Il problema è presente da maggio 2009, da quando è stato aggiunto il comando pkexec. La correzione della vulnerabilità PolKit è attualmente disponibile come patch (non è stata rilasciata alcuna versione di patch), ma poiché gli sviluppatori della distribuzione sono stati informati del problema in anticipo, la maggior parte delle distribuzioni ha pubblicato l'aggiornamento contemporaneamente alla divulgazione delle informazioni sulla 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

Aggiungi un commento