# DNS cache poisoning

Il DNS cache poisoning (in italiano avvelenamento della cache DNS) è un attacco informatico ad un server DNS tale che chiunque richieda un dominio venga, senza rendersi conto, reindirizzato ad un altro server.

## Introduzione

Il DNS cache poisoning è un attacco informatico che mira a modificare la cache dei name server in modo da alterare l'associazione indirizzo IP / nome del server; in particolare la tecnica si basa sull'inserimento in cache di record falsi con un TTL (Time to live, ovvero un periodo di vita dei dati nella cache) molto grande, cosicché il server DNS lo conserverà in cache per molto tempo. Ciò consente di reindirizzare un nome di dominio web (del tipo www.wikipedia.org) verso un indirizzo IP diverso da quello originale.
Quest'attacco può avere diversi obiettivi, molti tra i quali:
* diffusione di virus o worm (facendo credere all'utente di scaricare file non infetti);
* phishing o pharming per raccogliere informazioni personali, recuperare password, ecc;
* attacco man in the middle (monitorando il traffico degli utenti);
* attacco Denial of Service (facendo credere all'utente che il server non è disponibile).

## Panoramica sul DNS

Il DNS (Domain Name System) è un sistema utilizzato per la risoluzione di nomi dei nodi della rete (in inglese: host) in indirizzi IP e viceversa. Il servizio è realizzato tramite un database distribuito, costituito dai server DNS. Il DNS ha una struttura gerarchica ad albero rovesciato ed è diviso in domini (com, org, it, ecc.). Ad ogni dominio o nodo corrisponde un nameserver, che conserva un database con le informazioni di alcuni domini di cui è responsabile e si rivolge ai nodi successivi quando deve trovare informazioni che appartengono ad altri domini.
Si supponga il nome di dominio www.provawiki.org; quando il DNS viene interrogato possono verificarsi 3 casi:
* Il DNS è autoritativo per il dominio richiesto
* Il DNS non è autoritativo per il dominio richiesto ma lo contiene nella propria cache
* Il DNS non è autoritativo per il dominio richiesto e non lo contiene nella propria cache
Nell'ultimo caso possono verificarsi le seguenti possibilità:
* La richiesta è iterativa
* La richiesta è ricorsiva: Il DNS invia una richiesta al DNS di livello superiore (ad esempio nel nostro caso potrebbe essere il DNS autoritativo per la risoluzione dei domini .org che a sua volta effettua una richiesta autoritativa per provawiki.org che restituisce l'indirizzo IP al DNS dei domini .org che lo restituisce al nostro DNS e quindi al richiedente).

## L'attacco

L'attacco sfrutta alcuni campi delle richieste DNS (DNS query):
* l'ID (evidenziato in grigio nella figura) identificatore ID di 16 bit associato a ciascuna richiesta che il DNS richiedente inoltra ad un server autoritativo; le risposte del server autoritativo inviate al DNS richiedente dovranno avere lo stesso ID delle richieste, altrimenti il DNS richiedente provvederà a scartarle
* Il campo QUESTION (sempre in grigio) contiene il nome di dominio richiesto e il tipo di record che devono essere inviati come risposta.
Una DNS query la possiamo immaginare nel modo seguente:
Il DNS cache poisoning è applicabile solo alla modalità ricorsiva e affinché vada a buon fine è necessario capire l'ID delle richieste. Inoltre le risposte devono arrivare con la stessa porta sorgente della richiesta ed essere coerenti con la domanda effettuata.
Per l'attacco vi sono due varianti:
* attacco basato sul birthday paradox
* attacco con l'aggiunta di diverse informazioni

### Attacco basato sul birthday paradox

Questo attacco si basa sul fatto che un identificatore a 16 bit non garantisce una sufficiente sicurezza. BIND, che stabilisce un ID, è il software utilizzato dalla maggioranza dei server DNS in rete. L'ID può essere ricavato utilizzando la tecnica del birthday paradox che sfrutta le "vulnerabilità" del BIND: la prima è l'impossibilità di generare sequenze di numeri puramente casuali, la seconda invece riguarda l'invio simultaneo di richieste per lo stesso dominio (se infatti vengono inviate un numero N di richieste al DNS vittima, questo invia a sua volta un numero N di richieste al DNS successivo, ognuna con ID differenti).
L'attacco è il seguente ed è simile allo spoofing:
* L'attaccante registra un dominio, ad esempio www.attack.com, il cui indirizzo IP è w.x.y.z e, su questo dominio, attiva un server DNS.
* Dopodiché, per capire l'ID, utilizzato per le richieste dal server vittima, invia un numero elevato di richieste fasulle al server vittima, ad esempio www1.provawiki.com, www2.provawiki.com, ecc. Utilizzando la tecnica del birthday paradox è possibile predire quale sarà il prossimo ID che il server vittima utilizzerà.
* L'attaccante, tramite il suo DNS, invia una richiesta al server vittima per il sito www.provawiki.com; il DNS riferito alla vittima, poiché il sito non è presente nella sua cache, contatterà il DNS dei domini .com, che a sua volta contatterà il DNS autoritativo provawiki.com, il quale risponderà in seguito, con l'ID corretto, al DNS di partenza.
* Il ruolo del DNS dell'attaccante è quello di fingersi il DNS autoritativo provawiki.com , inviando la risposta "avvelenata" sempre con l'ID corretto. Se la risposta del DNS dell'attaccante arriva prima di quella del DNS originale, allora nella cache del DNS di partenza (server vittima) verrà salvata una corrispondenza con nome www.provawiki.com e indirizzo IP w.x.y.z. (la risposta "giusta" verrà scartata), dove rimane per un certo tempo, definito dal TTL.
* Da questo istante ogni volta che la vittima vorrà accedere al sito www.provawiki.com, sempre se non sia scaduto il tempo in cache, verrà reindirizzata, senza rendersi conto, al sito www.attack.com.
I vecchi DNS Server usavano un unico ID che veniva incrementato per le richieste successive, quindi facile da predire. Con la randomizzazione i possibili diversi identificativi sono 65636 (2^16), ovvero l'attaccante deve indovinare un intero in questo range in tempo utile; sfruttando la formula matematica utilizzata per dimostrare il birthday paradox e con un numero elevato di richieste fasulle al DNS vittima, sarà possibile risalire all'ID con una probabilità di successo vicina al 100%. La difficoltà di questo attacco diventa maggiore se anche la porta è randomizzata.

### Attacco con l'aggiunta di diverse informazioni

Supponiamo che l'attaccante registri un dominio, ad esempio www.attack.com, e su questo attivi un server DNS. L'obiettivo è sempre quello di "avvelenare" la cache del server vittima, procedendo nel modo seguente:
* L'attaccante invia una richiesta al server vittima per il sito www.attack.com.
* Il DNS riferito alla vittima, poiché il sito non è presente nella sua cache, contatterà il DNS del dominio (DNS gestito dall'attaccante).
* Il DNS gestito dall'attaccante invia la risposta con informazioni riguardanti il sito www.attack.com e altre riguardanti siti differenti, ad esempio il reindirizzamento del sito www.it.wikipedia.org all'indirizzo IP w.x.y.z. Queste informazioni vengono poi memorizzate nella cache del server vittima per un certo tempo (definito dal TTL).
* Quando l'host vittima tenterà di accedere a www.it.wikipedia.org verrà reindirizzato, senza rendersi conto, all'indirizzo IP w.x.y.z

## Contromisure

Oggi le difese sono state migliorate e ai server DNS sono state aggiunte patch per evitare attacchi di questo tipo. Le contromisure che comunque si possono attuare sono:
* Utilizzare un server che genera un'ID dei pacchetti in maniera casuale e allo stesso modo sceglie un numero di porta di comunicazione.
* Aggiornare ad esempio BIND, che è stato migliorato nelle ultime versioni, all'ultima versione stabile disponibile.
* Utilizzare DNSSEC (Domain Name System Security Extensions) che supporta l'autenticazione dell'origine e il controllo di integrità per ciascuna richiesta attraverso meccanismi di firma digitale.