Mi sembra rischioso. La compressione HTTP va bene per le risorse statiche, ma per alcune risorse dinamiche servite su SSL, sembra che la compressione HTTP potrebbe essere pericolosa. Mi sembra che la compressione HTTP possa, in alcune circostanze, consentire attacchi tipo CRIME.
Considera un'applicazione web con una pagina dinamica con le seguenti caratteristiche:
-
Viene pubblicato su HTTPS.
-
La compressione HTTP è supportata dal server (questa pagina verrà inviata al browser in forma compressa, se il browser supporta la compressione HTTP).
-
La pagina ha un token CSRF su di esso da qualche parte. Il token CSRF è fisso per la durata della sessione (per esempio). Questo è il segreto che l'attacco proverà ad imparare.
-
La pagina contiene alcuni contenuti dinamici che possono essere specificati dall'utente. Per semplicità, supponiamo che ci sia un parametro URL che viene risuonato direttamente nella pagina (magari con qualche escape HTML applicato per prevenire XSS, ma che va bene e non scoraggerà l'attacco descritto).
Quindi penso che gli attacchi in stile CRIME possano consentire a un utente malintenzionato di apprendere il token CSRF e montare attacchi CSRF sul sito web.
Lasciatemi fare un esempio. Supponiamo che l'applicazione Web di destinazione sia un sito Web bancario su www.bank.com
e che la pagina vulnerabile sia https://www.bank.com/buggypage.html
. Supponiamo che la banca assicuri che il materiale bancario sia accessibile solo tramite SSL (https). E, supponiamo che se il browser visita https://www.bank.com/buggypage.html?name=D.W.
, il server risponderà con un documento HTML con un aspetto vagamente simile a questo:
<html>...<body>
Hi, D.W.! Pleasure to see you again. Some actions you can take:
<a href="/closeacct&csrftoken=29238091">close my account</a>,
<a href="/viewbalance&csrftoken=...">view my balance</a>, ...
</body></html>
Supponiamo che tu stia navigando sul web tramite una connessione WiFi aperta, in modo che un utente malintenzionato possa intercettare tutto il traffico di rete. Supponiamo che tu sia attualmente collegato alla tua banca, quindi il tuo browser ha una sessione aperta con il sito web della tua banca, ma in realtà non stai facendo alcuna operazione bancaria sulla connessione Wifi aperta. Supponiamo inoltre che l'aggressore possa attirarti a visitare il sito web dell'attaccante http://www.evil.com/
(ad esempio, magari facendo un attacco man-in-the-middle a te e reindirizzandoti quando provi a visitare un altro sito http).
Quindi, quando il tuo browser visita http://www.evil.com/
, quella pagina può attivare richieste interdominio sul sito web della tua banca, nel tentativo di apprendere il token CSRF segreto. Si noti che Javascript è autorizzato a effettuare richieste tra domini. La politica della stessa origine impedisce di visualizzare la risposta a una richiesta interdominio. Tuttavia, poiché l'utente malintenzionato può intercettare il traffico di rete, l'utente malintenzionato può osservare la lunghezza di tutti i pacchetti crittografati e quindi dedurre qualcosa sulla lunghezza delle risorse che vengono scaricate tramite la connessione SSL alla propria banca.
In particolare, la pagina dannosa http://www.evil.com/
può attivare una richiesta a https://www.bank.com/buggypage.html?name=closeacct&csrftoken=1
e guardare quanto bene la pagina HTML risultante si comprime (ascoltando i pacchetti e osservando la lunghezza del pacchetto SSL dalla banca). Successivamente, può attivare una richiesta a https://www.bank.com/buggypage.html?name=closeacct&csrftoken=2
e vedere quanto bene comprime la risposta. E così via, per ogni possibilità per la prima cifra del token CSRF. Uno di questi dovrebbe comprimersi un po 'meglio degli altri: quello in cui la cifra nel parametro URL corrisponde al token CSRF nella pagina. Ciò consente all'aggressore di apprendere la prima cifra del token CSRF.
In questo modo, sembra che l'attaccante possa apprendere ciascuna cifra del token CSRF, recuperandole cifra per cifra, finché l'attaccante non impara l'intero token CSRF. Quindi, una volta che l'hacker conosce il token CSRF, può fare in modo che la sua pagina dannosa su www.evil.com
attivi una richiesta interdominio contenente il token CSRF appropriato, riuscendo a sconfiggere le protezioni CSRF della banca.
Sembra che questo possa consentire a un utente malintenzionato di eseguire un attacco CSRF con successo su applicazioni Web, quando si applicano le condizioni sopra riportate, se la compressione HTTP è abilitata. L'attacco è possibile perché stiamo mescolando i segreti con i dati controllati dagli hacker nello stesso carico utile e quindi comprimendo e crittografando quel carico utile.
Se ci sono altri segreti che sono memorizzati in HTML dinamico, potrei immaginare che attacchi simili potrebbero diventare possibili per imparare quei segreti. Questo è solo un esempio del tipo di attacco che sto pensando. Quindi, mi sembra che usare la compressione HTTP su pagine dinamiche a cui si accede tramite HTTPS sia un po 'rischioso. Potrebbero esserci validi motivi per disabilitare la compressione HTTP su tutte le risorse pubblicate su HTTPS, ad eccezione delle pagine / risorse statiche (ad es. CSS, Javascript).