2. 1 Introduzione
Ore di lavoro per installare il nostro Windows XP nuovo fiammante,
aggiornato all’ultimo bugfix; scelta una buona password alfanumerica final-
mente cediamo alle tentazioni di Morfeo, tranquilli che il nostro sistema sia
perfettamente sicuro.
Quanti si riconoscerebbero in tale descrizione?
Quale che sia il vostro sistema, simili supposizioni sono totalmente infondate
(perfettamente sicuro un sistema multiutente connesso alla rete? non scher-
ziamo!), tantopi´ se il vostro ambiente ´ di stampo Microsoft, azienda che
u e
ha fatto della semplicit´ ma non certo della sicurezza il proprio cavallo di
a
battaglia. Quindi giusto per rovinare il vostro meritato riposo vi informo che
chiunque, senza scomodare i grandi esperti di sicurezza, potrebbe decifrare
la vostra password in qualche decina di secondi (in senso letterale!).
“Ma come? Un normale attacco brute-force pu´ richiedere anni (o anche
o
secoli con taluni algoritmi!) e sono sicuro che la mia password non sia cos´
ı
classica da potersi facilmente ritrovare in un dizionario!”
2 Password e Hash
Torniamo un attimo indietro e introduciamo come vengono memorizzate le
nostre password: ovviamente non desideriamo che tali sensibili informazio-
ni risultino leggibili in chiaro perci´ ci affidiamo a particolari algoritmi di
o
cifratura (detti “one-way”, a senso unico) che codificano secondo funzioni
matematiche non invertibili la nostre password; ci´ significa che non ´ possi-
o e
bile decodificarle direttamente a partire dal risultato cifrato.
Questo valore generato ´ detto hash ed ´ teoricamente univoco, non do-
e e
vrebbero esistere due stringhe diverse che codificate generino lo stesso hash:
tale eventualit´ ´ chiamata collisione e una sua scoperta porter´ lentamente
ae a
l’algoritmo ad essere dichiarato non sicuro; tra le altre propriet´ comuni alla
a
maggior parte delle funzioni di hashing ricordo infine la dimensione prefissata
dell’hash qualunque sia la lunghezza del messaggio cifrato.
Dunque quando digitiamo la nostra password viene ricalcolato il codice hash
con la medesima funzione e confrontato il risultato con quello in memoria.
Le combinazioni possibili (variano tra algoritmi) sono superiori all’ordine dei
2
3. milioni di miliardi, lasciandoci ingannevolmente sicuri sull’indecifrabilit´ del
a
nostro codice.
Spendiamo infine poche ultime righe per introdurre un’altra notevole poten-
zialit´ delle funzioni di hashing, la certificazione: notando infatti che non do-
a
vrebbero esistere due messaggi generanti lo stesso valore hash risulta evidente
come quest’ultimo rappresenti una sorta di impronta digitale dell’informazio-
ne che l’ha prodotto. Questa particolarit´ permette l’uso di valori hash come
a
certificazione dell’autenticit´ di un messaggio: se esso venisse modificato,
a
quasi sicuramente cambierebbe anche l’hash corrispondente; ci´ ´ applicabile
oe
in qualsiasi contesto, per esempio ´ frequentemente in uso nelle reti peer-to-
e
peer per ricercare i files (anche se i vari peer li avessero memorizzati su disco
con nomi diversi l’hash rimarrebbe uguale).
3 Le Rainbow Tables
Veniamo ora alle Rainbow Tables. L’idea part´ negli anni Ottanta dal mate-
ı
matico americano Martin Hellman: il segreto ´ una tecnica chiamata time-
e
memory trade-off (tradotto “compromesso tempo-memoria”) di cui le
Rainbow Tables sono una raffinata evoluzione.
Alla base c’´ una considerazione piuttosto semplice: perch´ cifrare ogni vol-
e e
ta tutte le possibili combinazioni fino a ricavare l’hash corrispondente alla
password cercata? Se avessi anzitempo criptato e memorizzato ogni combi-
nazione possibile, una sorta di elenco telefonico dell’algoritmo, potrei molto
pi´ agilmente eseguire una ricerca nel mio archivio e trovare l’hash corrispon-
u
dente, risparmiando notevole tempo; infatti il maggior spreco di burst time
della cpu ´ proprio nella codifica ripetuta delle password, non nel confronto.
e
Compreso ci´ sussiste solo un problema: un archivio tale da contenere tutti
o
gli hash frutto delle combinazioni alfanumeriche di password sufficentemente
lunghe supererebbe le decide di terabyte (1 terabyte = 1024 gigabyte)!
Un comune elaboratore non possiede n´ tanta memoria n´ sufficente potenza
e e
per analizzarla: ecco intervenire le Rainbow Tables.
3.1 L’idea di Oechslin
Philippe Oechsin, un esperto in sicurezza, ha ideato un procedimento per
ridurre un archivio di hash in una tabella molto pi´ piccola.
u
Non ´ scopo di questo breve documento illustrare in modo dettagliato le fun-
e
3
4. zioni matematiche alla base di questa tecnica: per tali necessit´ si rimanda al
a
documento originale dell’autore, di cui ´ disponibile il link nell’ultima pagina;
e
qui daremo solo un’idea di come funzioni il procedimento: per prima cosa
codifichiamo la nostra password e otteniamo l’hash corrispondente; ora dob-
biamo definire una formula di riduzione R(hash) tale che ad un hash faccia
corrispondere una password: ovviamente non sar´ quella di partenza, abbia-
a
mo inizialmente ribadito l’impossibilit´ di invertire una funzione di hashing!
a
Iteriamo t volte il seguente procedimento: generiamo l’hash della nuova pas-
sword e applichiamo le formula di riduzione Ri (hashi ) i = 1, 2, . . . , t dove i
indica i passaggi effettuati.
Definiamo quindi
fi+1 = Ri (HashAlgorith(fi )) dove fi = passwordi
ovvero ci´ che abbiamo appena detto: la password al passo i + 1 ´ il risultato
o e
della formula di riduzione i-esima applicata all’i-esimo hash.
In questo modo genereremo una catena “password-hash-password-hash” di
migliaia di elementi ma di questi solo il primo e l’ultimo verranno conservati
su disco con un risparmio di memoria pari a t volte!
Ora quando vorremo confrontare il nostro hash gli applicheremo ft e control-
leremo che il risultato non sia l’ultimo elemento di una delle nostre catene
(di cui come appena detto conserviamo solo l’inizio e la fine); se ci´ non fosse
o
vero applicheremo in sequenza ft−1 e ft e riconfronteremo il risultato con
l’ultimo elemento delle catene: continuando con questo procedimento all’i-
esimo passaggio dovremmo ricavare che il nostro hash fa parte di una certa
catena X e quindi con discreta probabilit´ la nostra password sar´ quella che
a a
precede nella catena (generata dalla R(i−1) (hashi−1 )). Non ´ possibile risalire
e
la catena (dovremmo invertire una funzione di hashing!) ma abbiamo me-
morizzato l’inizio di tale catena e possiamo perci´ riapplicargli in sequenza
o
gli t − i passi necessari a ritrovare la password del passo precedente.
Essa ´ un’ottima candidata: ricaviamone l’hash e confrontiamo il risultato;
e
questo metodo porta raramente a falsi allarmi dovuti a eventuali collisioni
(generati dalle formule di riduzione) lungo la catena; al contrario la versione
originale di tale metodo applicava un’unica R(hashi ) ad ogni passo, con ri-
levanti percentuali di errore.
Tale procedimento che pu´ apparire di difficile computazione ´ in realt´ ve-
o e a
locissimo e, aspetto particolare delle Rainbow Tables, il tempo di cracking si
riduce col quadrato della grandezza della tabella (cio´, incredibilmente, usare
e
una tabella da 1 gigabyte ´ 16 volte pi´ veloce di una da 256 megabyte!).
e u
4
5. 3.2 Servizi online
Ora qualcuno domander´:
a
“Grazie tanto! Se avessi avuto la potenza per codificare cos´ tante password
ı
atte a realizzare complesse tabelle non mi sarei dato pena!”
In effetti per computer casalinghi realizzare una buona tabella ´ pressoch´
e e
impossibile a meno di attese di svariati anni (´ comunque possibile realizzare
e
proprie tabelle per password brevi e con charset limitati in qualche decina
di giorni); se per´ operassi con diverse centinaia di server in parallelo potrei
o
ridurre tale tempo a pochi mesi. Su internet si trovano archivi gi´ pronti per
a
numerosi algoritmi (LM, NTLM, MD5, SHA1 e altri) realizzati proprio da
chi dispone di tali strutture: i pi´ semplici sono gratuiti e solitamente non
u
superano il gigabyte, quelli complessi (spesso costosi) che coprono lunghe
combinazioni alfanumeriche e di simboli superano il terabyte.
Inoltre ´ spesso possibile usufruirne direttamente online, lasciando anche la
e
computazione necessaria alla ricerca a carico dei server: una semplice ricerca
con Google fornir´ dozzine di tale siti, sia gratuiti che a pagamento.
a
4 Difendiamoci: le salt password
Un quesito ´ d’obbligo: come difendersi? Per cominciare rimane sempre
e
buona norma la seguente regole base nella scelta di una password: minimo
otto cifre con uso di caratteri alfanumerici (maiuscoli e minuscoli) e simboli.
Contro le Rainbow Tables ci´ per´ non basta, un attacker in possesso di
o o
tabelle sufficentemente ampie forzerebbe comunque tale password: vengono
dunque in aiuto le salt password (“password salate”), una tecnica in uso
sui sistemi *nix e derivati da oltre 25 anni (ora chiedetevi perch´ il buon
e
XP ancora non implementa tale tecnica!). L’idea delle salt password ´ tanto
e
semplice quanto efficace: prima di codificare la password le si aggiunge un
insieme di bit casuali, tipicamente all’inizio o alla fine, ricavati ad esempio
dall’username, dalla data o dal clock e solo poi si esegue la cifratura.
All’hash corrispondente ´ poi ri-aggiunto, in chiaro, tale set di bit (anche
e
qui solitamente all’inizio o alla fine). Ecco un esempio chiarificatore (i valori
dell’hash sono inventati e non corrispondono a nessun particolare algoritmo):
Password: NuVoLoSo
Salt prescelto: cX
5
6. Password da codificare: cXNuVoLoSo
Hash corrispondente: ZT~Z~NbTL¸)^E?
O O c A
Valore cifrato conservato in memoria: cXZT~Z~NbTL¸)^E?
O O c A
Il vantaggio di tale tecnica ´ chiaro: a salt differenti corrispondono hash
e
differenti per password uguali, rendendo di fatto inutile la tecnica delle
Rainbow Tables o di altri dizionari di hash preconfezionati (senza sapere il
salt a priori nessuno potr´ generarle); l’unica possibilit´ potrebbe essere nel
a a
calcolare tabelle per salt differenti ma ogni bit del salt duplica la grandezza
dell’archivio e il tempo necessario a realizzarlo!
A titolo di esempio i primi sistemi Unix utilizzavano un salt a 12 bit uni-
to all’algoritmo DES (Data Encryption Standard, nonostante da anni sia
considerato insicuro ´ ancora, seppure modificato, usato di default in mol-
e
te distribuzioni!): ci´ significa che ogni password aveva 212 = 4096 diverse
o
combinazioni; ´ evidente che tale tecnica espande in modo inaccettabile la
e
grandezza degli archivi e inoltre nei sistemi odierni spesso il numero dei bit
di salt ´ ancora maggiore (generalmente 216 = 65536 combinazioni).
e
Tralasciando la famiglia Windows praticamente tutti i sistemi operativi uti-
lizzano la tecnica salt ma ci´ non vale per molti altri applicativi e anche per
o
numerose sessioni PHP e MySQL (nonostante sia attivabile): in tutti questi
casi un attacco tramite Rainbow Tables risulta terribilmente efficace.
5 Conclusioni
Credersi ben protetti solo perch´ si dispone dell’ultimo modello di pc, con
e
sistema operativo aggiornato e dotazione di firewall, antivirus, antispyware,
ecc... ´ una vana chimera per bambini.
e
La sicurezza informatica ´ un aspetto troppo spesso tralasciato, come dram-
e
maticamente dimostra il sistema operativo pi´ usato al mondo che ad oggi
u
ancora non implementa nemmeno tecniche semplici e facilmente applicabili
come le salt password. Aumentando le potenzialit´ (velocit´ e densit´ di me-
a a a
moria) degli hard-disk e la potenza delle cpu, diminuir´ il tempo necessario ad
a
attaccare un qualsiasi algoritmo (sia con metodi time-memory trade-off che
con attacchi brute-force); naturalmente anche gli algoritmi stessi si evolvono
ma una basilare conoscenza dell’argomento aiuter´ quantomeno a riflettere
a
sull’intrinseca insicurezza delle password con cui abitualmente lavoriamo.
6
7. 6 Fonti e link utili
• Il documento in cui Oechslin illustra pi´ dettagliatamente la tecnica e
u
le formule alla base delle Rainbow Tables (vivamente consigliato):
http://lasecwww.epfl.ch/pub/lasec/doc/Oech03.pdf
• Intervista all’autore sulle possibilit´ e le capacit´ delle Rainbow Tables:
a a
https://www.isc2.org/cgi-bin/content.cgi?page=738
• Il programma di Oechslin, Ophcrack, e alcune tables:
http://ophcrack.sf.net
• Progetto e documentazione RainbowCrack:
http://www.antsight.com/zsl/rainbowcrack/
• Salt password - Wikipedia:
http://en.wikipedia.org/wiki/Salt_(cryptography)
7