Diapositiva 1 - Dipartimento di Matematica e Informatica
by user
Comments
Transcript
Diapositiva 1 - Dipartimento di Matematica e Informatica
Password storage & Friends Password-based authentication • Tuttora e in futuro molto diffusa • Pro: Economica: facile da implementare, password facili da distribuire e conservare Livello di sicurezza dignitoso se password workflow implementato correttamente Password-based authentication - II • Contro: – Le implementazioni allo stato dell’arte sono rare – Tutti i passaggi del password workflow sono soggetti a possibili problemi di sicurezza – Il fattore umano ha un impatto notevole "Humans are incapable of securely storing high-quality cryptographic keys, and they have unacceptable speed and accuracy when performing cryptographic operations. They are also large, expensive to maintain, difficult to manage, and they pollute the environment. It is astonishing that these devices continue to be manufactured and deployed. But they are sufficiently pervasive that we must design our protocols around their limitations. " -- Kaufman, Perlman, and Speciner quoted in Anderson's "Security Engineering" Password workflow • Attori: – Utente dotato di credenziali (UID + Pass) – Servizio di varia natura (Web server, OS, etc.) – Host utente, Host server, canale trasmissivo • Workflow – – – – – Storage lato utente Introduzione credenziali Trasmissione Validazione Storage lato server Storage lato utente • Mentale • Cartaceo • Ausili digitali Inserimento • Keyloggers: hardware & software – Attacchi solo mitigabili con metodi di inserimento alternativo (e.g. keylogger beater) – http://www.keylogger.org/ Trasmissione • Svariati metodi di validazione senza trasmissione della password disponibili – Challenge based: HTTP digest, CHAP, MS-CHAPv2 • --- Vedi lezioni apposite --- Scelta della password • Lunga o corta? • Comune o non comune? • Singola o multipla? Password Storage • In genere i servers non memorizzano le passwords reali, piuttosto ricavano un valore hash della password, memorizzano questo valore ed eliminano la password • Il valore hash viene usato per verificare una password tramite un modulo di login ma non è possibile riconvertirlo nel valore testuale della password • Uso di hashing iterativo per rallentare il brute-forcing • In molti casi resta possibile fare login usando l’hash… Rainbow Tables 1. 2. 3. • Immaginiamo di avere un “dizionario” costituito, ad esempio, da combinazioni alfanumeriche < 15 caratteri Indicizziamo rispetto ai valori hash delle combinazioni a disposizione Memorizziamo i risultati su un DVD tutte le A questo punto si hanno diverse centinaia di milioni di valori hash che si possono riconvertire nei corrispondenti valori testuali – una “rainbow table”. Per usarla, 1. 2. 3. Prendiamo la tabella di valori hashes di cui siamo venuti in possesso Per ciascun valore hash h Cerchiamo h nella rainbow table • Se c’è, lo abbiamo scoperto Nessun moderno schema di Password storage dovrebbe essere vulnerabile a questo tipo di attacco Rainbow tables • Si possono facilmente neutralizzare • Per ogni password è sufficiente generare un numero random (nonce) • Calcolare il valore hash della password con il nonce, e memorizzare sia il valore hash che il nonce • Il server ha informazioni sufficienti per verificare le passwords (il nonce è memorizzato in chiaro) • Ma anche con un valore random piccolo, ad esempio 16 bits, le rainbow tables non sono praticabili: ci sarebbero 65,536 “varianti” di ogni valore hash, e invece di 300 miliardi di entries nella rainbow table ne servirebbero quadrilioni • Il nonce in questo schema è detto “salt” Programming Practise • La maggior parte dei problemi di sicurezza delle industrie si è verificato perchè gli sviluppatori hanno gestito il codice relativo alla sicurezza nello stesso modo in cui hanno gestito il resto del codice • La differenza tra il codice relativo ai problemi di sicurezza è il codice applicativo è che quando il secondo fallisce, è possibile accorgersene subito, mentre quando fallisce il codice relativo alla sicurezza, c’è il rischio di scoprirlo anche dopo anni* *quando un DVD con tutte le informazioni riservate sulle carte di credito degli utenti e CVV2 inizia a circolare in Estonia Esempio • “Salt” fai da te: hash = md5('deliciously-salty-' + password) • Ci sono almeno 2 problemi in questo pezzo di codice: – Certamente, l’autore non sa cos’è un salt – “deliciously-salty-” non è un nonce Esempio • Ma l’altro problema è l’utilizzo delle lettere “md5” – Non solo perchè MD5 è “superato” e non è conveniente come metodo generale per calcolare valori hash – Ma soprattutto perchè la codifica MD5 avviene molto velocemente (così come per SHA1 e SHA256) • la velocità è un obiettivo di design per le tecniche di hashing sicuro (…i valori hashes costituiscono i pilastri di qualsivoglia sistema di crittografia…ma) La velocità è esattamente ciò che non si vuole in una funzione di codifica hash per una password! Password crackers • Gli schemi di password moderni sono attaccati con i password crackers incrementali – Questo approccio non pre-calcola tutte le possibili passwords cracked – Considera ogni valore hash della password individualmente e riempie il dizionario tramite la funzione hash per la password (così come accadrebbe in una pagina di login) • I rainbow table crackers (Ophcrack) usano la risorsa spazio per attaccare le passwords. • Gli incremental crackers (John the Ripper, Crack, LC5) lavorano sfruttando la risorsa tempo (statistiche ed elaborazioni) Password attack game • Il “punteggio” è calcolato in base al tempo impiegato per scoprire la password • Nel caso di rainbow tables, questo tempo dipende da quanto grande deve essere la tabella e da quanto velocemente si riesce a navigarla • Nel caso dei crackers incrementali, il tempo dipende da quanto velocemente si può eseguire la funzione hash per la password (più velocemente si può ottenere il valore hash per la password più debole diventa lo schema) – MD5 e SHA1 sono pensati per essere veloci, perciò MD5, SHA1 (e di conseguenza DES) sono deboli come password hashes – Sulle moderne CPUs il calcolo di DES e MD5 può essere ottimizzato enormemente. Usare direttamente funzioni hash per autenticare e memorizzare passwords è una soluzione semplice ma debole tanto quanto quella di usare funzioni hash senza salt, quindi è da evitare Stato dell’arte • Usare cosa il sistema operativo già offre: uno schema di password storage “ottimizzato” per essere computazionalmente costoso. – PHK’s FreeBSD MD5 scheme – “stretching” = PHK applica MD5 per migliaia di iterazioni (su Linux e BSD) • “Adaptive Hashing” – Inventato da Neils Provos e David Mazieres per OpenBSD nel 1999 – Il loro schema originale è chiamato “bcrypt” – 3 differenze rispetto allo schema PHK’s • Bcrypt usa Blowfish invece di MD5. Blowfish è un algoritmo a blocchi che richiede un tempo di setup molto elevato • Provos e Mazieres lo hanno esteso in "Eksblowfish“ che prevede un tempo di setup ancora più lungo (possibilità di specificare il numero di passate fatte con Blowfish) Vantaggi di bcrypt Analizziamo il problema dalla prospettiva server e attacker Server: • Un server riceve migliaia di logins all’ora. Rispetto ai tempi di database hits, page refreshes e I/O, il tempo di verifica della password è trascurabile • Non importa se il test di verifica della password richiede il doppio del tempo o anche 10 volte tanto! Attacker: • L’attacker deve effettuare moltissimi test della password • Diventa importantissimo quindi il tempo necessario per ciascun test! Il più grande vantaggio dell’ adaptive hashing è che al crescere della velocità di elaborazione delle macchine, lo stesso blocco di codice continuerà a produrre passwords a loro volta più difficili da scoprire.. Progetto di password storage • Tradeoff: 1. Memorizzare il valore hash di una chiave • se si perde il database degli hash, comunque non sono state rese visibili le password Tuttavia non c’è modo di conoscere le password in chiaro, quindi per validarle, l’utente deve trasmetterle in chiaro! (Sarebbe inutile comunque trasmettere l’hash della password dal client al server) L’autenticazione richiede di essere protetta a sua volta, e.g. con uno schema Diffie-Helmann • • 2. Usare uno schema di challenge-response: • • da entrambi i lati si usa un problema matematico per dimostrare rispettivamente che si è a conoscenza della password ma senza trasmettere la password in chiaro sulla rete Questi schemi funzionano a patto che entrambi gli interlocutori abbiano accesso alla password in chiaro ! • Entrambi i tipi di attacco, database stealing e password phishing/sniffing/stealing si possono verificare – Il furto di database può mettere a repentaglio un intero DB di account Authentication Protocols • • • • PAP CHAP & estensioni (MS-CHAP) Kerberos PEAP/EAP – LEAP, EAP-TLS, EAP-MD5, EAP-PSK, EAP-TTLS, EAPIKEv2, EAP-FAST, EAP-SIM, EAP-AKA, EAP-GTC, EAP-EKE, EAP-MSCHAPv2 • IKEv2 • HTTP – Digest • … Stanford Secure Remote Password protocol • SRP è un sistema di cifratura a chiave pubblica pensato per memorizzare in modo sicuro e validare le passwords senza memorizzarle nè trasmetterle in chiaro (risolve il problema del tradeoff…) • Estensione del Diffie-Hellman – Invece di memorizzare un password hash con salt si memorizza un “verifier”, che è un numero elevato alla potenza del valore hash della password modulo N Stanford Secure Remote Password protocol • È un protocollo di challenge-response che consente a un server di dimostrare che l’utente è a conoscenza della password senza che questa debba viaggiare sulla rete • Non richiede la memorizzazione in chiaro, si memorizza un verifier crittografato non reversibile • Poter invertire gli SRP verifiers velocemente significherebbe un avanzamento significativo delle tecniche di crittografia • SRP è sufficientemente semplice da poter funzionare su un browser con Javascript. Stanford Secure Remote Password protocol • All’inizio si sceglie un numero primo sufficientemente grande, n • Tutte le operazioni di addizione, moltiplicazione, elevamento a potenza vengono implicitamente effettuate modulo n n g s P x v u a,b A,B H() m,n K Un numero primo grande Un generator Una stringa random usata come user's salt Password utente Una chiave privata derivata da password e salt Host's password verifier Un parametro random pubblico Chiavi private generate in modo random e non pubblicamente rivelate Chiavi pubbliche corrispondenti One-way hash function Due stringhe concatenate Session key Steve prende un salt s e calcola: x = H(s, P) v = g^x Steve memorizza v and s come Carol's password verifier e salt 1. 2. Carol invia a Steve la sua username, (ad esempio carol) Steve prende la entry corrispondente alla password di Carol, accede al verifier v e al salt s. Invia s a Carol. Carol calcola la sua chiave privata di lungo termine x usando s e la sua password reale P Carol 1. Steve C --> 2. x = H(s, P) <-- s 3. A = g^a A --> 4. <-- B, u (lookup s, v) B = v + g^b 5. S = (B - g^x)^(a + ux) S = (A · v^u)^b 6. K = H(S) K = H(S) 7. M[1] = H(A, B, K) M[1] --> (verify M[1]) 8. (verify M[2]) <-- M[2] M[2] = H(A, M[1], K) 3. Carol genera un numero random a, 1 < a < n, calcola la sua chiave pubblica A = g^a, e la invia a Steve. Steve genera un suo numero random b, 1 < b < n, calcola la sua chiave pubblica B = v + g^b, e la invia a Carol, insieme al paramemtro generato in modo random u. Carol e Steve calcolano il loro valore esponenziale comune S = g^(ab + bux) Se la password di Carol P corrisponde a quella che ha usato originariamente per generare v, entrambi I valori S saranno uguali 4. 5. Carol 1. Steve C --> 2. x = H(s, P) <-- s 3. A = g^a A --> 4. <-- B, u (lookup s, v) B = v + g^b 5. S = (B - g^x)^(a + ux) S = (A · v^u)^b 6. K = H(S) K = H(S) 7. M[1] = H(A, B, K) M[1] --> (verify M[1]) 8. (verify M[2]) <-- M[2] M[2] = H(A, M[1], K) 6. 7. Ad entrambi i lati si calcola lo stesso esponenziale S e la chiave K. Carol invia a Steve M[1] come dimostrazione del fatto che possiede una session key. Steve calcola M[1] e verifica che corrisponde a quello inviatogli da Carol. Steve invia a Carol M[2] come prova del fatto che possiede la session key corretta. Carol verifica a sua volta M[2] accettandola solo se corrisponde al valore di Steve. 8. Carol 1. Steve C --> 2. x = H(s, P) <-- s 3. A = g^a A --> 4. <-- B, u (lookup s, v) B = v + g^b 5. S = (B - g^x)^(a + ux) S = (A · v^u)^b 6. K = H(S) K = H(S) 7. M[1] = H(A, B, K) M[1] --> (verify M[1]) 8. (verify M[2]) <-- M[2] M[2] = H(A, M[1], K) Rubare il file delle pw con SRP consente un costoso attacco a dizionario • x = H(s, P) v = g^x • I valori memorizzati sono v e s • Per trovare P, dovrei impostare un enorme attacco di forza bruta: – Calcolo x’ a partire da P’ e s: verifico che v = g^x’ Cosa manca a SRP per funzionare via Web? • SRP è solo da poco rilasciato con licenza simil-BSD • Per farlo funzionare in modo sicuro su un browser è necessario far comunque riempire la pagina di login via SSL – Altrimenti il sistema è vulnerabile a facili attacchi di phishing – Ne risulta uno schema che può essere colpito da chiunque possa compromettere una pagina web MS-CHAP v2 protocol • Microsoft Protocol Challenge-Handshake Authentication • In MS-CHAP il processo di autenticazione è reciproco, il client e il server si presentano e il server deve dimostrare al client che è in grado di accedere al database dove è contenuta la password dell'utente che sta tentando la connessione MS-CHAP v2 protocol 0. Il server conserva delle coppie <uid,NTLM hash> 1. Client requests a login challenge from the Server. 2. The Server sends back a 16-byte random challenge (RC). 3a. The Client generates a random 16-byte number, called the Peer Authenticator Challenge (PAC) 3b. The Client generates an 8-byte challenge (CH) by hashing RC received in step (2), the 16-byte PAC generated in step (3a), and the Client's username. (See Section 3 for details.) CH = SHA1(RC + PAC + UID). 3c. The Client creates a 24-byte reply (REP), using the Windows NT hash function and the 8-byte challenge generated in step (3b): REP = DES(X, C) +DES(Y,C) + DES(Z, C). X | Y | Z = NTLM Hash (16 byte + 5 byte nulli). 3d. The Client sends the Server the results of steps (3a) and (3c). 4a. The Server uses the hashes of the Client's password, stored in a database, to decrypt the replies. If the decrypted blocks match the challenge, the Client is authenticated. MS-CHAPv2 - II 4b. The Server uses the 16-byte Peer Authenticator Challenge from the client, as well as the Client's hashed password, to create a 20-byte Authenticator Response." 5. The Client also computes the Authenticator Response. If the computed response matches the received response, the Server is authenticated. MPPE Key derivation • MK = SHA1(NT password hash + RE + “This is the MPPE Master Key"). Truncate to get a 16byte master-master key. • Derive two session keys: Hash the master-master key, 40 bytes of 0x00, an 84-byte constant and 40 bytes of 0xF2 with SHA. Truncate to get a 16byte output. Constants: «Magic server to client constant», «Pad to make it do more than one iteration», «session key to client-to-server signing key magic constant», MS-CHAP v2 protocol 0. Il server conserva delle coppie <uid,NTLM hash> 1. Il client richiede un authenticator challenge al server 2. 3. Il server invia un random authenticator challenge di 16-bytes (SC) Il client genera la risposta: a) b) c) d) e) f) genera un random peer challenge di 16-bytes (PC) genera il challenge calcolando l’hash dell’authenticator challenge, del peer challenge, e della user's login con SHA genera l’hash NTLM H della password dell’utente (16 byte) H è riempito con 5 bytes di zero. Dai risultanti 21 bytes si ottengono 3 chiavi DES di 7-byte i primi 8 bytes dell’hash generato in (b) sono cifrati con DES con ciascuna delle chiavi generate in (d) i 24 bytes risultanti da (e), i 16-byte random peer challenge, e la user's login sono inviate al server come risposta MS-CHAP v2 protocol 4. 5. Il server decifra la risposta con la password hashed del client che è memorizzata in un database Se questo valore corrisponde al challenge, il server invia una risposta di autenticazione positiva a) b) c) 6. Il server calcola un valora SHA-1 ottenuto da Hash(H) e il letterale costante “Magic server to client signing constant“ Il server genera un altro valore hash usando SHA dall’output di 20-byte del passo 5.a), il challenge di 8-byte (passo 3 (b)), e una costante “Pad to make it do more than one iteration“ I risultanti 20 bytes sono inviati al client nella forma “S=<hupper-case ASCII representation of the byte values>“ Il client usa la stessa procedura per produrre i 20 bytes e li confronta alla servers authenticator response. Se c’è corrispondenza client e server sono reciprocamente autenticati