⚠️PASSWORD: come vengono attaccate e come vengono protette

Passwords have been attacked since MIT's time-sharing systems in 1961. Robert Morris invented hashing in 1972 and salting in 1979 to protect them, but RockYou lost 32 million plaintext passwords in 2009. Modern defenses include bcrypt, Argon2, password managers, and multi-factor authentication.
Chapters
immaginate di scoprire che LinkedIn ha subito un attacco che ha comportato la diffusione sul dark web di migliaia di indirizzi mail e password. Quando leggete la mail che vi avvisa della violazione non vi preoccupate troppo, tanto voi LinkedIn lo usate a malapena, avete aperto il profilo solo perché la vostra azienda ve l'ha chiesto. Per sicurezza però decidete di cambiare la password su LinkedIn che passa da vacanze2024! a vacanze2025! e pensate di aver risolto. Un mese dopo vi rendete conto che dal dal vostro indirizzo email lavorativo sono partite delle mail strane ai clienti dell'azienda per cui lavorate. Poi scoprite che anche Netflix non funziona più, qualcuno ha cambiato la password e vi ha buttato fuori. Ma com'è possibile? LinkedIn è stato violato, ok, ma cosa c'entrano la vostra mail aziendale e il vostro account Netflix? La risposta è semplice: avevate usato la mail aziendale e la password vacanze2024! in tutti e 3 i servizi. Quando i criminali hanno rubato il database delle credenziali di LinkedIn non si sono fermati lì, Hanno preso la vostra email e quella password e le hanno provate in modo automatico su migliaia di altri siti: Netflix, Amazon, Gmail, tutto quanto. Voi avete cambiato la password su LinkedIn, ma era già troppo tardi. La vecchia password LinkedIn che i malintenzionati avevano trovato funzionava su altri siti web. Siete appena stati vittime di un attacco di credential stuffing, ma poteva andarvi molto peggio. Ciao a tutti e benvenuti in questo nuovo video. Oggi parliamo di password e di tutti i concetti collegati, fra cui i tipi di attacco come il credential stuffing che abbiamo visto nell'introduzione, ma anche il brute force e così via, e le tecniche di protezione che si usano oggi, in particolare hashing e salting. Ma per capire bene l'argomento di oggi non possiamo fare a meno di conoscere la storia delle password, che è molto più intricata e piena di colpi di scena di quello che potrebbe potremmo immaginarci. Il concetto generale di password è antico, probabilmente quanto l'essere umano. Una volta si chiamava parola d'ordine, ma il concetto era lo stesso. Non c'è una grande differenza fra noi che mettiamo la password nel computer per sbloccarlo e Alibaba che pronunciava le parole "apriti sesamo" per entrare nella caverna che conteneva il tesoro. Il concetto informatico di password invece nasce nel 1961 nei laboratori dell'MIT, l'Istituto Tecnologico del Massachusetts, grazie a un uomo di nome Fernando Corbató. L'MIT RTT era riuscito a entrare in possesso di un computer IBM 7094. I ricercatori che ne avevano bisogno erano tanti, ma computer di quel tipo all'epoca costavano quanto una villa con piscina, per cui ovviamente dovevano condividerlo. Questo comportava due problemi. Il primo era che anche se ciascuno aveva la propria postazione con monitor e tastiera, il cervello, diciamo, era uno solo, per cui se qualcuno stava usando il computer nessun altro poteva usarlo. Il secondo problema era che questo unico cervello era come una una lavagna. Se io scrivo delle cose su una lavagna, quando tocca a me usarla, poi la seconda persona se le trova tutte davanti scritte. Per cui si erano messi d'accordo che ciascuno, quando usava il computer, doveva anche preoccuparsi di cancellare tutto quello che aveva fatto. Corbatori riuscì a risolvere entrambi i problemi. Innanzitutto, per permettere a più persone di usare lo stesso computer contemporaneamente, inventò un sistema di time sharing, in italiano condivisione del tempo. Non mi ci dilungo troppo perché meriterebbe un video a parte, ma giusto per darvi un'infarinatura funzionava così: invece di dare tutto il computer a una persona per delle ore, con questo sistema si divideva il tempo in piccoli turni cortissimi. In questo modo, se Tizio e Caio sono entrambi alla loro postazione, il computer elabora la richiesta di Tizio per un decimo di secondo, poi passa a Caio per un altro decimo di secondo, poi torna di nuovo a Tizio e così via. Avveniva così velocemente che ognuno aveva l'illusione di avere il computer tutto per sé e tante persone potevano usarlo contemporaneamente. Chiaramente più persone c'erano più sarebbe stato lento perché la frazione di secondo doveva essere divisa per più persone, però funzionava. Corbatò si mise allora a cercare una soluzione al secondo problema, perché chiaramente se siamo tutti contemporaneamente davanti alla lavagna e ciascuno scrive le sue cose, la lavagna diventa subito incasinata e tutti soprattutto leggono quello che fanno gli altri. Doveva trovare un modo per far sì che quello che faceva una persona rimanesse confinato in un piccolo spazio, E ci riuscì creando varie cartelle, una per ogni utente, in modo che ciascuno potesse lavorare solo nella propria cartella senza interferire col lavoro degli altri. Ma come fare per evitare che Tizio possa leggere i file che sono contenuti nella cartella di Caio? Corbatoch lavorò parecchio e arrivò a inventare una cosa che oggi conosciamo tutti veramente molto bene: le credenziali di accesso. Ciascuna cartella venne dotata di un nome utente e di una parola di accesso, o password, conosciuta solo dal proprietario. L'apparato costruito da Corbató fu un successo immediato. Finalmente più ricercatori potevano lavorare sui loro progetti contemporaneamente e senza interferenze. Il problema era che comunque il computer non era così potente da poter gestire un numero infinito di utenti per volta, e i ricercatori erano veramente tanti, per cui comunque si dovette trovare un modo per razionare le risorse e concedere a ciascuno un numero limitato di ore a settimana. Ma qualcuno non era d'accordo. Alan Sherr era uno studente di dottorato frustrato. Il sistema concedeva agli studenti solo 4 ore di utilizzo a settimana, ma gli esperimenti di Alan richiedevano molto più tempo e lui non sapeva come fare. Un giorno però scoprì una vulnerabilità nel sistema di stampa. Invece di stampare il file su cui stava lavorando, riuscì a stampare il database di tutte le credenziali di accesso al sistema. In questo modo, quando finiva il proprio tempo, poteva semplicemente collegarsi all'account di qualcun altro. Tutto questo succedeva nel 1962. In pratica, nel giro di un anno dall'invenzione delle password si verificò il primo furto di password. Ma non era finita lì. Pochi anni dopo, nel 1966, in quello stesso laboratorio si verificò anche il primo incidente di sicurezza relativo alle password. Un errore nel codice causò la visualizzazione del file delle password al posto del messaggio di benvenuto del sistema. Questo fu il primo data breach documentato della storia informatica. Questi due incidenti insegnarono alla comunità informatica una lezione fondamentale: le password sono potenti potenti e utili, ma solo se protette adeguatamente. Ma per dimostrare questo assunto dovettero intervenire altri due personaggi. Il primo fu Robert Morris. Guardando gli incidenti dell'MIT, Morris capì che il problema non erano tanto i ricercatori curiosi o i bug occasionali, ma l'approccio stesso alla sicurezza delle password. Non le stavano trattando come qualcosa di importante, le facevano passare in chiaro, non le nascondevano in nessun modo. Se uno riusciva a mettere le mani su un database aveva le password di tutti, e questo non doveva essere possibile. Nel 1972 Morris inventò una tecnica di crittografia per le password chiamata hashing. Immaginate che ogni lettera dell'alfabeto e ogni numero corrisponda a una goccia di tempera di colore diverso. Quando scegliete una password è come se metteste in fila tante goccioline di tempera una dopo l'altra. Se uno vede questa fila sa benissimo la vostra password qual è, perché sa benissimo a quale lettera o quale numero corrisponde quella gocciolina di tempera. Ma se voi mescolate le gocce di tempera che formano la vostra password ottenete un altro colore e guardando questo colore è impossibile risalire alla password originaria. Non ci sarà mai modo di ricostruire in che ordine erano le gocce, quale colore aveva ciascuna goccia, quante gocce c'erano e così via. Questo colore unico dato dall'aver mescolato le varie gocce di tempera viene salvato in un database del computer associato al vostro account. Quindi in pratica anziché salvare Veronica Paolucci fila di goccioline di tempera, si salva Veronica Paolucci colore unico dato dall'aver mescolato le goccioline di tempera. Quando inserite nel computer la vostra password, quindi la vostra fila di goccioline, il computer prima mescola il colore e poi verifica la corrispondenza fra il colore mescolato che gli avete appena dato e quello che ha nel proprio database. Se corrispondono, vi dà l'accesso. Questo protegge benissimo le password, perché se Alan Sher provasse di nuovo oggi a stampare il database, non vedrebbe più la fila di goccioline di tempera, ma solo il colore unico di ciascuno, e non potrebbe quindi risalire alla password originaria. Questo permetteva al sistema di verificare le password senza ma mai doverle conservare in chiaro. Vi ho spiegato l'hashing con una metafora, dal punto di vista tecnico comunque fa esattamente questo. Consiste nel prendere una serie di caratteri, come può essere appunto una password, e farla passare attraverso varie operazioni matematiche complesse che daranno un risultato totalmente diverso dalla password originaria. Questo risultato finale viene chiamato codice hash. Vi faccio vedere in concreto come funziona. Questo è un tool che permette di inserire qui nel campo input una password, ad esempio una parola, una stringa di caratteri, poi lui fa passare questo input attraverso tutta una serie di operazioni matematiche, quelle appunto che sono dietro al meccanismo di hashing, e restituisce poi un output qua sotto. Vi faccio vedere quello che succede se io inserisco ad esempio come password Veronica. Questo sarà il codice che viene salvato nel database. Quindi se la mia password di accesso al computer fosse Veronica, non verrebbe salvata questa nel database ma quest'altra E da qui è impossibile rifare al contrario le operazioni matematiche inverse per arrivare a questa password qua. Quindi si dice che l'hashing è irreversibile. Cambiando anche solo una singola cosa, il risultato qua sotto viene totalmente diverso. Se io decido ad esempio di mettere la A maiuscola, qua sotto il risultato è diverso. Vedete, inizia con 149F94. Mettendo la a minuscola cambia completamente. Adesso è 82d30 eccetera eccetera eccetera. Quindi questo strumento qua vi fa capire come vengono salvate oggi le password in un database. Una cosa a cui prestare attenzione adesso, perché ci tornerà utile più avanti per capire meglio il resto della storia, è che due password uguali daranno sempre lo stesso hash. Vi faccio vedere, io metto 1234 come password, viene 03ac67, ok? Cancello, aggiorno e rimetto di nuovo 1234. Viene esattamente la stessa cosa perché lo stesso input viene fatto passare attraverso le stesse operazioni matematiche, quindi ovviamente darà lo stesso risultato. E questo è ovvio perché se io inserisco la mia password in un computer che ha salvato questo codice qua sotto, quindi ha salvato il codice hash, è importante che inserendo lo stesso input l'output sia sempre uguale. Ma capiremo perché questo può essere un rischio. Morris inventa quindi questo sistema geniale per salvare le password in modo sicuro. Ma non era finita qua, Morris aveva un'altra intuizione geniale in arrivo. Un grosso problema del sistema di hashing, e l'abbiamo visto adesso, era che se due persone usavano la stessa password avevano lo stesso codice hash come risultato. Banalmente, se due persone mettono in fila le stesse goccioline di tempera con lo stesso colore, lo stesso numero, nello stesso ordine, ottengono lo stesso identico colore. E in quel periodo le password erano veramente semplici e sempre abbastanza simili fra loro. Tantissime persone usavano direttamente la parola password o la combinazione 1234, come abbiamo visto adesso. Partiamo proprio da quest'ultimo esempio. Se due persone hanno 1234 come password, nel database avranno lo stesso codice hash salvato. Se usate come password 1234 e poi mettete le mani sul database e vedete che anche altre persone hanno quel codice hash, vuol dire che anche loro usano 1234 1234 come password. Questo problema si può risolvere in due modi: o insegniamo alla gente ad avere password meno scontate e più sicure, così avranno tutte dei codici diversi, oppure inventiamo una tecnica totalmente nuova e tecnologicamente avanzata che possa rivoluzionare il sistema. E visto che l'essere umano è sempre l'anello più debole della sicurezza informatica, Morris optò per la scelta numero 2. Nel 1979, insieme a Ken Thompson, altro studioso veramente molto famoso, Morris introdusse una tecnica chiamata salting, che vuol dire in italiano salare. In pratica, quando io scelgo una password e metto in fila le mie goccioline di tempera una dopo l'altra, il computer non solo mescola tutti i colori per arrivare a un colore unico, ma aggiunge anche una gocciolina di tempera in più di un colore diverso associato solo a me, e poi salva nel database questo colore nuovo, cioè il colore dato dall'aver mescolato le mie goccioline di tempera e la goccia di tempera che ha aggiunto il computer. In questo modo, anche se Tizio e Caio hanno la stessa identica password, nel database risulteranno due colori diversi. Perché ai colori scelti da loro viene aggiunto un colore in più diverso per ciascun account. Torniamo al nostro sito dell'hashing e vediamolo in azione. Mettiamo il caso che sia Tizio che Caio decidano in un moto di originalità di usare come password la parola password. Questo è Tizio che inserisce la sua password che appunto è password e questo è il suo output, quindi il codice hash che viene salvato nel database come sua password: 5e8848, ok, e tutta una serie di altre cose. Ora tocca a Caio che aggiorna e mette anche lui password come password. Come vedete, il codice è esattamente lo stesso, quindi un malintenzionato che mette le mani sul database vede che loro hanno la stessa identica password. Se riesce a indovinarne una, automaticamente indovina anche l'altra. Con la tecnica del salting, il computer, nel momento in cui Tizio scrive password come password, aggiunge un'altra stringa di caratteri, tipo così, ok? Questa stringa di caratteri è associata esclusivamente a quell'account, quindi non è condivisa con altri account. Ecco qua che l'output diventa molto diverso. Ricordiamocelo, inizia con 93927, ok? Caio inserisce la sua password come password, quindi la lascia così, e il computer gli mette altri numeri. E come vedete l'output è totalmente diverso. Tizio e Caio inseriscono nel computer la stessa identica password, cioè la parola password. È il computer che aggiunge una spezia in più, appunto il sale, e rende diverse le loro due password, in modo che dal database non si possa capire che loro hanno una password identica. Ma se vi ricordate, vi avevo detto che di personaggi importanti in questa storia ce ne sono due. Il primo è Robert Morris, che grazie a dashing e salting aveva risolto un problema enorme: la protezione delle password password conservate su un database. Adesso se qualcuno riusciva a mettere le mani su un database contenente le credenziali di tutti gli utenti non sarebbe riuscito a farsene nulla, ad ogni utente era associata una password mescolata e modificata che rendeva impossibile risalire all'originale. Ma non aveva pensato che c'era un altro modo per entrare in possesso delle credenziali di qualcuno: sedersi al suo computer e provare a inserire tante possibili password fino a beccare quella giusta. Ed è proprio qui che entra in gioco il secondo personaggio, di nome Robert, Morris Junior. Morris Junior, che aveva seguito le orme del padre, studiava informatica e nel 1988 stava facendo un dottorato alla Cornell quando decise di soddisfare una propria curiosità innocente: voleva sapere quanto era grande internet. Decise di scrivere un programmino che si sarebbe diffuso automaticamente per contare i computer connessi. Quindi entro in questo computer, 1, vado nel prossimo computer, 2, e così via. Ma qualcosa andò storto. Il worm Morris, che fra l'altro è in assoluto uno dei primi malware della storia, era progettato per essere gentile, doveva diffondersi lentamente senza danneggiare i sistemi, doveva limitarsi a contarli e non far nient'altro. Ma conteneva un bug critico: quando entrava in un computer, anziché contarlo e passare al computer successivo senza lasciare tracce, iniziava a moltiplicarsi fino a saturare completamente le risorse del sistema e a bloccare il computer. Nel giro di poco tempo il worm infettò circa 6.000 computer, praticamente il 10% di tutto l'internet dell'epoca. Bloccò i computer di università, centri di ricerca, laboratori governativi e così via. Ma ecco la parte più significativa per la nostra storia: uno dei metodi che il worm usava per propagarsi era provare delle password comuni per entrare nel computer. Morris Junior aveva compilato un dizionario di 432 password banali, tipo password123456, admin, nomi comuni di persona e così via. E funzionava! Migliaia di computer avevano password così prevedibili che un programma automatico riusciva a farle al primo tentativo. L'ironia era meravigliosa: il figlio dell'inventore dell'hashing e del salting aveva appena eseguito il primo attacco a dizionario della storia, uno dei tipi di attacco più utilizzati ancora oggi per violare le credenziali di un utente. Morris Junior, fra l'altro, aveva avuto l'idea della lista delle password comuni proprio da uno studio del padre, che qualche anno prima aveva creato un primo dizionario di password comuni per testare la forza del meccanismo di hashing. In pratica, il padre ci insegnò a proteggere le password e il figlio ci insegnò a violarle. Fantastico! Lascio un attimo in pausa la nostra storia per spiegare bene cos'è un attacco dizionario, perché è veramente molto importante. Immaginiamo di voler aprire un lucchetto che ha una combinazione ed avere inventato un robot che può provare varie combinazioni in automatico al posto nostro. Essenzialmente possiamo chiedergli di procedere in due modi. Il primo è provare tutte le combinazioni possibili in fila: parte da 0000, poi fa 0001, poi fa 0002, e così via fino a 9999. Nuove. È sicuramente efficace perché prima o poi la combinazione giusta la becca, ma è molto lento. Questo meccanismo è alla base dei cosiddetti attacchi brute force, o attacchi di forza bruta, che consistono nell'avere un programma che testa in automatico tutte le combinazioni possibili, ovviamente non solo di numeri ma anche di lettere. Parte ad esempio con l'ipotizzare che la password abbia 4 cifre, quindi prova prima tutte quelle numeriche: 0000, 0001 e così via. Poi passa alle lettere e fa AAA, AAAB e così via. E se neanche queste funzionano, inizia a combinare lettere e numeri facendo 000A, 000B e così via. Se finisce tutte le combinazioni possibili con 4 cifre, passa a provare su 5 cifre: 0000100002 e così via, così da capo. Anche se i computer di adesso sono velocissimi a provare le password, compiere un attacco di forza bruta richiede una marea di tempo, soprattutto se le password sono lunghine. Non è un caso che molti sistemi oggi prevedano che la password debba essere lunga almeno 8-10 caratteri. È proprio per scoraggiare i tentativi di attacco brute force. Torniamo al nostro robottino. Visto che vogliamo che si sbrighi, non possiamo pensare che provi tutte le combinazioni possibili. Creiamo quindi una serie di combinazioni che deve provare prima di tutte le altre. Ad esempio: 0000, 1111, 8888, poi tutte le date di nascita possibili, quindi 0101, che è l'1 gennaio, 3012 che è il 30 dicembre, eccetera. In questo modo se la persona che ha impostato la combinazione è un po' banale, e noi speriamo che lo sia, ci metteremo molto meno tempo a beccare la combinazione giusta. Se poi non è nessuna di queste perché la persona è stata furba, pazienza, torniamo all'attacco di forza bruta saltando però tutte le combinazioni già provate. L'elenco di combinazioni che noi gli diamo da provare prima si può chiamare dizionario, è una lista di combinazioni, noi gli diciamo parti da queste e solo se nessuna di queste funziona non ha, allora passa alla forza bruta. Oggi tantissimi attacchi di tentativo di accesso usano una combinazione fra attacco dizionario e brute force. Vi faccio vedere in concreto quanto tempo ci vorrebbe per craccare una password banale con i computer di oggi. Ecco qua, questo si chiama Password Monster e serve a testare la forza delle password. Utilizza i vari criteri che ho detto, quindi utilizza sia i criteri di brute force sia i criteri di attacco dizionario. Seguendo il criterio che vi ho detto riguardo al brute force, una delle primissime password che verrebbe provata è una serie di A, mettiamo 8A. Come vedete dice che è molto debole, dice che per crackare questa password ci vorrebbe una frazione di secondo e dice proprio anche che usare questa password è come lasciare la porta di casa aperta. Secondo questo criterio però per arrivare a provare una parola più complessa ci dovrebbe volere un po' più tempo, quindi proviamo ad esempio Veronica Paolucci che non dovrebbe essere così tanto facile da crackare. Ecco qua, ci mette sempre una frazione di secondo e mi dice anche il motivo. Dice: la tua password è molto debole perché è un nome femminile. Proviamo anche Paolucci, giusto per, perché magari dico: vabbè, quello non è un nome femminile. Anche questo è molto debole, ci vuole un po' di più perché non è in cima alla lista del dizionario, ma mi dice: la tua password è molto debole perché è un cognome. Quindi i dizionari hanno anche tutti i cognomi italiani. Non è che solo perché il mio cognome italiano, allora spero che magari non ce entro. Ma io decido di fregarlo e di usare un trucchetto che sicuramente abbiamo usato tutti almeno una volta nella vita. Non scrivo Veronica perché è troppo banale, ma sostituisco le vocali con dei numeri e quindi scrivo una roba un po' truzza, tipo così. Mi dice che è molto debole, ci vuole meno tempo a craccare questo che a craccare il mio cognome, ci vuole una frazione di secondo. E mi dice ancora: la tua password è debole perché è un nome femminile. Cioè, quindi nonostante io abbia sostituito substituito tutto con dei numeri, tutte le vocali, il computer non è scemo, il computer m'ha sgamato immediatamente. E questo vale per tutto. Se io scrivo ad esempio Steve Jobs, pace all'anima sua, è ancora qui, ci vogliono 117 secondi. Però mi dice: la tua password è debole perché contiene un nome maschile e una parola del dizionario. Giustamente Jobs lo interpreta non come un cognome, ma più come una parola del dizionario. Come vedete, tanto furbi e tanto geni non siamo, perché i dizionari oggi includono anche queste cose qua. Giusto per mostrarvi invece la differenza fra una password, diciamo, veramente casuale, provo a digitare un po' di cose a caso. Ecco qua, mettendo una password di questo tipo ci vogliono 24 milioni di anni per beccarla, quindi è molto forte. Password lunga, password casuale che non contiene alcuna parola, password che mischia numeri, simboli, lettere maiuscole e minuscole, che guarda caso sono tutti criteri che normalmente ci obbligano a inserire quando scegliamo una password. Adesso che abbiamo capito alla perfezione cosa sono gli attacchi brute force e gli attacchi a dizionario, torniamo alla nostra storia che è arrivata a questo punto agli anni '90. Gli anni '90 portarono l'esplosione commerciale di internet che uscì dai laboratori universitari ed entrò nelle case di milioni di persone. A questo punto vennero ideate quasi contemporaneamente due funzioni di hashing: l'MD5 e lo SHA-1. Entrambi erano molto semplici e quindi anche facili da implementare sui database. Eppure non tutti gli sviluppatori lo facevano, perché comunque rallentavano un po' il sistema, e in generale perché si sottovalutava molto l'importanza delle credenziali di accesso e soprattutto l'interesse che gli hacker potevano avere per username e password degli utenti. Per questo motivo molto spesso le password venivano conservate in dei database senza nemmeno farle passare in un meccanismo di hashing. Venivano salvate in pratica le file di gocce di tempera senza mescolarle. Purtroppo non ci si rese conto della pericolosità della cosa fino a un bel po' di tempo dopo, e precisamente fino al 2009, quando a RockYou, un'azienda californiana che sviluppava delle applicazioni per social network, venne rubato il database degli utenti. Il database conteneva circa 32 milioni di password conservate in chiaro, in testo semplice. Non era stata usata alcuna forma di crittografia, nonostante hashing e salting fossero tecniche inventate oltre 30 anni prima. L'hacker pubblicò tutto online e vennero rese note, più che le password in sé, le abitudini di milioni di utenti. Per darvi un'idea della situazione, la password 123456 era usata da 290.731 persone. Quasi 300.000 individui avevano scelto la sequenza di numeri più ovvia dell'universo come protezione per il loro account. Al secondo posto c'era 12345 con 79.078 utilizzatori. 123456789 era al terzo posto con 76.000 utilizzatori. Password, letteralmente la parola password, era usata da 61.000 persone. E poi c'era I love you che completava la top 5 con 50.000 incauti romantici. La lista RockYou divenne il sacro graal dei criminali informatici. Ancora oggi, più di 15 anni dopo, il file RockYou.txt che contiene tutte le password scoperte in quell'attacco è uno dei primi che gli hacker inseriscono nei loro programmi per fare attacchi a dizionario. Purtroppo da quell'episodio episodio molte aziende e molti utenti non avevano imparato molto, come dimostrò l'attacco a LinkedIn del 2012, ma di questo parliamo nel video di domani. Comunque dopo l'episodio del 2009 alcune aziende iniziarono a capire che forse era il caso di proteggere un po' meglio i loro database e iniziarono ad adottare meccanismi di hashing usando i due algoritmi maggiormente utilizzati fino a quel momento: MD5 e SHA-1, quelli che vi ho detto che vennero introdotti insieme all'esplosione di internet. Ma anche questo non bastava. L'algoritmo MD5 in particolare era diventato pericolosamente insufficiente, tanto che la NSA, l'Agenzia per la Sicurezza americana, già nel 2008 l'aveva dichiarato criptograficamente morto. I motivi erano essenzialmente due. Innanzitutto era stato dimostrato che MD5 generava collisioni. Si ha una collisione quando due input diversi, ad esempio la password Veronica25 e la password nome cane123, generano lo stesso output, cioè passandoli attraverso le operazioni matematiche complesse danno lo stesso codice hash come risultato. È una cosa molto rara, ma è una cosa che non dovrebbe assolutamente succedere, quindi già solo il fatto che succedesse, per quanto poche volte, era assolutamente inconcepibile. Inoltre MD5 era veramente molto veloce nell'eseguire le operazioni, e questo significava anche che un attaccante poteva provare migliaia di password al secondo. I malintenzionati avevano sfruttato questa velocità per creare delle tabelle precompilate di hash possibili, chiamate rainbow tables, tabelle arcobaleno. In pratica prendevano tutte le password più comuni, tipo banalmente quelle del file rockyou, calcolavano il loro hash usando MD5 e salvavano il codice hash risultante in una lista personale, nella rainbow table appunto. In questo modo se riuscivano a mettere le mani su un database di password che erano state cifrate con MD5, potevano confrontare i codici hash contenuti nel database rubato con quelli che avevano calcolato loro e inserito nelle loro rainbow tables. Se due codici hash corrispondevano, a posto, erano risaliti alla password originale. MD5 quindi era assolutamente vulnerabile agli attacchi basati sulle rainbow tables, e questo per un motivo molto semplice: faceva hashing ma non faceva salting, non aggiungeva niente alla password dell'utente, non aggiungeva quella stringa univoca collegata al singolo utente che prendeva la sua password e generava un output totalmente diverso da quello che gli attaccanti avevano nelle loro liste. Se vi ricordate, vi avevo detto che già negli 70 Morris padre si era reso conto che l'hashing era inutile da solo, perché qualcuno poteva precalcolare vari codici hash e trovare le corrispondenze. Aveva in qualche modo previsto che in futuro sarebbero arrivate le rainbow tables, le liste di codici hash abbinate alle password più comuni. È proprio per questo che aveva introdotto il salting: prendo una password, aggiungo una stringa casuale diversa per ciascun utente e poi la rendo un codice hash. In questo modo anche se Tizio e Caio usano tutti e due la password "iscrivetevi iscrivi al canale 25, i loro due codici hash saranno diversi perché alla loro password sarà stata aggiunta un'altra sequenza di caratteri casuali, diversi per ciascuno di loro. Il salting rende praticamente impossibile craccare le password con una rainbow table perché i codici hash che vengono salvati nel database non corrispondono in realtà alle password reali degli utenti. MD5, facendo solo hashing e non salting, era molto vulnerabile agli attacchi basati su rainbow Rainbow Table. Nel 2007, quindi già prima dell'attacco a RockYou del 2009, si era capito che questo era un problema che doveva essere superato e iniziò a essere usato l'algoritmo bcrypt. bcrypt usava sia hashing che salting, quindi era un'ottima protezione contro gli attacchi Rainbow Table. Inoltre, cosa ancora più importante, era una funzione volutamente lenta in modo da impedire gli attacchi brute force. Per capire bene, immaginatevi di sedervi a un computer e inserire le vostre credenziali su un sito. Quando inserite password viene fatta passare attraverso queste operazioni matematiche che producono un codice hash e si verifica che il codice hash corrisponda a quello salvato nel database. In un server che usa MD5 questa operazione richiede una frazione di secondo, quindi in un minuto possiamo provare letteralmente milioni di password, cosa veramente molto bella se stiamo facendo un attacco di forza bruta in cui dobbiamo provare tutte le combinazioni di password esistenti. bcrypt invece poteva essere impostato in modo da provare solo una password al secondo, Per l'utente non cambiava nulla, perché non è che noi ci accorgiamo se ci mette un secondo in più a validarci la password, ma rendeva di fatto impossibile eseguire un attacco di forza bruta. Una password al secondo significa che per provare un solo milione di password, che è nulla rispetto alla quantità di combinazioni possibili, ci vogliono un milione di secondi, che corrispondono a 11 giorni e mezzo. Ho fatto i conti e vi dico solo che per provare tutte le combinazioni possibili su 8 caratteri alfanumerici, quindi escludendo i simboli e tenendo solo 8 cifre ci vorrebbero 7 milioni di anni per provarle tutte. Immaginatevi se invece la password di caratteri ne ha 10 o 12 e include anche dei simboli. bcrypt, realizzato alla fine degli anni '90 e diffusosi appunto intorno al 2007, era praticamente invincibile, soprattutto se paragonato a MD5. Non posso spiegarvi io quant'è effettivamente importante l'algoritmo usato per proteggere le password, ve lo faccio spiegare da Yahoo. Nel 2013 Yahoo venne hackerato e furbato il database con le credenziali di un miliardo di utenti. Il lato positivo era che Yahoo non aveva lasciato le password in chiaro, almeno questo. Il lato negativo era che erano state protette con MD5. Tantissimi account furono violati perché ai malintenzionati bastò confrontare l'elenco di codici hash contenuti nel database con le loro rainbow tables per trovare delle corrispondenze. E gli attaccanti non si fermavano lì. Una volta che avevano capito che all'indirizzo mail lorisbatacchi@yahoo.com corrispondeva alla password fragola86, provavano questa combinazione di mail e password su tantissimi altri siti, sperando che la stessa mail e la stessa password fossero state usate anche altrove. Questo tipo di attacco si chiama, come dicevo nell'introduzione, credential stuffing, termine che si può tradurre con riempimento di credenziali, cioè prendo le credenziali e le metto su tantissimi altri siti. Il credential stuffing si basa interamente su una nostra debolezza. Il cervello umano umano non è progettato per ricordare tante password complesse. Se ne creo una un po' complessa, ricordarmi quella è già difficile, per cui tendo a riutilizzare la stessa password in più account diversi, perché usare e ricordare più password è veramente una scocciatura. È proprio per questo motivo che sono state inventate tecnologie come i password manager, che ricordano le password al posto nostro, o l'autenticazione a più fattori, di cui parleremo la prossima settimana. Intanto però Yahoo aveva una bella gatta da pelare. Aveva usato una funzione di hashing che già 5 anni prima era stata dichiarata insufficiente e vulnerabile, e l'aveva usata nonostante esistessero delle alternative più sicure già diffuse. Ovviamente, e giustamente, la società prese la decisione di abbandonare MD5 in favore di bcrypt. L'anno dopo, nel 2014, venne nuovamente attaccata, ma gli hacker si trovarono in mano un database inutilizzabile perché le password erano state sottoposte sia a hashing che a salting, rendendo inutili quindi le loro rainbow tables, ed era impossibile anche fare attacchi brute force come abbiamo visto prima. Questa differenza insegnò al mondo come si era evoluta la sicurezza delle password. Divenne chiaro che MD5 stava a bcrypt come una porta di cartone sta a un bunker di cemento armato. Nel 2015 la comunità crittografica mondiale decise di fare un passo in avanti e di buttarla in sfida, organizzando la Password Hashing Competition, praticamente le Olimpiadi della sicurezza delle password. 20 squadre da tutto il mondo presentarono i loro algoritmi più avanzati e per ben 4 anni hacker etici e ricercatori di sicurezza misero a prova ogni algoritmo con ogni tipo di attacco immaginabile. Gli algoritmi candidati dovevano dimostrare resistenza a tutti i tipi di programmi, sistemi che gli hacker usano per attacchi massicci, quindi attacchi di scenario, attacchi di forza bruta e così via. Dovevano essere configurati in modo da adattarsi alla crescente potenza di calcolo, perché chiaramente più avanzano i computer più diventa veloce provare tante password. Dovevano essere abbastanza efficienti da non rallentare i server legittimi, ma abbastanza lenti da scoraggiare gli attaccanti. Dopo 4 anni di test rigorosi vinse Argon2, sviluppato da un team di ricercatori europei. Oltre a essere praticamente inviolabile, aveva il vantaggio di poter essere modulato a seconda delle esigenze e dei sistemi su cui veniva usato senza perdere efficienza. Sei Amazon e hai server enormi e super performanti? Perfetto, configuralo per usare più memoria ed essere quindi più potente. Sei Mario Rossi e gestisci un piccolo e-commerce di panettoni artigianali e quindi hai risorse limitate? Riduci la memoria in modo che non ti intasi il sistema e aumenta invece i cicli dell'algoritmo, quindi quante volte viene applicato su una password, in modo da rafforzare la sicurezza. Sei Samsung e ti stai dotando di hardware futuristici più veloci? Aumenta tutti i parametri e andrà ancora bene così. Argon2 nel 2019 divenne il non plus ultra nella protezione delle password, ma proprio quando la comunità tecnica pensava di aver vinto la guerra, arrivò un promemoria che il fattore umano è sempre l'anello più debole. Vi ricordate questo caso qui? Twitter, luglio 2020, quando un gruppo di teenager riuscì a prendere il controllo degli account Twitter di celebrità del calibro di Barack Obama, Elon Musk e Bill Gates per truffare le persone? Twitter usava già algoritmi avanzati per proteggere le password. Anche mettendo le mani sul database era impossibile risalire alle credenziali degli utenti. Allora questi ragazzi le password se le fecero dire per telefono. Non sto a rispiegarvi la storia o a spoilerarvela se non avete visto il video, ma da questa storia e da tutto quello di cui ho parlato finora impariamo una serie di cose. Numero 1: non usiamo password corte o banali. Non sappiamo quali sistemi usano Argon2 e quali invece sono ancora fermi a MD5. Noi nel dubbio chiediamoci sempre: la mia password potrebbe essere contenuta in uno dei dizionari usati per gli attacchi? Se avete dubbi consultate siti come Password Monster che vi danno un'idea di quanto la password sia sicura. Numero 2: non usiamo la stessa password dappertutto. Capisco che memorizzare 800 password sia complesso, però troviamo dei modi che ci aiutino a ricordare. Oggi esistono delle app che gestiscono le password per conto nostro, e se non ci fidiamo c'è sempre l'alternativa classica e intramontabile di scriversi scriverle in un pezzo di carta da conservare in un posto sicuro, come una cassaforte o un cassetto chiuso a chiave. È sempre meglio che usare una password unica per tutto. Numero 3: non riveliamo mai a nessuno la nostra password. Questo vanificherebbe completamente tutti i sistemi e le tecnologie come Argon2, hashing, salting e così via. Nessuno ha bisogno della nostra password. Non fatevi incantare da chi vi dice che ne ha bisogno perché i vostri sistemi sono in pericolo. Stanno mentendo o non sanno fare il proprio lavoro. Numero 4: autenticazione a più fattori. Banale, no? Anche se vi fregano la password, in questo modo non potranno accedere ai vostri sistemi a meno che voi non facciate qualcos'altro. Non sto ad approfondire adesso perché, come ho accennato, dedicherò a questo tema il video della prossima settimana, ma sappiate che dove lo potete implementare dovreste farlo. Numero 5: per enti e aziende, proteggete i vostri database con algoritmi moderni e sicuri. Se dovete usare algoritmi inventati negli anni '90, tanto vale che lasciate le password in chiaro. Numero Numero 5 bis: non lasciate le password in chiaro. Bene, come sempre spero che questo video vi sia stato utile. Mi rendo conto che come tema è un po' più complesso degli altri, ma penso che capire come fa una password a essere hackerata sia utile per tutti noi, anche per capire come proteggerci. Domani vedremo il caso LinkedIn, uno dei casi più eclatanti di furto di password mai capitati. Non perdetevelo, a domani!










