Dalla descrizione, si può dedurre che l'attacco funziona come segue (attenzione: ho scritto "infer" e intendo - non l'ho provato):
-
L'attaccante è in grado di intercettare tutto il traffico di rete dalla vittima (ad esempio, l'attaccante gestisce il punto di accesso WiFi a cui la vittima è incautamente connessa).
-
L'utente malintenzionato possiede (legittimamente!) un dominio, chiamiamolo "evilattacker.com" e ha acquistato un certificato completamente valido con quel nome; in particolare, l'autore dell'attacco possiede un certificato A , che contiene il nome www.evilattacker.com
, ed è firmato da qualche root di fiducia V . L'utente malintenzionato spinge una copia di tale certificato (la chiave pubblica) su un sito Web pubblicamente accessibile, ad esempio il proprio sito; l'URL corrispondente può essere (per esempio) http://www.evilattacker.com/cert.crt
(potrebbe anche essere su qualsiasi tipo di hosting pubblico, non importa).
-
La vittima vuole connettersi al proprio sito bancario. Il suo browser tenta di aprire una sessione SSL con www.bank.com
.
-
L'attaccante intercetta quella connessione e finge di essere la banca. A tal fine, l'autore dell'attacco invia una catena di certificati C , X (nell'ordine indicato) dove:
-
C è un certificato sintetico che contiene il nome
www.bank.com
, ed è firmato con la chiave privata dell'aggressore e contiene un Authority Information Access
estensione con un URL uguale a http://www.evilattacker.com/cert.crt
(cioè, indicando dove l'autore dell'attacco ha pubblicato il proprio certificato C ).
-
X è junk casuale.
-
Il client (browser della vittima) non riuscirà a convalidare la catena C , X , perché X è una spazzatura casuale. Se il browser utilizza un vecchio OpenSSL, le cose si fermano qui e viene segnalato un errore di connessione. Tuttavia, se il browser utilizza una nuova versione interessata di OpenSSL, tenterà di ricostruire una catena alternativa, seguendo l'URL trovato in C . In particolare, il browser scaricherà A (il certificato dell'attaccante) e poi V (l'autorità di certificazione attendibile esterna) e finirà con C , Una , V catena.
-
Se non ci sono bug, il client rifiuta la nuova catena C , A , V perché anche se tutti corrispondenza di firme crittografiche, il certificato medio A manca dell'estensione Basic Constraints
con il flag cA
impostato su TRUE
: il certificato dell'attacker non è un certificato CA, quindi non può apparire nel mezzo di una catena valida. Tuttavia, a causa del bug, in quella situazione specifica, le versioni interessate di OpenSSL non riescono a controllare il flag cA
nell'estensione Basic Constraints
e accettano che C , A , V catena come valida. Il browser è persuaso che parla con il vero server di banca e procede senza alcun preavviso. L'attaccante può ora eseguire un attacco Man-in-the-Middle e saccheggiare il conto bancario della vittima .
Ironia della sorte, il mancato controllo dell'estensione Basic Constraints
per i certificati medi è stato anche un bug in Windows / Internet Explorer circa 2003, e Microsoft è stata debitamente e pesantemente derisa per questo; gli sviluppatori di OpenSSL hanno quindi perso tutti i diritti su questo tipo di mocking.
Il bug influisce su ogni applicazione che utilizza una versione interessata di OpenSSL (non molti di essi, poiché il codice buggy è stato aggiunto solo di recente) ed è in grado di elaborare una catena di certificati inviata da un peer potenzialmente ostile. Ciò significa SSL client (durante la convalida del certificato di un server); questo significa anche server SSL stessi, quando (e solo quando) questi server richiedono i certificati dai client (l'autenticazione del client basata su certificati è piuttosto rara nel Web di tutti i giorni).