Sikker kode? Gennemgang af mest almindelige hacker angreb Developer & Platform Strategy Microsoft http://blogs.msdn.com/henrikwh henrikwh@microsoft.com Agenda Sikkerhed i medierne Trusselssenarier Mest almindelige angreb Buffer overrun Arithmetic Errors SQL Injection Denial of Service Attacks (DoS) Cross-Site Scripting (XSS) http://msdn.blogs.com/henrikwh 1
Sikkerhed i medierne Fra Computerworld.dk Fem danske sparekasser hacket DSB Udskriv andres billetter Datatilsynets hjemmeside hacket Mobiltelefon-orm spredes gennem Symbian Windows XP hacket før premiere Hotmail hacket med én linie kode Post Danmarks hjemmeside gik i sort Velkommen på forsiden Hmmm, der var jeg. Lad mig sige det sådan, jeg kom til at rette fejlen mere om det angreb senere :-/ http://msdn.blogs.com/henrikwh 2
Almindelige typer af angreb Organisatoriske angreb Hackers Beskyttede data Automatiserede angreb Sikkerheds uheld Virus, Trojanske heste, og orme DoS Forbindelse fejler Denial of Service (DoS) Mest anvendte angreb http://msdn.blogs.com/henrikwh 3
Buffer overrun SQL Slammer & Sapphire 1/1 2003, UDP pakke til SQL Server 2000 Fly fik ikke lov til at lette ATM er holdt op med at virke Dele af Internettet holdt op med at virke George Bush blev notificeret Heldigvis var det ikke et rigtig ondsindet angreb. Formålet var udelukkende at brede sig. Læs mere og se koden der var skyld hullet: http://www.blackhat.com/presentations/bh-usa-02/bh-us-02-litchfield-oracle.pdf Buffer Overrun Top of Stack void UnSafe (const char* uncheckeddata) char[4] { } char localvariable[4]; int anotherlocalvariable; strcpy (localvariable, uncheckeddata); int Return address http://msdn.blogs.com/henrikwh 4
Demo Buffer Overrun Beskyttelse mod Buffer Overruns Vær forsigtig når du bruger: strcpy strncpy CopyMemory MultiByteToWideChar Brug /GS compile option i Visual C++ for at se buffer overruns Brug strsafe.h for sikrere buffer håndtering http://msdn.blogs.com/henrikwh 5
Aritmetiske fejl Sker når grænserne af en variabel overskrides Leder til seriøse runtime fejl Er ofte overset og underestimeret Inkluderer: Overflow værdien er for stor for en datatype Underflow værdien er for lille til en datatype Beskyttelse mod aritmetiske fejl Vær bevist omkring grænser for anvendte datatyper Skriv kode der kontrollerer grænser Overvej at bruge sikre, genbrugelige funktioner http://msdn.blogs.com/henrikwh 6
Fang aritmetiske fejl Aritmetiske fejl kan fanges ved at: Bruge checked keyword Projektindstillingerne byte b=0; while (true) { Console.WriteLine (b); checked { b++; } } Hvad er SQL Injection? Manipulering med brugerinput Brugt af hackere til at: Undersøge databaser skemaer og data Undgå autentificering Eksekvere flere SQL-kommandoer Kalde store procedures http://msdn.blogs.com/henrikwh 7
Hvad er der galt? (1 af 2) ID: 1001 SELECT HasShipped FROM detail WHERE ID='1001' Ups, alle data bliver eksponeret ID: 1001' or 1=1 -- SELECT HasShipped FROM detail WHERE ID= '1001' or 1=1 -- ' Hvad er der galt? (2 af 2) Ups, øv, restore ID: 1001' drop table orders -- SELECT HasShipped FROM detail WHERE ID= '1001' drop table orders -- ' Vi holder lukket på ubestemt tid! ID: 1001' exec xp_cmdshell( fdisk.exe ) -- SELECT HasShipped FROM detail WHERE ID= '1001' exec xp_cmdshell('fdisk.exe') -- ' http://msdn.blogs.com/henrikwh 8
Demo SQL Injection SQL Injection C# Find 4 fejl string Status = "No"; string sqlstring =""; try { SqlConnection sql= new SqlConnection( @"data source=localhost;" + "user id=sa;password=password;"); sql.open(); sqlstring="select HasShipped" + " FROM detail WHERE ID='" + Id + "'"; SqlCommand cmd = new SqlCommand(sqlstring,sql); if ((int)cmd.executescalar()!= 0) Status = "Yes"; } catch (SqlException se) { Status = sqlstring + " failed\n\r"; foreach (SqlError e in se.errors) { Status += e.message + "\n\r"; } } catch (Exception e) { Status = e.tostring(); } http://msdn.blogs.com/henrikwh 9
Beskyttelse mod SQL Injection Brug stored procedures eller parameteriseret SQL forespørgsler til datatilgang Rens alt input Behandl alt input som skadeligt, indtil andet er bevist Kig efter valid data, afvis alt andet Overvej at bruge regulære udtryk for at fjerne skadelige karakterer Anvend mindste privilegier Kør aldrig som sa Begræns adgang til indbyggede stored procedures Lad være med at udskrive database fejl Denial of Service (DoS) angreb CPU udsultning Memory udsultning Resource udsultning Network udsultning http://msdn.blogs.com/henrikwh 10
Hvad er Cross-Site Scripting? En teknik der muliggør at hackere kan Eksekvere script i en klients webbrowser Indsætte <script>, <object>, <applet>, <form>, og <embed> tags Stjæle websession-information og autentificeringscookies Tilgå klientcomputeren Enhver webside der renderer HTML og indeholder brugerinput er udsat Cross Site Scripting Et eksempel <% WelcomeMessage(Request.QueryString["name"]); %> <script runat='server'> void WelcomeMessage(string name) { Response.Out.Write("<h2>Welcome, {0}</h2>", name); } </script> Hvad hvis name ser ud som følgende: Bob<img src='www.badsite.com/bad.gif'/> eller: Bob<script> </script> http://msdn.blogs.com/henrikwh 11
Forsvar mod Cross-Site Scripting angreb Lad være med at: Tro på brugerinput Udskrive web-baseret brugerinput, medmindre du har valideret det Gemme hemmelige informationer i cookies Gør følgende: Brug HttpOnly cookie mulighed IE 6 SP1 Kun http adgang ikke script Brug <frame> sikkerhedsattributten Udnyt.NET sikkerhedsfunktionaliteten Canonicalization Input kan skrives på mange måder Et filnavn kan f.eks. skrives på mange måder c:\temp\somefile.dat somefile.dat c:\temp\subdir\..\somefile.dat c:\ temp\ somefile.dat..\somefile.dat http://msdn.blogs.com/henrikwh 12
Den samme fil! MySecretFile.txt MySecretFile.txt. MySecr~1.txt MySecretFile.txt::$DATA Den samme url URL! http://www.foo.com http://www%2efoo%2ecom http://www%252efoo%2ecom http://172.43.122.12 http://2888530444 http://msdn.blogs.com/henrikwh 13
Lad være med at tro på brugerinput Valider alt input Antag at alt input er skadeligt, indtil andet er bevist Kig efter valid data, afvis alt andet Begræns, afvis, og rens brugerinput med Type checks Length checks Range checks Format checks Validator.ValidationExpression = "\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*"; Resourcer Bøger Writing Secure Code 2 Improving Web Application Security Hunting Security bugs Links Microsoft Security Site (all audiences) http://www.microsoft.com/security MSDN Security Site (developers) http://msdn.microsoft.com/security TechNet Security Site (IT professionals) http://www.microsoft.com/technet/security http://msdn.blogs.com/henrikwh 14
2005 Microsoft Corporation. All rights reserved. This presentation is for informational purposes only. Microsoft makes no warranties, express or implied, in this summary. http://msdn.blogs.com/henrikwh 15