Per riassumere:
- Potrebbe funzionare, o meno, a seconda di come il server gestisce la cache per i parametri di sessione.
- Le RFC non sono coerenti.
- Non è una vulnerabilità "reale".
Le sessioni TLS erano inizialmente pensate come un'ottimizzazione, per evitare che client e server eseguissero l'intera stretta di mano con la sua "pesante crittografia asimmetrica" per ogni connessione (il costo effettivo di tale crittografia è spesso sopravvalutato ma non è questo il punto). I client e i server esistenti e distribuiti tendono a ricordare le sessioni per un po 'di tempo, quindi le dimenticano quando diventa problematico continuare a ricordare (in genere, sul lato server, quando il buffer RAM dedicato a tale spazio di archiviazione è pieno, le vecchie sessioni vengono sfrattate). L'idea è che il client e il server possano ancora fare una stretta di mano completa, in modo trasparente, quando necessario; la ripresa della sessione è opportunistica.
Alcuni sistemi distribuiti si basano sulla ripresa della sessione per funzionare in modo un po 'più affidabile; in particolare, applicazioni basate sul Web con autenticazione client con smart card: l'uso della smart card implica la firma con la carta, che ha un piccolo costo computazionale (diciamo 1 secondo) e un costo utente elevato (l'utente umano potrebbe dover digita un codice PIN). Tuttavia, anche in questi casi, è chiaro che i parametri di sessione sono memorizzati solo nella RAM, quindi se il browser client viene chiuso e quindi riaperto, non verrà ripresa alcuna sessione e verrà eseguito un handshake completo.
RFC 5246 , in sezione 7.2.2 , contiene questo paragrafo:
Error handling in the TLS Handshake protocol is very simple. When
an error is detected, the detecting party sends a message to the
other party. Upon transmission or receipt of a fatal alert
message, both parties immediately close the connection. Servers
and clients MUST forget any session-identifiers, keys, and secrets
associated with a failed connection. Thus, any connection
terminated with a fatal alert MUST NOT be resumed.
Questa è una dichiarazione generica intesa, in modo informale, a dissuadere alcuni attacchi di forza bruta ancora non specificati che fanno affidamento sull'attaccante che "prova" molte riprese di sessione. Ci sono alcuni punti illuminanti che devono essere fatti su quella prescrizione:
-
Storicamente, anche le sessioni dovevano essere "dimenticate" quando una connessione non era chiusa correttamente (con un esplicito close_notify
). Tuttavia, i server Web esistenti interrompono bruscamente la connessione, quindi i browser Web si sono adattati mantenendo le sessioni "vere" anche quando sono state terminate in un modo in cui TLS-1.0 avrebbe disapprovato.
-
Questa nozione di dimenticare la sessione su un avviso fatale non funziona sul server quando vengono utilizzati ticket di sessione , dal momento che , per definizione, un server con ticket di sessione non gestisce la propria memoria. A tale riguardo, RFC 5077 e RFC 5246 non sono coerenti: questo "NON DEVE essere ripreso" non può essere applicato da un server che utilizza ticket di sessione.
Accade così che la maggior parte delle implementazioni SSL siano riluttanti a violare le leggi della fisica per conformarsi a RFC.
-
Anche senza inviare un avviso, una "condizione fatale" può sempre essere forzata da un utente malintenzionato: è sufficiente che l'attaccante apra una connessione da solo, riutilizzando lo stesso ID sessione come una connessione utilizzata dal client originale. Il server proverà a riprendere la sessione ( ServerHello
, ChangeCipherSpec
, Finished
) quindi aspettarsi il ChangeCipherSpec
e Finished
dal client. Poiché il client è l'autore dell'attacco e l'autore dell'attacco non conosce la chiave principale per la sessione che intende riprendere, il suo messaggio Finished
non verrà decrittografato correttamente, provocando un bad_record_mac
dal server. Se la sezione 7.2.2 deve essere seguita, il server dovrebbe quindi dimenticare la sessione.
Si sottolinea che l'attacco "kill the session by failed Finished
" espresso nel paragrafo precedente può essere più facile da estrarre rispetto a quello che stai descrivendo, poiché coinvolge solo osservando una connessione autentica (per ottenere l'ID di sessione), non che modifica quella connessione.
Il terzo punto sopra è importante perché mostra che fino a quando non ha ricevuto un messaggio Finished
correttamente crittografato e MAC dal client, il server non ha alcuna prova che stia davvero parlando con il vero client. Probabilmente, la sessione non viene "ripresa" fino a quel momento, e quindi non dovrebbe essere "invalidata" per qualsiasi condizione errata che si verifichi prima di quel punto (sia un avviso esplicito dal client, o un errore MAC, o qualsiasi altra cosa). Tuttavia, anche l'RFC non è chiaro su questo, quindi ciò che realmente accade dipende in realtà da come il server gestisce la sua cache, ai capricci del server implementor.
La vulnerabilità non è "reale" in quanto qualsiasi attaccante che è in grado di trafficare con le connessioni client può già fare molto più danno, ad esempio rispondendo al messaggio ClientHello
del client con un messaggio sintetico di allerta o semplicemente spazzatura casuale che convincerà il cliente che non c'è un server SSL / TLS funzionante dall'altra parte - un denial-of-service molto più completo del semplice fatto che server e client passano un paio di millisecondi di CPU per un intero handshake.