I costi relativi dipendono molto da quale sia la vulnerabilità. Per dimostrarlo, farò riferimento a due vulnerabilità semi-recenti: il bug di Bash "Shellshock" e il bug "Ghost" gethostbyname()
di glibc.
Shellshock
Il bug di Shellshock è stato causato da una falla complessa nell'analisi di Bash che potrebbe essere usata per far eseguire Bash codice direttamente dalle variabili di ambiente. Il bug esisteva per circa 22 anni prima che fosse trovato pubblicamente.
Un controllo per verificare se il bug esiste è il seguente:
$ env X="() { :;} ; echo vulnerable" /bin/sh -c ":"
Ora, scoprire che l'errore richiede un accurato controllo del codice sorgente o una buona sessione con un codice fuzzer. Ma non appena si riduce a un caso di test come questo, gli exploit arrivano facilmente. Ad esempio, se sai che un server di destinazione sta eseguendo uno script di shell CGI:
$ nc vulnerable.example.com 80 <<__END
GET /path/to/cgi.sh HTTP/1.1
Host: localhost
User-Agent: () { x; }; printf "%s\n\n" "Content-type: text/plain"; /usr/bin/id
Accept: */*
__END
Quindi Shellshock era difficile da trovare, ma una volta trovato, era banale da sfruttare.
Ghost
La vulnerabilità di glibc gethostbyname()
, d'altra parte, è una vulnerabilità di overflow del buffer che può verificarsi soltanto in determinate condizioni molto specifiche. Un utente malintenzionato può sovrascrivere al massimo 8 byte di memoria su macchine a 64 bit o 4 su macchine a 32 bit. L'autore dell'attacco deve impostare una voce DNS appositamente predisposta, quindi ingannare il bersaglio per richiederlo.
Questo bug è stato rimosso per circa 13 anni e, una volta risolto, non è stato riconosciuto come una vulnerabilità di sicurezza. I ricercatori di sicurezza Qualys che lo hanno segnalato come vulnerabilità hanno dedicato molto tempo a testare i singoli programmi per sfruttarli. Una grande maggioranza non lo era, a causa della limitazione di 8 byte e dei dettagli di come viene tipicamente utilizzato gethostbyname()
. Nota anche che il semplice innesco del bug causa generalmente il crash del programma: più denial of service che exploit.
Il loro colpo di grazia, un completo exploit remoto del mailserver di Exim, è una catena Rube Goldberg meticolosamente progettata che è riuscita a aggirare le limitazioni usando proprietà specifiche di come Exim succede ad organizzare la sua memoria in situazioni specifiche. È descritto dettagliatamente nel advisory sulla sicurezza di Qualys ed è troppo complicato per andare qui dentro.
Confronto
Devo ammettere che non sono sicuro di quale bug fosse più difficile da trovare. Entrambi sono rimasti latenti nel codice per molto tempo. Qualys ha trovato il bug di Ghost "durante un controllo del codice"; Stéphane Chazelas ha trovato il bug di Shellshock estrapolando da cose che sapeva già sul comportamento di Bash e un'intera serie di i bug correlati sono stati trovati molto rapidamente una volta che le persone sapevano dove cercare, alcuni con l'aiuto degli strumenti fuzzing.
Tuttavia, la questione di quale era più difficile da sfruttare è molto più facile da rispondere. Penso che sia chiaro che un livello molto alto di ingegneria è andato alla ricerca di un modo per trasformare il bug Ghost in un exploit Exim funzionante. È stato richiesto molto più lavoro rispetto all'utilizzo di Shellshock precedente, che ha richiesto circa 10 minuti per scrivere e testare.