venerdì 17 luglio 2009

Exploit nel kernel Linux 2.6.30

Lo sviluppatore Brad Spengler che lavora per il proggetto Grsecurity, ha recentemente pubblicato un exploit che sfrutta una vulnerabilità nell'interfaccia TUN nel kernel Linux 2.6.30 e 2.6.18, usati in Red Hat Enterprise Linux 5 (RHEL5). Come sappiamo i driver che permettono la creazine di periferiche di rete virtuali vengono chiamati TUN/TAP. Rispetto alle comuni periferiche (ad es. eth0) che sono controllate direttamente dalle schede di rete, i pacchetti spediti da o verso dispositivi TUN/TAP sono spediti da o verso programmi software. TUN è in grado di simulare una periferica di rete di tipo punto-punto e lavora con pacchetti di tipo IP mentre TAP è in grado di simulare un dispositivo Ethernet e logicamente utilizza i frame Ethernet. Questa vulnerabilità permette ad un malintenzionato di ottenere i privilegi di root. Di particolare interesse è il fatto che l'exploit è anche in grado di aggirare le estensioni di sicurezza come SELinux. Secondo Spengler, la vulnerabilià è stata trovata solo in queste due versioni del kernel. Il problema è causato da una funzione di ottimizzazione del GCC. Il codice riportato di seguito è il responsabile del problema:

static unsigned int tun_chr_poll(struct file *file, poll_table * wait)

struct sock *sk = tun->sk; // initialize sk with tun->sk

if (!tun)
return POLLERR; // if tun is NULL return error

In cuore della vulnerabilità, è in particolare l'istruzine if(!Tun) che dovrebbe restituire un errore se TUN è 0 (nullo). Il compilatore praticamente ottimizza il blocco if eliminando il controllo per puntatori nulli, in quanto la variabile è già deferenziata. L'operazione piu` importante che viene eseguita sui puntatori e quella di dereferenziazione al fine di ottenere accesso all'oggetto puntato. A questo punto, il kernel potrebbe tentare di accedere all''indirizzo 0x00000000 e quindi un utente malintenzionato può cambiare il puntatore ed eseguire uno shellcode. L'exploit quindi, deve essere in grado di aprire il dispositivo /dev/net/tun e utilizzare i moduli caricabili da PulseAudio, che in alcune distribuzioni hanno il bit di SUID attivo. Il codice deve essere in grado deve anche disattivare il "mmap_min_addr" che praticamente limita la quantità di spazio di indirizzamento di un processo. Le future versioni del kernel saranno compilate utilizzando l'opizione "FNO-eliminare-null in modo che il compilatore non elimina i controlli per puntatori nulli.

Exploit: http://www.grsecurity.net/~spender/cheddar_bay.tgz

Nessun commento: