La falla, resa pubblica il 7 aprile 2014, è stata scoperta indipendentemente da due gruppi di ricercatori: dal gruppo di Codenomicon (Riku, Antti e Matti) e Neel Mehta di Google Security.
Questa vulnerabilità consente ad un aggressore di acquisire dati riservati trasmessi dai siti che usano OpenSSL o spacciarsi per un sito attendibile utilizzando HTTPS e facendo visualizzare al browser della vittima l'icona del lucchetto chiuso (che indica una connessione sicura).
La vulnerabilità risale al 2012 quando con OpenSSL 1.0.1 è stato introdotto il supporto di RFC6250 ed è stato implementato l'heartbeat sulle connessioni TLS (Transport Layer Security protocol). L'heartbeat (chiamato anche keep-alive) viene utilizzato per evitare che client e server debbano rinegoziare la connessione in caso di temporanea inattività e mantiene il canale utilizzato dalla comunicazione aperto. Per mantenere il canale aperto vengono inviati pacchetti dati senza informazioni al fine di resettare i contatori di inattività ma, a causa di un bug all'interno del codice, è possibile, tramite un pacchetto heartbeat opportunamente modificato, accedere ad informazioni di vario tipo.
Il protocollo prevede che il client invii al server un pacchetto di heartbeat, al massimo di 16K (anche se in realtà i pacchetti inviati sono molto più piccoli), e che questo risponda con un pacchetto contenente la copia di quello ricevuto dal client.
Andando nel dettaglio, il pacchetto heartbeat è composto da:
- 0x01 costante che identifica TLS1_HB_REQUEST
- 2 byte che indicano la dimensione del pacchetto
- 2 byte che indicano il numero di sequenza del pacchetto
- 16 byte di dati casuali
- altri 16 byte casuali utilizzati come richiesto dal documento RFC6250
Il server, ricevuta la richiesta, copia i dati ricevuti e li rispedisce al client. Il codice affetto dalla vulnerabilità è il seguente:
/* Allocate memory for the response, size is 1 byte * message type, plus 2 bytes payload length, plus * payload, plus padding */ buffer = OPENSSL_malloc(1 + 2 + payload + padding); bp = buffer; /* Enter response type, length and copy payload */ *bp++ = TLS1_HB_RESPONSE; s2n(payload, bp); memcpy(bp, pl, payload);
Nel codice payload rappresenta la dimensione del pacchetto e viene dichiarata dal mittente (non viene verificata dal server). Se il mittente, anzichè dichiarare la vera dimensione del pacchetto, invia 0xFFFF (valore massimo esprimibile per 2 byte senza segno) il server copierebbe i 34 byte del pacchetto più altri 65501 byte prelevati dalla memoria. Proprio questi ultimi byte potrebbero contenere dati sensibili come la chiave di cifratura delle comunicazioni utilizzata dal server.
Dopo questa lunga premessa, di seguito mostrerò come testare se il proprio sistema è affetto dalla falla utilizzando Nmap su Kali Linux.
Nmap è un software libero (GNU GPL) creato per eseguire il port scanning, cioè individuare le porte aperte su un sistema e i relativi servizi attivi. Il software è incluso in Kali Linux pertanto per utilizzarlo non è necessario effettuare alcuna installazione.
Dalla finestra terminale digitare il seguente comando
nmap -d --script ssl-heartbleed --script-args vulns.showall -sV [HOST]
dove [HOST] rappresenta il nome o l'indirizzo ip della macchina che si intende verificare.
Ad es. nel caso volessimo testare se il server con indirizzo IP 192.168.0.11 è vulnerabile possiamo digitare il comando
nmap -d --script ssl-heartbleed --script-args vulns.showall -sV 192.168.0.11
FIG 1 - Nmap test Heartbleed |
ATTENZIONE:
Danneggiare un sistema informatico (anche da remoto) rappresenta un reato penale. Le informazioni presenti in quest'articolo vanno utilizzate solo per testare/verificare sistemi di cui si è titolari. Declino ogni responsabilità civile e penale derivante da un utilizzo non legale delle informazioni presentate in questo articolo a solo scopo didattico.
Nessun commento:
Posta un commento
I messaggi sono soggetti a moderazione da parte dell'amministratore prima della loro pubblicazione.