Heartbleed: Due Anni di Internet che Sanguinava in Silenzio
CVE-2014-0160. Un buffer over-read in OpenSSL che ha esposto chiavi private e sessioni HTTPS per due anni. L'infrastruttura mondiale tenuta su da donazioni minime.
Il 7 aprile 2014, dopo una disclosure coordinata, OpenSSL, Google Security e Codenomicon portarono alla luce pubblicamente una delle vulnerabilità più devastanti nella storia di internet. Google e Codenomicon l'avevano scoperta in modo indipendente.
La chiamarono Heartbleed. CVE-2014-0160. Un bug riconducibile a una validazione mancante della lunghezza dichiarata nel percorso di gestione dell'Heartbeat.
Cos'è OpenSSL e Perché Conta
OpenSSL è la libreria crittografica che implementa i protocolli SSL/TLS — quelli che mettono la S in HTTPS. OpenSSL era diffusissima; al momento della disclosure Netcraft stimò esposto circa il 17% dei siti HTTPS con certificati affidabili. App, VPN, email server, e cloud provider ne dipendevano.
OpenSSL è open source. Mantenuta da un team di volontari. Prima di Heartbleed, OpenSSL riceveva — secondo quanto riportò Steve Marquess parlando delle sole donazioni dirette — circa 2.000 dollari l'anno: una cifra diventata il simbolo del sottofinanziamento dell'infrastruttura open source critica.
Sì, hai letto bene. Il software che proteggeva mezza rete globale riceveva mance.
Il Bug: Una Riga di C
L'estensione Heartbeat di TLS/DTLS (RFC 6520) è un meccanismo semplice: il client manda un messaggio di "keep-alive" con un payload e la sua lunghezza. Il server risponde con lo stesso payload, confermando che la connessione è viva.
Snippet semplificato del bug scritto nel 2011:
/* Legge la lunghezza dichiarata dal client */
unsigned int payload_length = *(unsigned short *)p;
/* Alloca il buffer di risposta */
unsigned char *buffer = OPENSSL_malloc(1 + 2 + payload_length + padding);
/* Copia il payload nella risposta — BUG: usa payload_length, non la lunghezza reale */
memcpy(bp, pl, payload_length);
Il problema è un classico buffer over-read: nessuna validazione che payload_length corrisponda alla lunghezza reale del messaggio ricevuto. Un attaccante poteva inviare un payload di 1 byte dichiarando una lunghezza di 65.535 byte. Il server avrebbe risposto copiando fino a 64KB di memoria heap nella risposta.
Memoria heap che poteva contenere qualsiasi cosa: chiavi private SSL, password, cookie di sessione, frammenti di altre comunicazioni.
Due Anni Nel Buio
Il bug fu introdotto nel commit del 31 dicembre 2011. Fu rilasciato in OpenSSL 1.0.1 il 14 marzo 2012.
Per poco più di due anni, chiunque conoscesse il bug poteva leggere porzioni di memoria dei sistemi vulnerabili che usavano le versioni affette di OpenSSL — spesso senza segnali evidenti nei log applicativi standard, senza autenticazione e senza rumore.
Nessuno sa con certezza quante volte questo bug fu sfruttato prima della divulgazione pubblica, dato che i log normali non registravano il traffico anomalo dell'Heartbeat.
NSA fu accusata di aver conosciuto il bug per mesi prima della disclosure pubblica, accusa che l'agenzia smentì seccamente.
L'Impatto Reale
Quando la notizia esplose, il mondo reagì in modo caotico. Moltissimi siti grandi risultarono esposti; la Canada Revenue Agency subì il furto di 900 numeri di previdenza sociale. In seguito, Reuters e TrustedSec collegarono anche il breach di Community Health Systems — 4,5 milioni di pazienti coinvolti — a uno sfruttamento iniziale di Heartbleed, anche se quel collegamento non ebbe lo stesso grado di ufficialità della documentazione tecnica primaria.
Centinaia di migliaia di certificati potevano essere compromessi, e i processi di revoca/reissue furono messi sotto forte pressione. La patch arrivò lo stesso giorno della disclosure, ma applicare la patch non bastava: bisognava revocare i certificati, emetterne di nuovi, e invalidare le sessioni attive. Molti amministratori si limitarono inizialmente alla patch, senza completare subito reissue e revoca dei certificati, lasciando aperto il rischio che materiali già compromessi restassero sfruttabili.
La Vera Lezione: L'Infrastruttura Come Hobby
Heartbleed aprì un dibattito irrisolto. Le aziende tecnologiche costruivano miliardi di dollari di prodotti sopra software mantenuto da volontari con budget microscopici.
Dopo Heartbleed nacque la Core Infrastructure Initiative della Linux Foundation, pensata per portare fondi, audit e supporto stabile ai progetti critici sottofinanziati, tra cui OpenSSL.
Epilogo
Robin Seggelmann, il programmatore che scrisse il bug, disse in un'intervista che gli era semplicemente sfuggito durante la stesura e che non c'era intento malevolo.
Aveva ragione. Il problema non era lui. Il problema è un ecosistema in cui il software vitale dipende da sviluppatori sovraccarichi e mal pagati, e che all'epoca non aveva risorse, review e auditing proporzionati al peso reale di quel software.
Quanti altri Heartbleed ci sono là fuori in questo momento?
🪳 Il Duca del Debug — La savana digitale non perdona.