web analytics

Rainbow attacks – l’importanza di creare password sicure

Cos è un rainbow attack? E come possiamo difenderci?
Cerchiamo di capire quanto può essere facile per un cracker bucare la nostra sicurezza, se non prestiamo la dovuta attenzione alle nostre password. Da anni è noto che i meccanismi di sicurezza basati sull’uso di password non sono del tutto sicuri. Perché?
Ci sono molte risposte a questa domanda, ma in questo articolo vorrei approfondirne una in particolare: a causa degli attacchi rainbow (letteralmente: attacchi arcobaleno).
Una piccola introduzione per capire di cosa sto parlando è necessaria.


Utilizziamo a titolo di esempio un caso molto comune: la necessità di doversi collegare ad un server remoto utilizzando una password.
Il modo più semplice per farlo sarebbe:

  1. Registrarci sul server, in modo da permettergli di salvarsi la nostra password
  2. Al momento del login, inviare username e password al server
  3. Il server potrà confrontare la nostra password con quella immagazzinata e, quindi, decidere se autorizzare o meno l’accesso.

Questo semplice meccanismo ovviamente è del tutto insicuro: chiunque potrebbe “veder passare” (tecnicamente, “sniffare”) la nostra password, e riutilizzarla per accedere a nostro nome al server.
Solitamente quindi, le password non vengono fatte “viaggiare” qua e la in chiaro per le reti, né memorizzate in chiaro in luoghi facilmente accessibili. Questo, ovviamente, per evitare che i “curiosi” possano mettersi ad osservare il traffico di rete e scoprire quindi senza sforzo la nostra password.
Buona parte degli algoritmi di sicurezza quindi “oscurano” le password sfruttando le funzioni di hash; queste sono delle vere e proprie funzioni matematiche che hanno l’interessantissima proprietà di non essere invertibili. Sulle reti verranno quindi fatte viaggiare non le password, ma il risultato delle funzioni di hash. Interpretando correttamente questi dati, è possibile realizzare algoritmi decisamente più sicuri che impediscono agli “sniffer” di avere vita facile.

Cerchiamo di capire meglio questi concetti con un semplice esempio:

Poniamo che la nostra password sia un numero: 7.
Ora, poniamo che la nostra funzione di hash sia “Il resto della divisione per 10”.
Applichiamo quindi questa funzione alla nostra password: il resto di 7/10 è 7.
Poniamo ora che la nostra password sia un altro numero: 17.
Utilizziamo ancora la stessa funzione di hash: il resto di 17/10 è ancora 7.
La nostra funzione non è quindi invertibile, vale a dire: dato l’output (7) non posso ricavare l’input (7 o 17?) perché ci sono infiniti valori di input in grado di darmi quello stesso output. Sarà ancora possibile pero’ capire se siamo o meno in possesso della corretta password, facendo un controllo sul risultato. Nella realtà, le funzioni di hash sono molto più complesse di quella proposta in questo esempio: largamente utilizzate (nonostante siano ad oggi notoriamente vulnerabili) sono MD5 e SHA1; queste funzioni possono “ingerire” una qualunque quantità di byte, e dare quindi in output delle stringhe di lunghezza fissa.
Possiamo ora autenticarci in tutta sicurezza al nostro server, perché non gli dobbiamo mandare la nostra password, ma il relativo MD5. Ma quanto c’è di vero in quest’ultima frase? Molto poco purtroppo, per colpa dei rainbow attacks – letteralmente “attacchi ad arcobaleno”.
Questi attacchi funzionano in maniera molto semplice: anche se è vero che non è possibile calcolare la funzione inversa di un MD5, nulla vieta di memorizzare da qualche parte che la stringa ‘0c88028bf3aa6a6a143ed846f2be1ea4’ è l’MD5 della stringa ‘pippo’. Precisamente, quel ‘da qualche parte’ è una rainbow table – tabella arcobaleno – una struttura ottimizzata per gestire milioni di coppie <stringa, hash> e per garantire tempi di accesso estremamente bassi in fase di ricerca. Ovviamente, è impossibile creare tabelle che contengano tutte le possibili stringhe e i relativi hash, ma è relativamente semplice crearne una utilizzando parole di uso comune.
Ora dovrebbe risultare con chiarezza la debolezza intrinseca di questi algoritmi apparentemente infallibili: se uno sniffer “ruba” il nostro hash, potrebbe trovare con grande facilità nella sua rainbow table la relativa password, se questa fosse una parola di uso comune.
Vogliamo vedere quant’è facile fare una prova pratica? Usiamo la password ‘arcobaleno’.
Primo passo quindi, utilizziamo la nostra funzione di hash per scoprire quello che, utilizzando questa password, viaggerebbe per la rete:
Da terminale:
echo -n arcobaleno | md5sum
L’opzione -n serve a non dare al programma md5sum il carattere di newline (usato di default da echo).
Otterremo quindi come output la stringa ‘a7c7f747d1ef73b299d0cbd869bd4828’. Teoricamente, da essa è impossibile ricavare la nostra password.
Ora ci serve una rainbow table. Possiamo provare ad utilizzare un sito dedicato:
O, ancora più semplicemente, a cercare quella stringa su Google!
Pochi secondi e… Password rivelata!
Ok, adesso sono pronto a scommettere che state provando le vostre password… Quanti di voi hanno appena deciso di cambiarla?
Ovviamente, negli anni si è cercato di mitigare la debolezza di questo meccanismo introducendo il cosiddetto “sale”: questo è semplicemente un numero casuale che viene associato alla nostra password. Non tutti pero’ lo usano e, soprattutto, non mette al riparo da attacchi più elaborati di questo.
Il modo migliore per proteggersi quindi è dare alle password la giusta attenzione: evitate parole di uso comune e, perché no, fate un test per vedere se qualcuno l’ha già inserita in una rainbow table!
Se avete buona memoria e volete andare sul sicuro, il Pinguino può regalarci password completamente casuali, basta chiedere al terminale:
echo $( cat /dev/urandom | tr -cd [:alnum:] | head -c 8 )
Ed eccovi una password alfanumerica di 8 caratteri fresca fresca.

Ok, ci vuole DAVVERO un’ottima memoria! 😉