L'uso di username e password è da sempre uno dei metodi più diffusi per
verificare le credenziali di un utente durante l'accesso ad un sistema
informatico. Dal punto di vista teorico questo sistema di autenticazione risulta
relativamente robusto ma una serie di fattori, quali una implementazione
debole o, più spesso, una errata scelta della password, può vanificarne
completamente la sicurezza.
Di seguito si analizzerà il processo di autenticazione usato dai sistemi Windows e Linux evidenziando differenze e debolezze. Verranno illustrati i principali metodi usati per violare una password e si daranno alcuni suggerimenti per sceglierne una resistente agli attacchi.
Hashing
Il sistema concede o nega l'accesso ad un utente confrontando la password
inserita durante il login con quella presente, in forma criptata, in un
particolare database degli utenti. La forma criptata, denominata hash, è
ottenuta dalla password attraverso una funzione non reversibile. Questo
significa che non esiste un algoritmo che sia in grado di
calcolare la password a partire dal suo hash. Si è dimostrato che la cosa è
computazionalmente impossibile. Tutti i procedimenti matematici durerebbero un tempo
confrontabile con la durata delle ere geologiche o addirittura con il tempo di
vita dell'universo.
L'autenticazione quindi avviene calcolando l'hash della password fornita durante il login e confrontandolo con quello presente nel database. Se risultano uguali, la parola d'accesso inserita è corretta. Il sistema dunque non è a conoscenza della password dell'utente ma solo di una sua "firma".
L'hash è caratterizzato da una lunghezza fissa, tipicamente 16 byte, indipendente dalla lunghezza della password da cui deriva.
Gli algoritmi di hashing sono spesso chiamati anche algoritmi di message digest o one-way functions.
Per considerazioni più approfondite sulle funzioni di hash si consiglia la lettura del saggio: Funzioni Hash.
Autenticazione nei sistemi Windows
Tutti i sistemi Windows della famiglia NT (NT/2000/XP/2003) conservano il database degli utenti locali in un file protetto denominato SAM (Security Account Manager). Il tipo di autenticazione di questi sistemi prende il nome di NTLM.
Windows 95, 98 e ME invece non consentono una autenticazione locale e quindi non conservano informazioni sugli utenti. A questi sistemi è però concesso connettersi via rete a macchine appartenenti alla famiglia NT. In questo caso il tipo di autenticazione risulta diverso e viene denominato LM (Lan Manager).
I sistemi NT quindi, e d'ora in poi si farà riferimento solo a questi, devono
potere gestire sia autenticazioni NTLM sia, per compatibilità con i vecchi
sistemi, autenticazioni LM.
NTLM e LM prevedono procedure di hashing completamente differenti tra loro. Per
dare al sistema la possibilità di gestire correttamente ogni tipo di accesso,
per ogni password vengono memorizzati entrambi gli hash.
Di seguito si illustrano le caratteristiche dei due tipi di autenticazione
citati. Risulterà evidente la intrinseca debolezza di LM rispetto a NTLM
Password LM
- La password può avere una lunghezza massima di 14 caratteri. Se risulta più lunga verrà troncata. Se è più corta verranno aggiunti in coda degli zeri fino al raggiungimento del quattordicesimo carattere.
- L'insieme dei caratteri ammissibili è un sottoinsieme dei caratteri ASCII.
- Tutti i caratteri alfabetici verranno convertiti in maiuscolo. Le password
"Sicurezza99" e "siCuReZza99" verranno quindi considerate uguali. - La password di 14 caratteri così ottenuta viene suddivisa in due blocchi di 7.
- Le due metà vengono codificate indipendentemente per
ottenere due hash di 8 byte ognuno. L'hash LM è costituito dalla
concatenazione dei due hash ottenuti. In sostanza è come se avessimo due
password di massimo 7 caratteri.
Password NTLM
- La password può raggiungere la
lunghezza di 127 caratteri. È prevista una limitazione a 15 caratteri solo in
Windows NT. - Sono accettabili tutti i caratteri
UNICODE. Un insieme
enormemente più ampio dei caratteri ASCII. - La password intera viene codificata attraverso l'algoritmo MD4 per
ottenere un unico hash di 16 byte
Rimandiamo ad un articolo su Amagri.it per ulteriori dettagli sui tipi di autenticazione in Windows.
Autenticazione nei sistemi Unix/Linux
Nei sistemi Unix/Linux il database degli utenti si trova in un file di testo
presente in /etc/passwd
. Eventualmente l'hash delle password può essere
contenuto in un file separato /etc/shadow
accessibile solo
dall'utente root.
La codifica degli hash in questo tipo di sistemi assomiglia a quella NTLM. A
complicare la cosa interviene l'aggiunta del cosiddetto salt (sale).
Il seguente procedimento porta alla creazione dell'hash da memorizzare nel
database degli utenti:
- Si genera una stringa casuale di una certa lunghezza denominata salt.
- Si genera l'hash della stringa ottenuta dalla concatenazione di password e
salt. L'hash possiede quindi una componente casuale. - Si memorizza nel file
/etc/shadow
una stringa composta dalla
concatenazione di salt e dell'hash precedentemente calcolato.
Per l'autenticazione il sistema procederà in senso inverso:
- Preleva il salt dalla stringa salt+hash presente nel file
/etc/shadow
- Concatena il salt alla password inserita dall'utente e ne calcola l'hash
- Confronta l'hash con quello memorizzato.
Violazione delle password
Si è precedentemente affermato che da un hash non è possibile risalire
nuovamente alla password. Come è possibile allora che avvengano intrusioni in
sistemi protetti da questo tipo di autenticazione?
Se non è possibile procedere
in senso inverso l'unica soluzione consiste nel provare nell'unica direzione
possibile: si generano per tentativi delle password, si calcolano gli hash e li
si confronta con quelli memorizzati nel database degli utenti. Se coincidono
avremo trovato una password.
Attacchi a dizionario
Tralasciando il problema di recuperare gli hash dal database che in genere
risulta protetto, l'operazione descritta precedentemente può sembrare alquanto ostica.
Il fattore umano a questo punto gioca un ruolo determinante: la password deve
necessariamente essere ricordata dall'utente che tenderà ad usare per essa
parole comuni, date, nomi propri seguiti dall'anno di nascita o comunque
stringhe composte da pochi caratteri. Tali password vengono denominate
deboli (weak).
Ecco così che l'insieme da cui scegliere le nostre password di prova può non essere
del tutto arbitrario. E sufficiente disporre di un buon elenco di termini comuni e di
nomi propri. A questi è possibile eventualmente concatenare delle cifre per
ottenere stringhe che possano assomigliare, per esempio, alle tipiche forme
"carlo75" o "mary82". Le varianti che si possono escogitare sono numerose.
Un procedimento di questo genere viene chiamato attacco a dizionario. Il
dizionario può essere molto grande, centinaia di migliaia o anche milioni di
voci da provare. Nonostante questo l'attacco, generato da appositi programmi,
viene completato in pochi minuti e garantisce buoni risultati.
Attacchi a forza bruta
Se il precedente metodo non ha dato i risultati sperati è possibile usare una
tecnica più spartana: si provano tutte le combinazioni di password possibili. I
tempi di attesa per un'analisi completa possono diventare proibitivi a seconda
della lunghezza della password e dall'insieme dei caratteri utilizzati per la
ricerca.
Ancora una volta però ci vengono in aiuto le cattive abitudini degli utenti che scelgono
spesso parole d'accesso corte e composte da soli caratteri alfabetici e cifre. Una
password come "aj2t7b" difficilmente potrà essere trovata con un attacco a
dizionario ma è individuabile, anche se in tempi più lunghi, attraverso un
attacco a forza bruta che provi tutte le combinazioni di sole lettere e numeri.
Per quanto riguarda Windows ci viene inoltre in aiuto l'intrinseca fragilità dovuta al doppio hash. Poichè l'hash LM è il più debole dei due è logico si scelga questo per tentare di forzare la password. Ciò consente di limitare la ricerca a due password di 7 caratteri al massimo in cui i caratteri alfabetici siano solo maiuscoli.
Questi fattori contribuiscono a rendere il sistema decisamente vulnerabile.
La buona notizia è che è possibile disabilitare la generazione del doppio hash.
Disabilitare la generazione di hash LM
Esistono vari metodi per ottenere lo scopo.
Il più semplice è scegliere una password di almeno 15 caratteri. Non potendo
questa essere gestita dall'algoritmo LM il relativo hash non verrà generato.
Il secondo metodo prevede una disabilitazione incondizionata agendo sul
registro di sistema. Dopo aver individuato la seguente chiave: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa
è sufficiente creare una voce NoLMHash
di tipo DWORD.
Se si usa Windows 2000 (a partire da sp2) non è necessario fare altro. Se si usa
Windows XP o 2003 bisogna impostare tale voce al valore 1.
Al termine è necessario reimpostare tutte le password già presenti sul
sistema perché l'hash LM venga eliminato.
Per informazioni più dettagliate sulle procedure descritte rimandiamo ad un articolo della Knowledge Base di Microsoft
Attacchi con tabelle precompilate
Il fattore critico negli attacchi a forza bruta è il tempo necessario al suo
completamento. Questo è dovuto alla complessità della funzione di hashing che
necessita di molti calcoli per essere eseguita.
Una soluzione alternativa consiste nell'immaginare una enorme tabella in cui
siano stati precedentemente calcolati tutti gli hash di tutte le possibili
password. Una semplice ricerca dell'hash cercato nella tabella porterebbe
all'individuazione immediata della password senza alcun calcolo matematico. Il
problema è che l'ipotetica tabella avrebbe dimensioni veramente proibitive già
per password di pochi caratteri il che vanificherebbe la sua utilità. Quello che
si cerca di fare nella pratica è un compromesso tra lo spazio occupato e il
tempo necessario per il calcolo. In questo modo è possibile creare una tabella
di dimensioni ragionevoli che possa essere usata per risalire alla password
usando poche decine di secondi o minuti di ulteriore calcolo. Famoso a tal
proposito è il progetto RainbowCrack che permette di creare tabelle precompilate
per gli hash LM di dimensioni pari a pochi GB o diverse decine di GB a seconda
che si ricerchino password alfabetiche o alfanumeriche.
La possibilità di usare un attacco di questo genere è subordinato al fatto
che un confronto tra hash equivalga ad un confronto tra password. Questo succede
se password uguali possiedono sempre lo stesso hash. I sistemi LM e NTLM godono
di questa proprietà.
Nel metodo di hashing usato dai sistemi Unix/Linux questo non succede. Poichè
ogni hash possiede una componente casuale dovuta al salt, password uguali
avranno hash sempre diverso. L'uso del salt quindi rende i sistemi *nix non
vulnerabili ad un attacco con tabelle precompilate. Per questi sistemi sarà
sempre necessario un calcolo dell'hash, con i relativi tempi di attesa, per
forzare una password.
Scelta di una password robusta
Arrivati a questo punto è lecito chiedersi come debba essere strutturata una
password difficile da attaccare con i metodi precedentemente descritti.
- Una parola d'accesso lunga, possibilmente più di 14 caratteri, ha
poche possibilità di essere scoperta. Contrariamente a quanto si può pensare
password lunghe non sono necessariamente difficili da ricordare, anzi è spesso
vero il contrario. Usare una frase invece che una parola può essere un
buon modo per costruire un account sicuro. - Diversificare la tipologia dei caratteri usati complica
esponenzialmente gli attacchi a forza bruta. Possiamo alternare i caratteri
minuscoli a quelli maiuscoli. Possiamo usare le cifre, possibilmente non solo
a fine password. L'uso di simboli poco usati come !"£$%&/?^ complica
ulteriormente il processo di recupero. - Una tecnica ancor più estrema nella diversificazione dei caratteri prevede
l'uso dei caratteri unicode ottenibili con la pressione del tasto
ALT seguito dal relativo codice. Nessun programma di individuazione delle
password avrà la minima possibilità di riuscita dato l'elevatissimo numero di
codici da testare.
La tecnica migliore consiste nell'usare contemporaneamente tutti i metodi descritti ma le possibilità sono limitate solo dalla fantasia.
Nell'articolo citato di seguito è possibile approfondire le tematiche
relative alla scelta della password e delle tecniche per minimizzare le
probabilità di un possibile recupero. Il tutto alla luce dei recenti vincoli
imposti dalla nuova legge sulla privacy.
- Un ottimo documento di Microsoft con consigli per una corretta scelta della
password: - Dieci falsi miti per le password di Windows