Onion routing è una tecnica di anonimizzazione delle comunicazioni in una rete di telecomunicazioni. In una rete onion, i messaggi sono incapsulati in "strati" di crittografia che vengono paragonati agli strati di una cipolla, dato l'incapsulamento. Il dato criptato viene trasmesso attraverso una serie di nodi, chiamati onion router, ognuno dei quali "sbuccia" via un singolo strato di crittografia, scoprendo così il prossimo nodo di destinazione del dato. Il mittente rimane anonimo perché ciascun intermediario conosce solo la posizione del nodo immediatamente precedente e di quello immediatamente successivo.
Descrizione Sviluppo e implementazione L'Onion routing è stato sviluppato a metà degli anni ‘90 presso il Laboratorio di Ricerca Navale degli Stati Uniti (U.S. Naval Research Laboratory), da parte di Paul Syverson, Michael G. Reed e David Goldschlag, per proteggere l'intelligence online degli Stati Uniti. È stato ulteriormente sviluppato dal DARPA (Defense Advanced Research Projects Agency) e brevettato dalla Marina degli Stati Uniti nel 1998.
Gli informatici Roger Dingledine e Nick Mathewson si incontrarono a Syverson nel 2002 per sviluppare quella che sarebbe diventata la più grande e nota implementazione dell'onion routing: The Onion Router o, in forma abbreviata, TOR. Il Laboratorio Di Ricerca Navale degli Stati Uniti rilasciò il codice sorgente di TOR con licenza gratuita, mentre Dingledine, Mathewson e altri cinque sviluppatori fondarono nel 2006 l'organizzazione no-profit chiamata "The Tor Project", con il sostegno finanziario della Electronic Frontier Foundation e altre diverse organizzazioni.
Struttura e dati Nell'esempio in figura il nodo origine invia una onion, ovvero un dato coperto da diversi strati di crittografia, al router A, il quale rimuove uno strato di crittografia e scopre in questo modo qual è il nodo successivo a cui deve essere inviato il dato, e da quale nodo proveniva la cipolla. Il router A così invia la cipolla, privata di uno strato, al router B, il quale decripta (cioè "sbuccia") un altro strato di crittografia e a sua volta invia la cipolla, privata di un secondo strato, al router C. Il router C rimuove lo strato di crittografia finale e trasmette quindi il dato al nodo destinatario.
Un dato onion è quindi una struttura dati formata da un messaggio che è stato "avvolto" da strati di crittografia, uno successivo all'altro, che saranno decifrati (ovvero "sbucciati") da tanti nodi intermediari quanti sono gli strati di crittografia, prima di arrivare al nodo destinazione. Il messaggio originale rimane evidentemente nascosto per tutto il tragitto che fa attraverso i nodi intermediari, nessun nodo intermediario è a conoscenza né del nodo sorgente né del nodo destinazione. Ciò permette quindi al nodo mittente di rimanere anonimo.
Funzionamento generale Per creare e trasmettere un dato cipolla, il nodo mittente seleziona un insieme di nodi intermediari da una lista nodi che gli viene fornita da un nodo "Directory". I nodi intermediari selezionati sono quindi disposti lungo un percorso, chiamato catena ("chain") o circuito ("circuit"), attraverso cui viene trasmesso il dato cipolla. Per conservare l'anonimato del nodo mittente, nessun nodo del circuito è in grado di dire se il nodo a lui precedente è anch'esso un nodo intermediario o se si tratta proprio del nodo mittente. Analogamente, nessun nodo del circuito è in grado di dire attraverso quanti nodi il dato cipolla passerà prima di arrivare al nodo destinazione, chiamato anche Exit Node (nodo di uscita), inoltre nessun nodo del circuito è in grado di sapere quale posizione della catena occupa.
Si ipotizzi che Alice sia il PC, con Tor browser installato, che vuole mandare un messaggio utilizzando il protocollo Onion. Il computer di Alice deve ovviamente avere una scheda di rete installata, un sistema operativo (non importa quale sia il tipo) e un browser.
Quindi si supponga che il server di Destinazione attraverso il quale Alice sta tentando di accedere sia un semplice web server senza VPN, né proxy e senza nessuna infrastruttura di tipo Tor all'interno di esso;
Come si può notare, con una configurazione del genere, chiunque stia tentando di ascoltare il traffico in uscita dal computer di Alice può sapere a quale server Alice sta facendo la richiesta, chi ha fatto la richiesta e a chi è rivolta la richiesta. Per questo motivo, al fine di nascondere il mittente della request (Alice), viene installato su Alice un Tor browser, o alternativamente un Tor proxy da agganciare al browser di Alice (per fare questo esistono diversi tool in rete).
Una delle caratteristiche del browser Tor è che, attraverso il suo utilizzo, si garantisce all'utente il completo anonimato. Ovviamente se l'utente comincia ad effettuare pagamenti su internet utilizzando la propria carta di credito, o se utilizza i propri dati personali (es. carta d'identità, patente di guida, codice fiscale etc.), il grado di anonimato si riduce drasticamente, allo stesso modo se ci si registra in qualche sito internet con le proprie credenziali.
Per prima cosa Alice, che è il nodo mittente, attraverso Tor browser, contatta i nodi Tor chiamati nodi di Directory. Questi nodi di Directory non sono altro che server ridondanti e di fiducia messi a punto da chi ha progettato il protocollo Onion, i quali forniscono la lista di tutti i nodi Tor presenti in rete. Il browser Tor di Alice farà il download di questa informazione al fine di costruire una catena di nodi o circuito. Di default Tor browser sceglie in modo casuale 3 nodi per costruire il circuito.
Nella terminologia di Tor, i nodi prendono un particolare nome a seconda della loro posizione nel circuito: il primo nodo si chiama Guard Node (nodo di guardia) o Entry Node (nodo di ingresso), il secondo Middleman Node (nodo intermediario) e il terzo Exit Node (nodo di uscita). Si faccia attenzione poiché l'Entry Node non è il nodo mittente (Alice), ma è il nodo immediatamente successivo, allo stesso modo l'Exit Node non è il server di destinazione della request di Alice, ma è il nodo immediatamente precedente a tale server. La scelta dei nodi di una catena viene effettuata dal browser Tor di Alice in base alle informazioni ricevute dal directory server: ogni nodo Tor quando si registra presso le directory invia il proprio indirizzo IP e una serie di caratteristiche. Gli Exit Nodes sono i più importanti: i dati che escono da questi nodi potrebbero non essere protetti da crittografia (se ad esempio Alice non ha effettuato una chiamata in HTTPS, o protetta da SSL/TLS, ma ha usato HTTP, le info dall'Exit Node al server di destinazione viaggiano in chiaro). Parimenti, i Guard Nodes vincono questo status quando hanno servito la rete Tor per un lungo periodo: sono nodi fidati a cui possiamo affidare il primo passo per entrare nella rete. Tutti i rimanenti nodi sono considerati nodi intermediari. Il perché di queste scelte e di questa classificazione è che solo il primo e l'ultimo nodo della catena rappresentano i punti deboli attraverso cui è possibile attaccare il protocollo.
Il circuito viene esteso un salto alla volta, ogni nodo lungo il percorso conosce solo il nodo che gli ha fornito le informazioni e verso che nodo inoltrarle. Nessun nodo conosce il percorso completo che il pacchetto ha preso.
Il protocollo prevede la negoziazione di un nuovo insieme di chiavi crittografiche per ogni salto lungo il circuito, per assicurarsi che nessun nodo della catena possa tracciare queste connessioni durante il passaggio. I dati inviati vengono subito incapsulati in una sequenza di strati criptati, uno per ogni specifico nodo che verrà attraversato. Ogni nodo sarà in grado di aprire unicamente il proprio strato, cioè lo strato più esterno della cipolla, rendendo possibile l'inoltro del nuovo livello criptato al nodo successivo. Con questa struttura di trasmissione "a cipolla" il percorso e i dati rimangono al sicuro da possibili analisi di traffico.
Una volta che un circuito è stabilito, si possono scambiare diversi tipi di dati e usare molti tipi di applicazioni attraverso una rete onion. Poiché ogni server non vede che un singolo salto nel circuito, né un intercettatore e neppure un nodo compromesso possono utilizzare le tecniche di analisi del traffico per collegare la sorgente con la destinazione della connessione.
Funzionamento in particolare Ogni nodo che compone la rete prende il nome di ONION ROUTER (OR) mentre ogni Host che usufruisce di tale rete per veicolare anonimamente le proprie comunicazioni su internet prende il nome di ONION PROXY (OP). Riferendosi all'esempio precedente OP è Alice.
Quando un client desidera comunicare tramite questo sistema sceglie un percorso composto da diversi OR (N.B. se uso Tor di default 3 OR), dove ogni OR conosce il nodo che lo precede e quello successivo ma non conosce gli altri nodi che compongono l'intero percorso. In questo modo il client OP può inviare i propri dati cifrati lungo il percorso di OR, dove ogni OR è in grado di decifrare e quindi leggere la porzione di dati ad esso destinata mediante una chiave simmetrica. La stessa operazione viene eseguita per i restanti OR sul percorso fino a che i dati non arrivano a destinazione. I dati vengono inviati in celle di lunghezza fissa al fine di impedire qualsiasi correlazione tra la lunghezza dei dati inviati e la loro natura.
Autenticazione OP-OR e autenticazione OR-OR
Prima di iniziare qualsiasi connessione il client OP si connette al directory server e scarica la lista dei nodi OR disponibili e delle chiavi di identificazione di questi ultimi. Quando un client OP si connette ad un nodo ORx, ORx si autentica a OP inviandogli una catena composta da due certificati: il primo certificato usando una chiave di connessione temporanea e il secondo certificato autofirmato contenente la chiave di identificazione del nodo ORx. Il client OP può verificare la validità della chiave di identificazione fornita dal nodo ORx con quella scaricata dal directory server e rifiutare la connessione nel caso quest’ultima dovesse risultare non valida. Due nodi OR invece eseguono una mutua autenticazione utilizzando una procedura simile a quella descritta in precedenza: Un nodo ORx deve rifiutare una connessione a/da un ORy la cui chiave di identificazione non dovesse risultare valida o il cui certificato sia malformato o mancante.
Trasmissione dei dati
Una volta stabilita una connessione TLS tra le due entità (OP-OR oppure OR-OR), esse incominciano a scambiarsi i dati in celle di lunghezza fissa pari a 512 byte che vengono inviate in maniera sequenziale, questo impedisce qualsiasi attacco di correlazione tra la lunghezza dei dati e la natura del traffico stesso. La connessione TLS tra OP-OR oppure OR-OR non è permanente, una delle due parti coinvolte nella comunicazione può interrompere la connessione se non transitano dati per un tempo pari al KeepalivePeriod che di default vale 5 minuti.
Formato delle celle
I dati scambiati tra due entità all'interno di un sistema di Onion Routing prendono il nome di celle, esse hanno una grandezza fissa di 512 byte. Ogni cella è composta da 2 campi che hanno funzioni di controllo e dal payload che contiene i dati trasmessi dall'applicazione.
CircID: Serve ad indicare a quale circuito virtuale è associata la cella, infatti ogni nuova connessione effettuata da un’applicazione del client OP può essere instradata tramite un percorso di nodi OR differente. Command: In base al valore della cella Command si definisce la tipologia della cella. Contiene il valore relativo ad uno dei comandi supportati dalle specifiche del protocollo e può assumere i seguenti valori:
PADDING (Padding) CREATE (Crea un circuito) CREATED (Conferma creazione) RELAY (Invio dati) DESTROY (Chiude un circuito) CREATE_FAST (Crea un circuito) CREATED_FAST (Conferma Creazione)