HTTP Cache-Control user tracing exploited

dscf1673.jpg Nel pomeriggio di ieri, a seguito del post di commento all’articolo del Corriere su come “aggirare Google”, ho messo su un piccolo script php che vorrebbe dimostrare quanto rapido e veloce sia tracciare gli utenti di un sito web senza dover usare i cookies (sui quali si concentrano molti dei sistemi per migliorare la “privacy” degli utenti).

Tanto per rendere l’idea di quanto semplice sia lo script, qui ne trovate il codice sorgente, che vedo di commentare nelle prossime righe.

Il concetto sul quale si basa questo breve script, è che il sistema di gestione dei files in cache può essere agevolmente utilizzato per correlare tra loro le sessioni di uno stesso utente, anche dopo che questi ha chiuso ed riaperto il browser (magari a distanza di tempo) e senza dover necessariamente mantenere in memoria un cookie, facilmente identificato per altro da una serie di strumenti, o disabilitabile da parte dell’utente in questione (che può per l’appunto rifiutarlo al momento di caricare la pagina).

Lo script php quindi, comunica (inviando un apposito header di sessione HTTP) al browser che la pagina che sta caricando deve essere mantenuta in cache, e che questi dovrà perciò provvedere a validare nuovamente la pagina (alla quale viene per questo motivo associato un codice univoco, l’ETag) alla prossima visita. Il meccanismo della cache è utile perché nel caso in cui la pagina non venga modificata tra le due visite, al browser potrà essere inviato solamente un header con codice 302 (Pagina non modificata), evitando che questi debba andare a ricaricare tutti i componenti della pagina, sprecando tempo e banda. Come tutte le umane cose però, l’ETag (o la data di modifica, o qualsiasi altro parametro della pagina) può essere utilizzato (come nel nostro esempio) per correlare le sessioni, impostandolo ad un valore univoco e differente utente per utente (nel nostro caso impostato banalmente ad un valore casuale di 4 cifre).

Se volete verificare che il sistema effettivamente funzioni, non dovete far altro che cancellare i vostri cookie, chiudere e riaprire il browser, e tornare alla pagina in questione.

Inutile dire che esistono molti altri modi per tenere traccia delle sessioni degli utenti senza dover ricorrere ai cookies, ma ho voluto esplorare in pratica questa possibilità perché l’unico sistema che conosco che rimuova e sostituisca l’ETag è Privoxy (o l’uso di altri proxy appositamente configurati) ed è allo stesso tempo particolarmente semplice da attuare.

Annunci

5 pensieri su “HTTP Cache-Control user tracing exploited

  1. maintux

    Ciao Giacomo,
    secondo me questa soluzione, se pur buona alternativa ai cookie, ha una pecca:

    Analizzando la programmazione AJAX, considerando che tutte le richieste al server avvengono in background ed in modo asincrono, mi trovo spesso a dover passare header http che fanno l’opposto, cioè non faccio salvare le pagine in cache, perchè molti dei nuovi browser (primo su tutti i.e.) usano già la memorizzazione delle pagine in cache, per velocizzare la navigazione e quindi non riescono a gestire la modifica della pagina effettuata in js a seguito di una risposta dal server.
    Alla luce di quanto detto credo che questo script, per quanto valido, potrebbe “aggravare” questi problemi qualora venisse usato in un ambito AJAX.

    Tengo a sottolineare che quanto ho scritto è solo frutto della mia esperienza e di una riflessione fatta su due piedi, ma conoscendo la tua ottima preparazione, se qualche cosa non è esatta, accetto senza problemi le tue correzioni 😉

    Ciao maintux.

    Rispondi
  2. alt-os Autore articolo

    Indubbiamente, maintux. Anche se in realtà usa solo gli header, visto che non ritorna il 302 ma invia comunque la pagina al client e quindi non effettua realmente del caching. Piuttosto l’uso di AJAX (forgiando a mano gli header delle richieste http) in quel modo potrebbe rendere inutile questo genere di tracciamento (banalmente, se non viene reinviato l’ETag o l’header “non modified since”, non si riesce a correlare le varie sessioni).
    Però considera che con AJAX tu comunichi con il tuo webserver, sul quale tu avrai messo in piedi il sistema di tracciamento… quindi sarebbe tuo interesse che AJAX ed il tracer funzionino correttamente insieme. Considera anche che questo script non ha bisogno di essere inserito in ogni pagina, basta che per ogni richiesta da parte del client venga richiamato almeno una volta: potrebbe ad esempio far parte del codice che fornisce un’immagine, o ancora meglio, lo script che genera il .js di AJAX…

    Rispondi
  3. maintux

    Bhe effettivamente visto in un ottica più complessa il tuo script va “inglobato” in un sistema server che appunto permette di tracciare le sessioni, potrebbe quindi essere gestito in un ambiente più dinamico, che permette appunto la convivenza di AJAX e del tracer. C’è da lavorarci su…
    E’ comunque un ottimo sputo per una discussione interessante ed evidentemente molto tecnica.

    Ciao e buon lavoro.

    P.S. Ci vediamo al POuL e al Linux-Day

    Rispondi
  4. Opensource Obscure

    Grazie, molto interessante!

    Privoxy a parte, questo sistema viene reso inefficace se il browser e’ configurato per svuotare completamente la cache ad ogni inizio (o fine) sessione. E’ corretto?

    Rispondi
  5. alt-os Autore articolo

    Si, corretto. Anche se adottare questa soluzione senza dotarsi poi di un sistema di randomizzazione dell’indirizzo ip del mittente (come fà tor, per esempio), porterebbe a identificare comunque l’utente (che si connette da una certa classe di indirizzi ip, prevalentemente a determinati orari, solitamente eseguendo operazioni sequenzialmente simili, ma per di più adotta tecniche per tentare di nascondersi. Questo potrebbe addirittura far aumentare l’attenzione nei confronti di quello specifico utente, anziché renderlo anonimo…

    Rispondi

Rispondi

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...