La minaccia di Heartbleed
16 Aprile 2014Stefano Cherchi
Heartbleed sarà ricordato molto a lungo come la Hiroshima delle minacce alla sicurezza di Internet. Va detto che, in questo caso, tutta l’attenzione dedicata al fenomeno anche da testate non tecniche è purtroppo giustificata, perché stavolta il guaio è serio. Il baco affligge una libreria software usata per criptare la trasmissione dei dati in Rete da migliaia di server in tutto il mondo e consente di svelare potenzialmente tutto quello che transita sui servizi affetti: password, dati personali, transazioni bancarie. Inoltre, sfruttare questa vulnerabilità è straordinariamente semplice. Cerchiamo di capire in quale ecosistema si muove questa bruttissima bestia e di cosa si nutre. Tecnicamente, l’attacco è un banalissimo buffer over-read dovuto alla mancanza di bound-checking sulle richieste di hearthbeat TLS e consente di leggere aree della memoria del computer affetto che altrimenti non sarebbero state accessibili. Questo frasario sembrerà molto meno fantascientifico se facciamo un passo indietro e chiariamo un po’ dei termini strani appena introdotti. Una libreria software è un programma che svolge un compito molto specifico e che può essere “incluso” all’interno di altri programmi. Questo consente ai programmatori di non dover riscrivere ogni volta funzioni molto comuni, basta riutilizzare all’interno del proprio codice librerie già scritte da altri. OpenSSL è una libreria che si occupa di cifrare e decifrare dati che vengono scambiati sulle reti pubbliche. Ogni programma quando è eseguito viene caricato nella memoria ram. Semplificando un po’ si può dire che la memoria allocata per i programmi in esecuzione è divisa in due aree: una in cui risiedono le istruzioni del programma stesso (gli ingranaggi del macchinario) ed una che contiene i dati che il programma deve processare (le materie prime da lavorare). In quest’ultima area, che viene usata come un buffer o “cuscinetto” in cui le informazioni entrano ed escono in continuazione, ogni dato viene conservato in “caselle” di lunghezza variabile e che dovrebbero in teoria essere bene isolate l’una dall’altra in modo che, ad esempio, un programma non possa sovrascrivere o cancellare i dati di un altro. Ho detto in teoria perché non sempre questo isolamento riesce bene e qui ci stiamo avvicinando molto al punto cruciale. Il linguaggio di programmazione C (in cui è scritta la libreria OpenSSL così come la maggior parte dei sistemi operativi, il software che comanda gli iniettori della vostra auto e, probabilmente, anche il programma di gestione della vostra stufa a pellet) non ha dei meccanismi automatici che garantiscano la segregazione dei singoli blocchi ma sta al programmatore fare in modo che la “privacy” dei dati sia rispettata facendo apposite verifiche (bound-checking, in italiano controllo dei limiti) sugli sconfinamenti. L’ultima voce del nostro piccolo glossario è “heartbeat” (battito cardiaco) da cui prende nome il bug “heartbleed” (cuore sanguinante): in informatica un heartbeat è un breve messaggio che due macchine si scambiano per verificare, ad esempio, di essere ancora collegate alla rete. E’ un po’ come lo squillino che si faceva alla fidanzata per dirle “ti penso sempre” prima che arrivasse Whatsapp. Anche OpenSSL utilizza gli heartbeat per mantenere attive le sessioni cifrate quando, ad esempio, vi collegate al sito della vostra banca. Mentre voi fate le vostre operazioni, ogni tanto il vostro pc manda un heartbeat al server per controllare se è tutto ok. Il messaggio, tradotto in linguaggio umano potrebbe suonare più o meno così: “ciao server, se sei ancora lì inviami la parola di 5 lettere gatto”. E il server risponde: “gatto”. Tutto ok. Ma che succede se un buontempone invia il messaggio “ciao server, se sei ancora lì inviami la parola di 64.000 lettere gatto”? Un programma scritto correttamente si accorgerebbe che la parola gatto non è composta da 64mila lettere e bloccherebbe la risposta. Ma ecco che siamo arrivati al punto: OpenSSL non fa questo controllo e restituisce semplicemente le prime 5 lettere (gatto) più le 63.995 seguenti che trova nella memoria buffer del server. Questo è un buffer over-read, cioè la lettura in eccesso dei dati di un buffer. A questo punto credo che tutti abbiano iniziato a realizzare che all’interno di questa massa di informazione aggiuntiva prelevata a caso dal server può esserci di tutto: le password di altri utenti, dati personali, numeri di carte di credito o qualunque altra informazione privata. Inutile dire che, vista la gravità del caso, il problema è stato corretto in meno di 24 ore perciò per il futuro non abbiamo niente da temere ma restano i dubbi sul passato, visto che la versione di OpenSSL interessata dal bug era in circolazione già da un paio d’anni. Il consiglio per gli utenti quindi è di non aspettare di aver riassorbito lo shock della notizia prima di cambiare le password di tutti i servizi Internet su cui transitano dati che potrebbero rovinarvi la Pasqua.