1 Sicurezza delle applicazioni web Andrea Zwirner Linkspirit andrea@linkspirit.it @AndreaZwirner Andrea Zwirner Linkspirit
Andrea Zwirner 2 Mi interesso di sicurezza informatica dallo scorso millennio Connettere significava intrecciare Hacker non aveva ancora alcun significato Ho fondato Linkspirit, azienda che si occupa di sicurezza informatica Consulenza nella progettazione sicura di software e sistemi Verifiche di sicurezza su software e sistemi Formazione in materia di sicurezza informatica Andrea Zwirner Linkspirit
Andrea Zwirner 3 Partecipo a diversi progetti legati la ricerca e divulgazione della cultura sulla sicurezza informatica Andrea Zwirner Linkspirit
La sicurezza informatica Insieme di misure di carattere organizzativo, tecnologico e procedurale mirate a garantire CONFIDENZIALITÀ INTEGRITÀ DISPONIBILITÀ dell'informazione. Andrea Zwirner Linkspirit 4
Sicurezza applicativa Modellazione ed analisi dei rischi derivanti dal software Consapevolezza di analisti, sviluppatori, beta tester, utenti finali Sviluppo dell'architettura (secure by design) Ciclo di sviluppo del software Scrittura del codice Controlli di sicurezza comuni nelle fasi di test / review Utilizzo consapevole da parte degli utenti Andrea Zwirner Linkspirit 5
6 Andrea Zwirner Linkspirit
Consapevolezza 7 Se non si coinvolgono gli utenti, ogni sforzo è vano Ensuring cybersecurity is a common responsibility. End users play a crucial role in ensuring the security of networks and information systems: they need to be made aware of the risks they face online and be empowered to take simple steps to guard against them. Cybersecurity Strategy of the European Union Commissione europea, febbraio 2013 Andrea Zwirner Linkspirit
Consapevolezza Andrea Zwirner Linkspirit 8
Titolo della Presentazione e della slide [ ] al fine di rafforzare le capacità nazionali di prevenzione, reazione e ripristino [ ] individua come nodi primari [ ]: promozione e diffusione della cultura della sicurezza cibernetica sia tra i cittadini che all interno delle istituzioni [...] al fine di accrescere il livello di consapevolezza e di conoscenza della minaccia e dei relativi rischi Quadro strategico nazionale per la sicurezza dello spazio cibernetico Presidenza del Consiglio dei Ministri, dicembre 2013 Andrea Zwirner Linkspirit 9
Il web non è stato progettato per essere ne dinamico ne sicuro Contenuti statici in sola lettura Nessuna sicurezza implicita (o by design ) Il Web 2.0 eredita queste peculiarità dal suo predecessore, fornendo Ampia superficie d'attacco Svariati petabyte di informazioni di miliardi di utenti (privati, aziende, banche e governi) Accesso diretto alle macchine degli utenti stessi Andrea Zwirner Linkspirit 10
La metodologia 11 OWASP The Open Web Application Security Project Andrea Zwirner Linkspirit
Cos'è l'owasp 12 Associazione senza scopo di lucro Missione: aumentare la visibilità relativa la sicurezza del software al fine di permettere di prendere decisioni informate ad imprese ed individui Andrea Zwirner Linkspirit
Cosa fa l'owasp Attiva nel campo della ricerca e divulgazione della cultura della sicurezza Mantiene svariati (e rinomati) progetti legati la sicurezza applicativa Includono informazioni circa librerie, API, best practices, auditing, suddivisi nelle tre categorie Protect Detect Life Cycle Andrea Zwirner Linkspirit 13
Progetti OWASP interessanti Top Ten Project Mobile Security Project Top Ten Mobile Risks Top Ten Mobile Controls ENISA European Network and Information Security Agency Development Guide Secure Coding Practices - Quick Reference Guide Code Review Guide Testing Guide Web Goat Project Andrea Zwirner Linkspirit 14
Top Ten Project 15 Descrive le dieci vulnerabilità valutate come più rischiose in ambito web application Indirizzato a sviluppatori, designer, manager ed organizzazioni Fornisce linee guida per prevenire e rilevare le vulnerabilità descritte Indipendente da linguaggio / framework utilizzato Andrea Zwirner Linkspirit
Top Ten 2013 16 A1: Injection A2: Broken Authentication and Session Management A3: Cross-Site Scripting (XSS) A4: Insecure Direct Object References A5: Security Misconfiguration A6: Sensitive Data Exposure A7: Missing Function Level Access Control A8: Cross-Site Request Forgery (CSRF) A9: Using Known Vulnerable Components A10: Unvalidated Redirects and Forwards Andrea Zwirner Linkspirit
A1 Injection 17 La vulnerabilità Si verifica quando dati non fidati sono inviati direttamente ad un interprete (SQL, OS, LDAP, etc) Un attaccante può inviare richieste forgiate in modo da forzare l'interprete ad eseguire comandi non previsti Vettori d'attacco Qualunque fonte di dati, incluse quelle interne Andrea Zwirner Linkspirit
A1 Impatti 18 Difficoltà di sfruttamento: semplice Impatto tecnico: grave Takeover del completo database (e.g. sqlmap) Eliminazione / alterazione dei dati gestiti dall'interprete Blocco / corruzione / possesso del sistema informatico Impatto sul business: non determinato Proporzionale all'importanza dei dati gestiti a livello di business Andrea Zwirner Linkspirit
A1 Esempio SQL Injection Parametrizzazione insicura di una query SQL 1. var_id = _post(id); 2. query = SELECT * FROM tab WHERE id = ' + var_id + ' ; 3. result = invia_query_al_database(query); 4. fai_qualcosa_con(result); Andrea Zwirner Linkspirit 19
A1 Esempio SQL Injection Parametrizzazione insicura di una query SQL 1. var_id = _post(id); 2. query = SELECT * FROM tab WHERE id = ' + var_id + ' ; 3. result = invia_query_al_database(query); 4. fai_qualcosa_con(result); Parametri attesi _post(id) = n naturale (o, al più, intero) Andrea Zwirner Linkspirit 20
A1 Esempio SQL Injection Parametrizzazione insicura di una query SQL 1. var_id = _post(id); 2. query = SELECT * FROM tab WHERE id = ' + var_id + ' ; 3. result = invia_query_al_database(query); 4. fai_qualcosa_con(result); Parametri attesi _post(id) = n naturale (o, al più, intero) Esempio di parametro inatteso _post(id) = 23'; DROP TABLE tab; - Andrea Zwirner Linkspirit 21
A1 Esempio SQL Injection Parametrizzazione insicura di una query SQL 1. var_id = _post(id); 2. query = SELECT * FROM tab WHERE id = ' + var_id + ' ; 3. result = invia_query_al_database(query); 4. fai_qualcosa_con(result); Parametri SELECT *attesi FROM tab WHERE id = '23'; DROP TABLE tab; --' _post(id) = n naturale (o, al più, intero) Esempio di parametro inatteso _post(id) = 23'; DROP TABLE tab; - Andrea Zwirner Linkspirit 22
A1 Injection fun! Andrea Zwirner Linkspirit 23
A1 Injection fun! ZU 0666',0,0); DROPAndrea DATABASE TABLICE; -Zwirner Linkspirit 24
A1 OS Injection Parametrizzazione insicura di un comando shell 1. var_ip = _post(ip); 2. command = /bin/ping -c2 + var_ip; 3. result = esegui_comando(command); 4. stampa_nella_pagina(result); Parametri attesi _post(ip) = ip (indirizzo IP) Esempio di parametro inatteso _post(ip) = 127.0.0.1; cat /etc/passwd Andrea Zwirner Linkspirit 25
A1 Prevenzione Utilizzare API che neghino l'uso diretto dell'interprete, fornendo un interfaccia parametrizzata Fare escaping dei caratteri speciali, usando le sequenze specifiche per l'interprete Attenzione: utilizzare WAF o white list canonizzando i comandi permessi può essere utile, ma non necessariamente risolutivo C'è sempre chi conosce le regexp meglio di te! Andrea Zwirner Linkspirit 26
A1 Rilevazione Se non sono stati definiti pattern di sviluppo, si è vulnerabili. Revisione del codice Verifica della separazione fra gli interpreti ed i dati non fidati Penetration test Andrea Zwirner Linkspirit 27
A1 Esempio di parametrizzazione sicura Parametrizzazione sicura di una query (PHP + MySQL + mysqli) 1. $var_id = $_POST['id']; 2. $query = $db_conn->prepare('select * FROM tab WHERE id =?'); 3. $query.bind_param('id', $var_id); 4. $query.execute(); 5. $result = $query.get_result(); 6. fai_qualcosa_con($result); Andrea Zwirner Linkspirit 28
A2 Broken Auth and Session Mgmt Si verifica quando le funzioni legate ad autenticazione e gestione delle sessioni permettono la compromissione di password, chiavi o token di sessione o hanno falle nell'implementazione che possono portare ad assumere l'identità di utenti legittimi Vettori d'attacco Sistemi di autenticazione ed autorizzazione Andrea Zwirner Linkspirit 29
A2 Impatti 30 Difficoltà di sfruttamento: media Impatto tecnico: grave Accesso con i privilegi di autorizzazione di qualunque utente, anche amministrativo Impatto sul business: non determinato Proporzionale al valore di business dei dati trattati o delle funzioni applicative Considerare l'impatto sul business della pubblicazione della falla (attacchi e reputazione) Andrea Zwirner Linkspirit
A2 Scenari d'attacco Brute force su password o username password deboli Predizione di identificativo di sessione o credenziali di accesso Replay autenticazione al di fuori di un canale crittografato Session spotting assegnazione di sessione al di fuori di un canale crittografato Session fixation assegnazione malevola di sessione precedentemente avviata Timeout di sessione troppo lunghi o inesistenti Password non crittografate o non salate nella base dati Andrea Zwirner Linkspirit 31
A2 Prevenzione Mettere a disposizione degli sviluppatori un singolo e sicuro insieme di controlli per l'autenticazione e la gestione delle sessioni che Abbia un'interfaccia semplice da utilizzare Sia ben documentato Aderisca ad uno standard affiabile Application Security Verification Standard (ASVS) Verificare che i controlli non siano vulnerabili ad attacchi di tipo XSS ( A3: XSS), che permetterebbero il furto di sessioni Andrea Zwirner Linkspirit 32
A2 Rilevazione [1/2] Il concetto principe è la verifica di protezione di credenziali ed id di sessione Le credenziali sono salvate usando hash (salted) o crittografia? E' possibile indovinare o modificare le credenziali mediante errori nelle funzioni di gestione degli account? Creazione, cambio / recupero password, etc Gli id di sessione sono esposti negli URL? Gli id di sessione sono vulnerabili ad attacchi del tipo session fixation? Andrea Zwirner Linkspirit 33
A2 Rilevazione [2/2] Le sessioni hanno timeout? Gli utenti possono disconnettersi? Gli id di sessione sono cambiati in seguito ad ogni variazione nel livello di autorizzazione? Le password e gli id di sessione sono scambiati attraverso canali crittografati? ( A6: Sensitive Data Exposure) Andrea Zwirner Linkspirit 34
A4 Insecure Direct Object References Si verifica quando l'applicazione usa riferimenti diretti ad oggetti (es. file, directory, chiavi db) per la generazione delle pagine, senza verificare che l'utente che li richiede abbia i permessi di autorizzazione necessari a manipolarli Vettori di attacco Cambio di riferimenti ad oggetti da parte di utenti (eventualmente) autenticati in url o parametri GET/POST Andrea Zwirner Linkspirit 35
A4 Impatti 36 Difficoltà di sfruttamento: semplice Impatto tecnico: medio Compromissione (lettura e/o scrittura) di tutti i dati referenziati dal parametro Impatti sul business: non determinati Proporzionali al valore di business dei dati trattati Considerare l'impatto sulla reputazione Andrea Zwirner Linkspirit
A4 Scenario d'attacco 1. conto = _post['conto']; 2. query = prepara('select * FROM conti WHERE conto = %', conto); 3. result = invia_al_database(query); 4. fai_qualcosa_con(result); L'attaccante non deve fare altro che modificare il parametro POST conto ed otterrà il risultato per un conto per cui non possiede autorizzazione. Andrea Zwirner Linkspirit 37
A4 Prevenzione L'approccio è quello di proteggere qualunque oggetto accessibile dagli utenti Usare riferimenti indiretti agli oggetti (per utente o sessione): Esempio: non mettere gli Id a database in una drop-down list, ma una mappatura degli stessi generata dinamicamente per la sessione attiva Verificare l'autorizzazione prima di fornire il contenuto Andrea Zwirner Linkspirit 38
A4 Esempio sicuro Mappatura agli oggetti 1. query = prepara('select prendicontisessione(%)', session_id); 2. conti[] = invia_al_database(query); 3. metti_conti_in_dropdown(conti[], dropdown); qui c'è l'interazione dell'utente Andrea Zwirner Linkspirit 39
A4 Esempio sicuro 40 1. map_conto = prendi_indice_selezionato(dropdown); 2. query = prepara('select verificapermessi(%,%)', conti[map_conto], session_id); 3. result = invia_al_database(query); 4. if (result) { 5. tutto_ok_procedi(); 6. } else { 7. biasima_utente_e_disconnetti(session_id); 8. } Andrea Zwirner Linkspirit
A4 Rilevazione e prevenzione Verificare che tutti i riferimenti ad oggetto siano indiretti e protetti adeguatamente Mappatura dinamica e limitata alle risorse cui l'utente (o la sessione) ha autorizzazione in lettura Verifica d'autorizzazione in scrittura nel caso di successiva richiesta di manipolazione degli oggetti referenziati In caso di incongruenza chiudere le sessioni!! Nel (malaugurato) caso di necessità di riferimenti diretti, valgono le stesse regole! Andrea Zwirner Linkspirit 41
A8 Cross-site Request Forgery (CSRF) Si verifica quando è possibile prevedere ogni parametro richiesto per effettuare una specifica chiamata a funzione. In questo caso è possibile far eseguire operazioni non volute al browser di un utente legittimo Vettori d'attacco Iniezione di richieste HTTP forgiate via tag d'immagine, XSS, iframe o altre tecniche Hanno successo ogni qual volta l'utente è già autenticato Andrea Zwirner Linkspirit 42
A8 Impatti 43 Difficoltà di sfruttamento: media Impatto tecnico: medio Per quanto distruttive, l'attaccante può far eseguire solo funzioni cui l'utente è autorizzato Impatto sul business: non determinato Considerare l'importanza a livello di business dei dati trattati Considerare l'importanza di non essere certi dell'effettiva intenzione dell'utente Andrea Zwirner Linkspirit
A8 Esempio 44 L'utente è autenticato sul sito www.sito.it e visita (volontariamente o meno) una pagina del sito dell'attaccante contenente: <img src='http://www.sito.it/esegui=vuota_db' width='0' height='0'> All'invio della richiesta HTTP, il browser includerà automaticamente le informazioni di sessione dell'utente sul sito www.sito.it e la funzione verrà eseguita Andrea Zwirner Linkspirit
A8 Prevenzione Includere un token unico e casuale in ogni pagina che preveda interazione da parte dell'utente, inserendolo in un campo nascosto e verificandolo ad ogni richiesta ricevuta Richiedere ri-autenticazione o prova di umanità (captcha), per le funzioni più delicate Ricordarsi di applicare timeout con tempi inversamente proporzionali al livello di autorizzazione degli utenti Andrea Zwirner Linkspirit 45
A8 - Rilevazione Verificare se ogni link o modulo include un campo contenente un token unico, dinamico e non calcolabile Assicurarsi che le funzioni chiamate verifichino il token (!) Form e link che invocano sulle funzioni che alterano lo stato dei dati sono le più gettonate In caso di limiti di tempo o budget concentrarsi su queste Tenere in considerazione che, per prevenire attacchi del tipo CSRF, non si può fare affidamento su cookies o indirizzi IP di provenienza Andrea Zwirner Linkspirit 46
47 Sicurezza delle applicazioni web Andrea Zwirner Linkspirit andrea@linkspirit.it @AndreaZwirner Andrea Zwirner Linkspirit
Riferimenti 48 OWASP Documenti citati nella presentazione e gli Cheat Sheet. P. Litwin Stop SQL Injection Attacks Before They Stop You Microsoft MSDN B. Damele Advanced SQL injection to operating system full control 2009 Defuse Security Password Hashing Security: Salted Password Hashing Ding it right 2013 R. Ivgi XSS : Cross Site Scripting - Exposed - Why, How, When, Where! E. Benoist Broken Authentication and Session Management 2012 In realtà Benoist è svizzero ed ha erroneamente scritto Brocken invece che Broken nel titolo della versione 2012 del documento. K. Kuliukas How Rainbow Tables work B. Hardin Series about the Owasp Top 10 2009 Euorpean Commission Cybersecurity Strategy of the European Union 2013 Presidenza del Consiglio dei Ministri Quadro strategico nazionale per la sicurezza dello spazio cibernetico - 2013 Andrea Zwirner Linkspirit