Tecniche d’attacco dei sistemi informatici
Il SYN Flooding
di Roberto Saia
[Pubblicato sul numero 3602 (marzo/aprile 2002) della rivista ipertestuale tecnica Beta]
Interessarsi di sicurezza informatica vuol dire, innanzi tutto, ricercare incessantemente tutte le informazioni utili per comprendere le tecniche adoperate dagli aggressori per eseguire operazioni illecite sui sistemi. Solo in questo modo è possibile ottenere gli elementi che consentiranno in seguito di approntare efficaci contromisure.
Introduzione
Discutere ad un pubblico eterogeneo di sicurezza informatica, fino a non molto tempo addietro, non avrebbe avuto molto senso poiché questi temi sono stati, per un lungo periodo, appannaggio esclusivo degli addetti ai lavori. Oggi la situazione appare molto diversa. La recente diffusione, nelle abitazioni private, di connessioni a larga banda di tipo permanente, come ad esempio ADSL (Asymmetric Digital Subscriber Line), ha invogliato (e spesso costretto) anche l’utente domestico ad interessarsi di questi problemi. Frequentemente, tuttavia, il desiderio di questi utenti d’acquisire informazioni, si scontra con quel dedalo di termini ed acronimi adoperati in questo settore che, pur celando spesso concetti di facile apprendimento, contribuiscono ad allontanare il lettore con i loro nomi altisonanti. Lo scopo di quest’articolo è di far luce su quanto si nasconde dietro ad uno di questi termini: il SYN Flooding.
Sommario
- Descrizione del SYN Flooding
- Il protocollo TCP
- La connessione TCP tra due host
- Il Syn Flooding in pratica
- Il Syn Flooding precursore di un’intrusione
- Difendersi dagli attacchi
- Conclusioni
Descrizione del SYN Flooding
La tecnica del SYN Flooding (inondazione di SYN) rientra in quella categoria d'attacchi informatici definiti DoS (Denial of Service). L’acronimo DoS, che letteralmente si traduce “negazione del servizio”, identifica tutte quelle operazioni condotte allo scopo di rallentare o bloccare completamente il servizio di un host. Le motivazioni che portano a compiere questi gesti possono essere le più disparate: si va dalla vendetta per motivi personali o politici al semplice divertimento. Gli effetti procurati sulle vittime possono anche essere gravi: numerose aziende molto note, del calibro di Yahoo o CNN, hanno subito in passato, a causa di questi attacchi, perdite molto consistenti (nell’ordine dei milioni di dollari) e, inoltre, hanno perso molta della loro attendibilità nei confronti degli utenti. Gli attacchi DoS, in seguito ad un’analisi dei metodi più comunemente adoperati dagli aggressori, possono suddividersi in quattro categorie (Figura 1):
Figura 1 – Categorie d’attacchi DoS.
Osserviamo adesso i metodi utilizzati all’interno delle diverse categorie:
Bandwidth Consumption (consumo della larghezza di banda):
mira ad esaurire, tramite la generazione di una gran quantità di traffico, tutta la banda a disposizione dell’host;
Resource Starvation (esaurimento delle risorse):
consuma alcune risorse di tipo hardware della macchina come, ad esempio, il tempo CPU (Central Processing Unit), la memoria e lo spazio su disco;
Software Bugs (errori di programmazione del software):
sfrutta i difetti di programmazione noti (bugs), presenti all’interno dei software di rete dell’host;
Routing and DNS:
modifica la tabella d’instradamento dei Router o la cache dei server DNS (Domain Naming System), allo scopo di indirizzare tutto il loro traffico verso un determinato host.
Come avremo modo di approfondire in seguito, la tecnica del SYN Flooding si colloca all’interno della seconda di queste categorie (resource starvation) poiché il suo scopo è saturare quella parte di memoria riservata per la cosiddetta "coda di connessione" dell’host preso di mira.
Il protocollo TCP
Per comprendere appieno i meccanismi che permettono l’effettuazione di un SYN Flooding, è indispensabile riepilogare sinteticamente alcune nozioni di base relative al protocollo TCP (Transmission Control Protocol). Iniziamo subito a ricordare che questo è un protocollo di tipo “orientato alle connessioni” (connection oriented). Il suo compito principale è quello di stabilire una connessione logica “punto a punto” (ent-to-end) tra due host e di garantire, inoltre, una consegna senza errori, nel giusto ordine e senza alcuna perdita dei dati. L’unità di trasferimento dei dati, utilizzata dal TCP, prende il nome di segmento. Ogni segmento ha dimensioni variabili ed è costituito da un’intestazione (header) e da un’area dati (Figura 2).
Figura 2 – Il formato dell’intestazione TCP.
Il suo funzionamento, per grandi linee, è il seguente:
- riceve dalle applicazioni di livello superiore un flusso di dati da trasmettere;
- se le dimensioni lo consentono, i dati sono inseriti in un segmento;
- in caso contrario sono divisi su più segmenti (Figura 3), nei quali è apposto un numero di sequenza.
Figura 3 – La suddivisione in segmenti operata dal TCP.
In realtà, il valore inserito nel campo Sequence Number esprime un offset in byte che, in parole povere, rappresenta un puntatore alla posizione del primo byte dei dati. Questo metodo, rispetto ad una numerazione di tipo sequenziale, offre il vantaggio di permettere all’host destinatario di collocare immediatamente i dati nella memoria temporanea (buffer) di ricezione, anche quando questi non sono arrivati nella giusta sequenza.
Illustriamo adesso la funzione dei campi più significativi dell’header TCP, con particolare riguardo al campo flags, poiché il suo compito è molto importante per i fini di quest’articolo:
Source Port e Destination Port (porta origine e porta destinazione):
campi di 16 bit contenenti rispettivamente la porta TCP d'origine e di destinazione. Il meccanismo delle porte permette all’host mittente di distinguere le varie applicazioni di rete presenti sull’host del destinatario;
Sequence Number (numero di sequenza):
campo di 32 bit adoperato per numerare i segmenti inviati. Questo permette il loro corretto assemblaggio una volta giunti a destinazione. Vedremo in seguito che, durante il processo di connessione iniziale tra due host, il valore di questo campo è utilizzato per sincronizzare i rispettivi numeri di sequenza;
Acknowledgement Number (numero di conferma):
campo di 32 bit contenente il successivo numero di sequenza che l’host destinatario si aspetta di ricevere nel traffico di ritorno.
Flags
campo composto di 6 elementi (denominati flag) da un bit ciascuno. Essi possono assumere il valore binario di zero o uno (nel seguito dell’articolo, per riferirmi ad uno di questi flag, adopererò il termine “impostato” intendendo con questo “posto al valore 1”). Questi flag, se impostati, forniscono alcune informazioni di controllo e precisamente:
URG (Urgent Control Bit)– Bit del controllo urgente:
indica che il campo Urgent Pointer contiene un valore valido e va quindi letto;
ACK (Acknowledgement Control Bit)– Bit del controllo delle conferme:
indica che il campo Acknowledgement number contiene un valore valido e va quindi letto;
PSH (Push Control Bit)– Bit del controllo dell’inoltro:
richiede la spedizione immediata dei dati, a prescindere se il buffer di trasmissione sia pieno;
RST (Reset Control Bit) – Bit del controllo del reset:
richiede di stabilire nuovamente la sessione. Nel caso sia presente una connessione, questa viene completamente riavviata;
SYN (Synchronize Control Bit)– Bit del controllo della sincronia:
durante il tentativo di instaurare una sessione TCP, indica la necessità di sincronizzare i Sequence Number dei due host;
FIN (Finish Control Bit)– Bit del controllo di fine invio:
segnala che l’host mittente non ha più alcun dato da trasmettere.
La connessione TCP tra due host
Nel momento in cui due host decidono di comunicare tramite il protocollo TCP, scambiano tra loro alcune informazioni. Questo processo, che genericamente è definito handshake (stretta di mano), nel caso del TCP prende il nome di three-way handshake (handshake a tre vie), esso è articolato in tre fasi sequenziali (Figura 4). In pratica:
FASE 1:
l’host mittente invia al destinatario un pacchetto TCP con il flag SYN impostato, manifestando così l’intenzione di sincronizzare i Sequence Number. A tal fine imposta un valore nel campo Sequence Number. Quest'ultimo valore prende il nome d’ISN (Initial Sequence Number);
FASE 2:
l’host destinatario, se disponibile a stabilire una sessione, risponde inviando un pacchetto TCP con impostati i flag ACK e SYN. Con ACK conferma la sua disponibilità ed invia tramite il campo Acknowledgement Number il valore del Sequence Number ricevuto, incrementato di un’unità. Questo attiva la connessione in un senso. Tramite l’invio del SYN, invece, manifesta l’intenzione di attivare la connessione anche nell’altra direzione ed invia il suo ISN per mezzo del campo Sequence Number;
FASE 3:
l’host mittente, ricevuto il pacchetto con i flag ACK e SYN impostati, risponde all’ACK attivando la connessione in un senso e al SYN nel modo già visto all’interno nella seconda fase. A questo punto s’instaura una connessione in entrambi le direzioni (full duplex), ed è possibile iniziare lo scambio dei dati.
Figura 4 - Three-way handshake del TCP
Il Syn Flooding in pratica
Gli attacchi di tipo SYN Flooding sfruttano un’anomalia architetturale del protocollo TCP, intervenendo nel processo di three-way handshake visto in precedenza. Il meccanismo è molto semplice: l’handshake è intenzionalmente interrotto dall'attaccante dopo l’invio del primo pacchetto (SYN), infatti, quando l’host destinatario invierà il suo SYN/ACK, non riceverà mai, come risposta, il previsto ACK (figura 5).
Figura 5 – SYN Flooding in pratica
Considerando che ogni host, durante il three-way handshake, memorizza in una particolare e limitata zona di memoria (coda di connessione) tutte le informazioni riguardanti le connessioni incomplete, rimuovendole da questa solo quando queste terminano in modo corretto o allo scadere di un certo intervallo di tempo prefissato (timeout), l’operazione prima descritta, ripetuta più volte, genera la congestione di quest’area. Le conseguenze sono: l’incapacità dell’host di dar seguito a nuove richieste e, conseguentemente, il blocco del servizio attivo sulla porta in uso.
Occorre evidenziare che, a causa delle dimensioni finite dell'area di memoria destinata a contenere la coda di connessione, anche quando le macchine sono capaci di gestire migliaia di connessioni contemporaneamente, sono sufficienti poche decine di queste “mezze connessioni” per ottenere il risultato visto in precedenza.
Il SYN Flooding precursore di un’intrusione
Il blocco di uno specifico servizio dell’host, effettuato tramite un SYN Flooding spesso costituisce solo la fase preliminare di un attacco più articolato. Questo scenario si presenta, ad esempio, durante i cosiddetti “dirottamenti di sessione” (IP Hijacking) dove, profittando di una relazione di fiducia (Trusting Relation) esistente tra due host, l’aggressore ne mette fuori servizio uno, impersonandolo in seguito (IP Spoofing), per accedere con i suoi privilegi all’altro host.
Figura 6 – Dirottamento di sessione
Un altro importante risultato, che questo tipo d’attacco permette di conseguire, è quello di costringere la vittima ad eseguire un riavvio dell’host. Lo scopo dell’operazione è di rendere effettive alcune modifiche, effettuate in precedenza dall’aggressore sul sistema, che richiedono un riavvio della macchina.
Difendersi dagli attacchi
Sebbene in passato gli attacchi basati sul SYN Flooding abbiano causato non pochi danni, attualmente sono disponibili diverse soluzioni per contrastarli: la quasi totalità degli odierni sistemi di protezione perimetrali, come ad esempio i firewall, implementa adeguati meccanismi di difesa e quasi tutti i sistemi operativi, o in modo nativo, nel caso delle ultime versioni o tramite l’applicazione d'apposite correzioni (patch), in quelli meno recenti, dispongono d’adeguate protezioni. I metodi principali, utilizzati a tal fine, sono i seguenti:
Aumentare la dimensione dell’area di memoria destinata a contenere la coda di connessione:
A seconda del tipo d'implementazione del protocollo (stack IP), potrebbe essere possibile modificare questo parametro. Questo non è, in ogni caso, un rimedio efficace poiché riduce solo le conseguenze dell’attacco che, se opportunamente raffinato, può tranquillamente scavalcare questa protezione. Una soluzione di questo tipo, inoltre, grava sulle risorse di sistema e conseguentemente anche sulle prestazioni generali della macchina;
Ridurre l'intervallo di tempo dedicato alla realizzazione delle connessioni:
Ridurre quest'intervallo (Connection Establishment Timeout) può essere utile per contrastare il SYN Flooding ma, purtroppo, non rappresenta una soluzione definitiva. L’aggressore può, infatti, aumentare la frequenza d'invio dei pacchetti per scavalcare questa protezione;
Utilizzare una coda di connessione dinamica:
Questo meccanismo, adoperato su alcuni sistemi operativi della Microsoft (da Windows NT 4.0 con applicato il Service Pack 2), si occupa di aumentare la dimensione della coda di connessione ogni volta che questa supera un certo valore prestabilito;
Implementare i SYN Cookies:
I SYN Cookies, implementati nelle recenti versioni del kernel di Linux, avvalendosi di un protocollo d'autenticazione crittografica (Challenge/Reply), riescono a distinguere le connessioni legittime da quelle provenienti da un attacco SYN Flooding, respingendo automaticamente queste ultime;
Impiegare software specializzato:
E’ possibile adoperare degli appositi software in grado di controllare costantemente l’attività della rete. Nel momento che questi rivelano un attacco inviano, in modo automatico e mirato, degli adeguati pacchetti TCP, che terminano le connessioni incomplete generate dal SYN Flooding e, di conseguenza, liberano la coda di connessione dell’host.
Conclusioni
A questo punto appare doveroso, da parte mia, informare il Lettore di una mia volontaria omissione all’interno dell’articolo. Affinché questi attacchi DoS siano efficaci, è indispensabile, infatti, un requisito fondamentale: l’aggressore deve mascherare l’indirizzo IP (Internet Protocol) di provenienza del pacchetto. La tecnica che permette di compiere quest’operazione, già citata parlando dei dirottamenti di sessione, prende il nome di “IP Spoofing” (falsificazione dell’indirizzo IP); essa permette la sostituzione, in modo arbitrario, del valore presente nel campo source address dell’header IP, valore che identifica, appunto, l’indirizzo d’origine del pacchetto. Lo scopo di quest’operazione è, innanzi tutto, quello di non permettere l’identificazione dell’aggressore e, cosa ancora più importante, far sì che durante l’attacco nessuno risponda ai pacchetti inviati dall’host vittima. Per fare questo, occorre che l’aggressore utilizzi un indirizzo non raggiungibile, in modo da non rischiare che un host realmente esistente risponda, in maniera standard, con un pacchetto contenente il flag RST impostato, per porre fine ad una connessione mai richiesta e di conseguenza invalidando l’attacco in corso. Quanto detto fin ora, nei riguardi del protocollo IP e della sua relativa tecnica di Spoofing, sarà in ogni modo affrontato, in maniera dettagliata, all’interno di un prossimo articolo sull’argomento.
Ritorna all'indice degli articoli
|