dominick baier security consultant thinktecture. 2 wir unterstützen software-entwickler und...
TRANSCRIPT
Secure Codingmit Visual Studio 2008
Dominick BaierSecurity Consultantthinktecture
2
Dominick Baier und thinktecture
Wir unterstützen Software-Entwickler und Architekten bei der Realisierung von .NET- und Web Services-ProjektenWir versuchen, am Puls der Zeit zu bleiben und gleichzeitig die heutigen Probleme mit heutiger Technologie zu lösen
Meine Spezialgebiete sind Sicherheit in verteilten Anwendungen, Identitäts-Management sowie die Windows/.NET Sicherheits-APIs und Technologien
http://www.thinktecture.com/http://www.leastprivilege.com/[email protected]
Agenda
Die typischsten Security ProblemeGegenmaßnahmenCoding TechnikenCompiler SwitchesTools
Die typischsten Probleme
Lassen sich in zwei Kategorien einordnen
Eingabe ValidierungBuffer OverflowsInjection AttackenEncoding / Globalization Probleme
Sicherheits-KontextAdministrator vs StandardbenutzerSYSTEM vs ServicekontoZugriffskontrolllistenUAC
Typische ProblemeEingabe Validierung
Kontroll-Kanal Daten-Kanal
Console.WriteLine(input);
input = "Hello World"
Console.WriteLine("Hello World");
Buffer Overrun: Das Prinzip
void main() { char myLongBuffer[256]; myFunction(myLongBuffer);}
Stack
(bisheriger Stackinhalt)
256MyLongBuffer
Rücksprungadresse
Sonstige Daten
MyShortBuffer 16 Str
ing
s
void myFunction(char *input) { char myShortBuffer[16]; strcpy(myShortBuffer, input); }
Daten sind zu lang !
MyShortBuffer 16256
MyShortBuffer
Gehackte Adresse
Gehackte AdresseMalcode
„Böser“ Inhalt von Input:
Rücksprung an gehackte Adresse…
Malcode ausführen
Sta
ck
Gegenmaßnahmen
Sichere LibrariesDie C Runtime Library ist gut 25 Jahre alt Wurde nicht für Sicherheit designed
LösungsansatzAustauschen der „gefährlichen“ Funktionen durch alternative ImplementierungenStrSafe und Safe CRT BibliothekenCode-Änderungen notwendigVisual Studio gibt C4996 Warnungen aus
Beispiel: Safe CRT
Ausgangspunktvoid Function(char *s1, char *s2) { char temp[16]; strcpy(temp, s1); strcat(temp, s2);}
Unter Verwendung von StrSafeerrno_t Function(char *s1, char *s2) { char temp[16]; errno_t err = strcpy_s(temp, _countof(temp), s1); if (!err) return err; return strcat_s(temp, _countof(temp), s2);}
Compilerswitch /GS
Stack
(bisheriger Stackinhalt)
256MyLongBuffer
Rücksprungadresse
Security Cookie
Str
ing
s
MyShortBuffer
Sta
ck
Prolog: Alloziiert Speicher auf dem Stack für lokale Variablen
sub esp,20h
Epilog: Führt Rücksprung durch
add esp,20h ret
void myFunction(char *input) { char myShortBuffer[16]; strcpy(myShortBuffer, input); }
Prolog: Alloziiert Speicher auf dem Stack für lokale Variablen und speichert Zufallswert für Security Cookie (Canary) absub esp,24h mov eax,dword ptr [___security_cookie (408040h)] xor eax,dword ptr [esp+24h] mov dword ptr [esp+20h],eax Epilog: Prüft den Security Cookie (Canary) und führt anchließend Rücksprung durch mov ecx,dword ptr [esp+20h] xor ecx,dword ptr [esp+24h] add esp,24h jmp __security_check_cookie (4010B2h)
MyShortBuffer 16
Andere Speicherschutz-Mechanismen
/SAFESEHVerhindert die Ausführung ungültiger (überschriebener) Exception-Handler
/NXCOMPATOpt-In für Data Execution Prevention (DEP)
/DYNAMICBASEAddress Space Layout Randomization (ASLR)Vergabe zufälliger Speicheradressen für Image, Stack und Heap
Injection Attacken
SQL InjectionHTML und Script InjectionDirectory Traversal…
SQL Injection
Kontroll-Kanal Daten-Kanal
select userID from users where
username = 'input1'and password =
'input2'
input1 = dominickinput2 = geheim
select userID from users where username = 'dominick'
and password = 'geheim'
SQL Injection
Kontroll-Kanal Daten-Kanal
select userID from users where
username = 'input1'and password =
'input2'
input1 = dominick' --input2 = egal
select userID from users where username = 'dominick' --
and password = 'egal'
Gegenmaßnahmen
Niemals SQL Statements selbst „zusammenbauen“
Parametrisierte Queries mit SqlCommand anstattStored ProceduresLINQ to SQL
SqlCommand und SPROCs
private bool CheckUser(string name, string passwordHash){ SqlCommand cmd = new SqlCommand("dbo.GetUser"); cmd.CommandType = CommandType.StoredProcedure;
SqlParameter nameParam = new SqlParameter() { ParameterName = "@Name", Value = name, SqlDbType = SqlDbType.NVarChar };
SqlParameter pwdParam = new SqlParameter() { ParameterName = "@PasswordHash", Value = passwordHash, SqlDbType = SqlDbType.NVarChar };
cmd.Parameters.AddRange(new SqlParameter[] { nameParam, pwdParam }); SqlDataReader reader = cmd.ExecuteReader();
…}
LINQ to SQL
Benutzt SqlCommand unter der Haube
private static bool CheckUser(string name, string passwordHash){ UsersDataContext context = new UsersDataContext();
int userId = (from u in context.Users where u.Name.Equals(name) && u.PasswordHash.Equals(passwordHash) select u.UserId).Single(); …}
HTML/Script Injection
Kontroll-Kanal Daten-Kanal
<html> Hello input</html
input = dominick
<html> Hello dominick</html
HTML/Script Injection
Kontroll-Kanal Daten-Kanal
<html> Hello input</html
input = <h1>dominick</h1>
<html> Hello <h1>dominick</h1></html
Gegenmaßnahmen
Daten immer für den entsprechenden Ausgabetyp enkodieren
HTML (Attribute)XML (Attribute)URLsJavaScriptVBScript
Microsoft AntiXSS Library und XSSDetect
XSS Detect
Directory Traversal
Kontroll-Kanal Daten-Kanal
string path = "c:\content\";File.ReadAllText( path + input);
input = readme.txt
File.ReadAllText(@ "c:\content\readme.txt)
Directory Traversal
Kontroll-Kanal Daten-Kanal
string path = "c:\content\";File.ReadAllText( path + input);
input = ..\inetpub\wwwroot\web.config
File.ReadAllText(@ "c:\content\..\inetpub\wwwroot\ web.config)
Gegenmaßnahmen
Flexibilität von Windows macht es äußerst schwierigDiese Pfade sind identisch:
..\privat\geheim.doc
..%5c%5cprivate%5cgeheim.doc%2e.\privat\geheim.doc%25%02%54.\privat\geheim.doc..\privat\geheim.doc...\privat\geheim.doc::$data
Gegenmaßnahmen
Vermeiden von Dateinamen als Eingabe
Ersetzen durch IDsErzeugen einer Liste von gültigen DateienEinsatz von CASstatic string ReadFile(string filename)
{ string path = @"c:\content\";
new FileIOPermission( FileIOPermissionAccess.Read, path).PermitOnly();
return File.ReadAllText(path + filename);}
Typische ProblemeSicherheits-Kontext
Typische Anwendungen/Dienste brauchen kein
Administrator KontoSYSTEM Konto
Trotzdem viele Anwendungen fehlerhaft
Zugriff auf SystemverzeichnisseZugriff auf HKLM
Sicherheits-Kontext
Vista läuft im Standard-Benutzer Modus
Entweder „echter“ Standard-Benutzer oder UAC
„Virtualization“ Feature bietet begrenzte Kompatibiliät
Wird in der Version nach Vista entferntWird standardmäßig durch 3.5 Kompilierung deaktiviert
Gegenmaßnahmen
Code untersuchenSchreiben nur ins Profil und HKCU
Virtualization abschalten
Immer gewünschter Zugriffsmodus bei Ressourcenzugriffen explizit angeben
Standard User Analyzer hilft beim Finden von Problemen
Analyse-Werkzeuge
Nie vergessen: Tools machen keine Software (automatisch) sicher
Analyse-Werkzeuge adressieren bekannte Schwachstellen
und diese auch nur in ganz bestimmten Mustern
Trotzdem hilfreich um Probleme besser zu verstehen
Code-Analyse mit FxCop
FxCop untersucht regelbasiert managed Code
Zwei VariantenStand-aloneVS 2005 integriert
FxCop Security Regeln
AppVerifier und PREfast
AppVerifier untersucht unmanaged CodeZugriffe auf Win32 APIsSpeicherverwaltungRegistry-ZugriffeDateisystem-ZugriffeNULL DACLs
PREfast führt Code Analysedurch
/analyze SchalterWird unterstützt durch SAL(Standard Annotation Language)
Fazit
95% aller Sicherheitslücken entstehen durch bekannte und wohl verstandene ProgrammierfehlerGegenmaßnahmen sind meist mechanisch durchzuführenHalten Sie die benötigten Privilegien für Ihren Anwendungen und Dienste so niedrig wie möglich
© 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after
the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.