Premere il tasto Backspace 28 volte: questo è quanto basta per ottenere l’accesso ad un computer protetto da password su cui è installata una distribuzione Linux “fallata”. Un gruppo di ricercatori dell’Università di Velencia ha infatti scoperto un pericoloso bug nel bootloader Grub2, incorporato in alcune delle più popolari distribuzioni Linux (Ubuntu, Debian, Red Hat), che se opportunamente sfruttato, offre un’accesso senza autenticazione molto “user friendly”.
Il potenziale hacker, una volta raggiunta la pagina di login, dovrà selezionare il campo “username” o “password” e invece di completare i campi dovrà spingere ripetutamente il tasto Backspace per 28 volte e poi premere Invio. Questo attiverà la “rescue mode” di Grab2 (apparirà la schermata mostrata a fondo articolo), da cui sarà possibile autenticarsi senza credenziali al sistema, avviare il sistema da un disco esterno, accedere a tutti i file del sistema, copiarli o eliminarli.
La vulnerabilità è presente dalla versione 1.98 di Grub2 rilasciata nel dicembre 2009 fino alla versione 2.02 resa recentemente disponibile.Linux è da sempre considerata una delle piattaforme più sicure in circolazione ma forse l’attenzione crescente agli attacchi via internet ha distolto gli sviluppatori dai cosiddetti “insider attack”, gli attacchi perpetrati da hacker che hanno accesso fisico al terminale.
La buona notizie è che la comunità di sviluppatori dietro le distribuzioni Linux interessate ha già prodotto degli aggiornamenti beta per sanare la falla di sicurezza (qui i link per Ubuntu, Debian e Red Hat).
Quello che l’attacco sfrutta è un semplice quanto diffuso bug di tipo “integer underflow”: tramite appositi comandi, si sottrae un valore da un altro così che il risultato superi il limite inferiore previsto, che non viene però controllato. Grazie alla documentazione offerta dai ricercatori spagnoli, possiamo esplorare più a fondo i dettagli del problema e abbiamo pensato che a qualcuno dei nostri lettori più “nerd” potesse interessare un piccolo approfondimento.
All’interno del codice che si occupa dell’autenticazione compaiono due funzioni, grub_password_get() e grub_username_get(), entrambe affette dallo stesso problema: se il carattere registrato dalla tastiera è “b”, ovvero è stato premuto il tasto Backspace, viene diminuito senza controlli il valore della cariabile cur_len, addetta a registrare la lunghezza effettiva della password o dell’user name che si sta inserendo. In questo modo, premendo più volte il tasto Backspace senza inserire altri caratteri prima, possiamo diminuire a nostro piacimento il valore registrato in cur_len, portando il computer a credere che stiamo inserendo una parola che ha lunghezza negativa.
Si può così mettere in atto un errore di memoria “out of bound overwrite”, ovvero si possono riscrivere parti di memoria al di fuori di quelle su cui è consentito scrivere all’utente. Il programma che si occupa del login assegna all’utente uno spazio di memoria di 1024 byte (buffer) per scrivere l’username o la password. Dopo la pressione del tasto Invio, la funzione grub_memset utilizza il valore registrato in cur_len per azzerare tutti i byte del buffer che non sono caratteri della parola immessa dall’utente. L’operazione è una procedura standard per proteggere il login dai cosiddetti “timing attack“.
Ad esempio, se l’usernamen immesso è “root”, nel buffer la parola occuperà 4 byte e verranno azzerati tutti i byte, dal quinto al 1024-esimo. Se però cur_len viene portato sotto la soglia dello zero, ad esempio a -1, la funzione grub_memset metterà a zero tutti i byte del buffer più il primo byte sotto l’indirizzo di inizio del buffer.
Se si preme per più di 16 volte il tasto Backspace, si sovrascrive con tutti zero il return address di grub_memset e si riesce a ridirezionare il control flow, ovvero il flusso di comandi che il computer esegue. I comandi che il computer inizierà ad eseguire appartengono alle prime fasi dell’avvio del computer. Ci vuole però ancora un po’ di ingegno per sfruttare questo bug!