class: center, middle # SECURING ACCOUNT --- - La vita lavorativa, sociale, economica delle persone è online. -- - Documenti, informazioni, numeri di carta di credito sono all'interno di siti web (portali) -- - Le persone sono identificati da username e password -- - E' vitale tenere sicure queste informazioni --- # PASSWORD -- - autenticazione tramite conoscenza -- - supponiamo ci sia una password di 4 cifre -- - quanto tempo ci mette un pc a controllare tutte le combinazioni ? -- ``` 0 0 0 0 0 0 0 1 0 0 0 2 .... 9 9 9 9 ``` -- - 1 ora, 1 minuto, 1 secondo ? --- - Proviamo ! -- - Codice Javascript (linguaggio interpretato usato nel browser) -- - Non è il linguaggio più veloce, ce ne sono altri che sono molto piu' veloci -- ```javascript console.time("crack"); digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; for(let d1 of digits) for(let d2 of digits) for(let d3 of digits) for(let d4 of digits) console.log(d1, d2, d3, d4); console.timeEnd("crack"); ``` -- - 10 x 10 x 10 x 10 = 10000 combinazioni --- - console.log è una funzione onerosa, cambiamola: ```javascript function controlla_pass(d1, d2, d3, d4) { return d1==='9' && d2==='9' && d3==='9' && d4==='9'; } console.time("crack"); digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; for(let d1 of digits) for(let d2 of digits) for(let d3 of digits) for(let d4 of digits) if (controlla_pass(d1, d2, d3, d4)) console.log("account craccato:", d1, d2, d3, d4); console.timeEnd("crack"); ``` --- - 4 lettere maiuscole ```javascript function controlla_pass(d1, d2, d3, d4) { return d1==='Z' && d2==='Z' && d3==='Z' && d4==='Z'; } console.time("crack"); letters = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; for(let d1 of letters) for(let d2 of letters) for(let d3 of letters) for(let d4 of letters) if (controlla_pass(d1, d2, d3, d4)) console.log("account craccato:", d1, d2, d3, d4); console.timeEnd("crack"); ``` -- - 26 x 26 x 26 x 26 = 456.976 --- - 4 digit / lettere maiuscole / lettere maiuscole / simboli ```javascript function controlla_pass(d1, d2, d3, d4) { return d1==='§' && d2==='§' && d3==='§' && d4==='§'; } console.time("crack"); letters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '|', '\\', '!', '"', '£', '$', '%', '&', '/', '(', ')', '=', '?', '^', '@', '#', '<', '>', ',', '.', '-', '_', ';', '§' ]; for(let d1 of letters) for(let d2 of letters) for(let d3 of letters) for(let d4 of letters) if (controlla_pass(d1, d2, d3, d4)) console.log("account craccato:", d1, d2, d3, d4); console.timeEnd("crack"); ``` -- - 85 x 85 x 85 x 85 = 52.200.625 --- - 8 digit ```javascript function controlla_pass(d1, d2, d3, d4, d5, d6, d7, d8) { return d1==='§' && d2==='§' && d3==='§' && d4==='§' && d5==='§' && d6==='§' && d7==='§' && d8==='§'; } console.time("crack"); letters = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '|', '\\', '!', '"', '£', '$', '%', '&', '/', '(', ')', '=', '?', '^', '@', '#', '<', '>', ',', '.', '-', '_', ';', '§' ]; for(let d1 of letters) for(let d2 of letters) for(let d3 of letters) for(let d4 of letters) for(let d5 of letters) for(let d6 of letters) for(let d7 of letters) for(let d8 of letters) if (controlla_pass(d1, d2, d3, d4, d5, d6, d7, d8)) console.log("account craccato:", d1, d2, d3, d4, d5, d6, d7, d8); console.timeEnd("crack"); ``` --- - Il browser si è bloccato -- - Perché non ha terminato? -- - Qualche errore ? -- - proviamo a stimare il tempo necessario per controllare tutte le password -- - Il tempo per controllare 4 digit ( 52.200.625 di combinazioni) deve essere moltiplicato per 52.200.625 -- - La lunghezza della password è determinante --- - chi crea i siti o servizi cerca un bilanciamento tra sicurezza della password e usabilita' -- - cerchiamo di elencare in questo corso le Best Practice -- - le password devono essere minimo 8 caratteri. -- - Ma i servizi di autenticazione dovrebbero accettare password molto più lunghe -- - con caratteri compresi spazi, simboli e caratteri unicode -- - spoiler: nessuno lo fa... --- - chi controlla le password dovrebbe verificare che non siano già presenti in: -- - password ottenute da precedenti breach corpuses (https://haveibeenpwned.com/Passwords) -- - parole comuni del dizionario -- - caratteri ripetuti o sequenziali 'aaaaa' oppure '1234abcd' -- - parole legate al contesto, ad esempio il nome del servizio 'contocorrente', 'amazonpassword', il nome utente es: davidegessi e tutti i derivati da questi -- - Idealmente le password dovrebbero essere RANDOM --- - il verificatore non deve permettere l'uso di hint visibili ad un utente non autorizzato -- - esempio: "il nome del mio primo animale domestico" -- - "il cognome della nonna materna" --- - Negli ambienti di lavoro c'e' la pratica di cambiare password ogni 3-6 mesi -- - ora non e' piu' raccomandato. -- - Le password generate sono simili magari con l'aggiunta di un numero alla fine -- - per l'utente è un procedura frustrante -- - questo tipo di password si dimenticano facilmente -- - L'ultimo numero era un 3, anzi no quella era la password precedente, ora è un 4 ... --- - il verificatore deve permettere solo un numero limitato di tentativi di accesso in un determinato periodo di tempo. -- - Esempio cellulare. Ti puoi dimenticare il passcode ma se lo sbagli 10 volte di fila puo' anche essere un tentativo di intrusione... -- - è un bilanciamento tra sicurezza ed usabilita' --- - il senso è di rallentare / scoraggiare un eventuale attacco -- - il primo blocco è di 1 minuto, -- - ... il secondo magari 5 minuti e cosi' via. --- # 2FA: 2 Factor Authentication -- - più genericamente MFA: Multi Factor Authentication -- - login piu' inserimento di un codice che proviene da altra (altre) fonti -- - primo step dimostro la conoscenza (password) -- - secondo step dimostro il possesso (email o biometric auth) --- # OTP - One Time Password -- - La password cambia ad ogni utilizzo -- - Server ed utente condividono una chiave segreta -- - sul client c'e' un'app di autenticazione -- - Il client genera il codice: -- - TOTP: OTP = HMAC(chiave, tempo_corrente) Cambia ogni 30 secondi -- - HOTP: OTP = HMAC(chiave, contatore) Cambia ad ogni uso -- - Il server rifà il calcolo del client, se i codici coincidono allora viene permesso l'accesso. --- - Se rubano la pass non basta -- - Se sniffano l'otp è già scaduto -- - SMS OTP: NO ! -- - Tutto ciò che è legato alla telefonia non è sicuro (SIM swap) -- - Solitamente l'app OTP è accettabile -- - Hardware key: stato dell'arte -- - Meglio la app del sms perche' la sim puo' essere clonata, tramite social engineering --- # Keylogging -- - Malware su pc e telefono. -- - usare solo i propri device! Neanche quelli di amici sono sicuri -- - viene intercettato ogni cosa che viene scritta, ogni click del mouse, ogni contenuto delle finestre -- - screenshot dello schermo --- # Credential Stuffing -- - gli attacker usano nomi e password gia' presenti in un file caricati sul web o darkweb. -- - grave perche' le persone tendenzialmente usano la stessa password ovunque. --- # Social Engineering -- - l'attacker ha un contatto sociale con la vittima -- - usa skill sociali per ottenere informazioni -- - i foglietti con le password (non ascoltare chi dice di farlo), -- - valutare chi chiede cose strane e che puo' essere riferito al proprio account. -- - un nuovo consulente che, durante la pausa caffè, ti chiede il cognome tua nonna è sospetto. --- # Phishing -- - mail che sembrano provenire da un sito affidabile o simile ad uno che si usa. -- - sms da corrieri con link da cliccare. -- - E' semplice simulare un sito professionale identico a siti esistenti. -- - Guardare attentamente l'url del link -- - Anzi no ! scrivere manualmente il link nell'url dei siti menzionati nelle email -- - e comunque non cliccare i link che arrivano per mail. -- - Certi siti simulano anche il 2FA. --- # Man in the middle attack -- - non c'e' mai una comunicazione diretta tra il proprio pc e il sito finale. -- - Serve la crittografia -- - Sarà l'argomento principale di queste slide --- # Il problema siete voi ! -- - lo sono anch'io... lo siamo tutti -- - Le persone non sono fatte per usare password complicate. -- - Una persona ha tanti account... io ne avro' centinaia, come fare ? --- # Single Sign On -- - accedere ad altri siti, usando l'account google o facebook o twitter -- - aumenta la sicurezza, e l'usabilita'. -- - Il sito finale non vede la tua password. --- # Password manager -- - Evita il phishing perche' ricorda l'url corretta di un sito. -- - Punto di debolezza l'utente deve ricordare un'unica password. -- - Funzionano su piu' browser, sul cellulare. -- - Vanno bene anche i password manager di android, apple e microsoft. -- - Sembra un mucchio di lavoro applicare il password manager a tutti i propri account -- - ma si puo' applicare un po' alla volta -- - occorre farlo -- - Esempio Bit Warden --- # Nota sull'accesso biometrico -- - ogni tipo di biometria ha uno spazio di combinazioni finito -- - possiamo comparare la sicurezza biometrica alla lunghezza in caratteri di una password -- - Impronta digitale - entropia 40-60 bit - password di 7-10 caratteri -- - Riconoscimento facciale - entropia 20-30 bit - password di 4-5 caratteri -- - Iride / retina - entropia 150-200 bit - password di 25-30 caratteri -- - Voce - entropia 30-40 bit - password di 5-7 caratteri -- - Firma dinamica - entropia 20-30 bit - password di 4-5 caratteri