Originally Posted by
Hador
Ok, è un classico buff overflow.
I bug di tipo buff overflow si verificano quando si ha a che fare con linguaggi di programmazione che hanno controllo diretto alla memoria (quale il c) - in c in pratica è possibile dire "leggimi cosa c'è in questo indirizzo di memoria preciso", mentre in altri linguaggi (java, c#) questo non è possibile e la memoria viene gestita dal compilatore/virtual machine (cioè dici al programma "leggimi il valore della variabile PIPPO, mentre in c puoi dire "leggimi il valore che c'è salvato in #24427DAD in memoria).
OpenSSL è scritto in c e in una procedura viene passato un puntatore ad una struttura dati, cioè un riferimento all'indirizzo di memoria dove è contenuta questa struttura dati. Nel programma poi viene detto "leggimi i primi 2 byte di questa struttura, e usali per fare una roba".
Il programma cosa fa, prende l'indirizzo di memoria dove inizia il primo byte della struttura, e ti ritorna i primi 2 byte a partire da quell'indirizzo, il tutto accedendo direttamente alla memoria.
L'attacco consiste nel passare a questa funzione una struttura dati fasulla di dimensione inferiore a quella che in teoria dovrebbe avere. Se chiamiamo questa funzione con una roba di dimensione 1 byte, nel punto in cui ritorna i primi 2 byte della struttura verranno ritornati il primo e unico byte del nostro input malevolo, più un byte adiacente (adiacente in memoria) che può essere qualcosa di sensibile al quale non avremmo dovuto avere accesso. In pratica noi gli passiamo una roba di dimensione 1, lui va all'indirizzo di memoria dove questo è salvato e poi si sposta di uno in avanti, dando per scontato che spostandosi di uno in avanti sia ancora all'interno della struttura dati - non essendo così esponiamo parti di memoria che potenzialmente devono restare protette.
Il punto è che comunque diverse implementazioni del compilatore c implementano diversi modelli di gestione della memoria, non è detto che i valori di memoria che uno è riuscito ad esporre contengano qualcosa di utile (le chiavi per decriptare, in questo caso), anche se è possibile.
Resta un tipo di vulnerabilità molto difficile da individuare (devi conoscere benissimo il programma) e da sfruttare. Benchè tutti siano vulnerabili non è neanche vero che ora premendo un bottone sia possibile bucare qualsiasi cosa. Starei tranquillo con l'allarmismo.
- ah se avete capito quel che ho scritto avete anche capito qual'è il fix, che consiste in 2 righe di codice. Un bell'if che controlla che la dimensione della struttura dati sia adeguata prima di accedere ai suoi primi 2 byte.