Insidiosa vulnerabilità nel kernel Linux
by admin on Jul.17, 2009, under Hacking, Linux, Sicurezza
E’ stata riscontrata recentissimamente una vulnerabilità nel kernel Linux, assolutamente interessante da analizzare, se non altro per il fatto che il solo riesame del codice sorgente, per quanto accurato, non sarebbe mai stato in grado di individuarla.
È pertanto adattissima a dimostrare come la sicurezza vada estesa ad ogni livello, nella ricerca delle vulnerabilità.
Di cosa si tratti può essere spiegato facilmente.
Il codice vulnerabile si trova nella implementazione net/tun.
Sostanzialmente, accade che una variabile (sk, nella porzione di codice qui sotto), viene inizializzata ad un certo valore che può essere NULL.
Il valore di questa nuova variabile viene correttamente controllato un paio di linee più sotto, e se è 0 (NULL), viene restituito un errore.
Il codice è qualcosa come:
struct sock *sk = tun->sk; // initialize sk with tun->sk
[...]
if (!tun)roo
return POLLERR; // if tun is NULL return error
Il codice appare perfettamente corretto, ed effettivamente lo è, almeno fino a quando non interviene il compilatore.
Nell’ ottimizzare il codice, il compilatore riscontrà che la variabile ha già subito l’ assegnazione di un valore e di conseguenza rimuove completamente il blocco if (che controlla se tun vale NULL) dal risultante codice compilato.
In altre parole, è il compilatore a introdurre nel codice binario una vulnerabilità che non esiste nel codice sorgente. Ciò fa tentare al kernel la lettura/scrittura di dati in 0×00000000, che l’attaccante può mappare in userland per poi prendere il controllo della macchina.
Per maggiori dettagli tecnici è disponibile su YouTube un video relativo ad un exploit che sfrutta proprio tale vulnerabilità.
L’autore, Brad Spengler, è stato in grado di bypassare con esso le protezioni SELinux.
Il rimedio è relativamente facile, il controllo deve semplicemente essere fatto prima di assegnare il valore alla structure sk.


July 18th, 2009 on 2:56 am