Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Bruno Wurster Geändert vor über 10 Jahren
1
Dominick Baier Security Consultant thinktecture
2
2 Wir unterstützen Software-Entwickler und Architekten bei der Realisierung von.NET- und Web Services-Projekten Wir 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/ dominick.baier@thinktecture.com
3
Die typischsten Security Probleme Gegenmaßnahmen Coding Techniken Compiler Switches Tools
4
Lassen sich in zwei Kategorien einordnen Eingabe Validierung Buffer Overflows Injection Attacken Encoding / Globalization Probleme Sicherheits-Kontext Administrator vs Standardbenutzer SYSTEM vs Servicekonto Zugriffskontrolllisten UAC
5
Kontroll-KanalDaten-Kanal Console.WriteLine(input);input = "Hello World" Console.WriteLine("Hello World");
6
void main() { char myLongBuffer[256]; myFunction(myLongBuffer); } Stack (bisheriger Stackinhalt) 256 MyLongBuffer Rücksprungadresse Sonstige Daten MyShortBuffer 16 Strings void myFunction(char *input) { char myShortBuffer[16]; strcpy(myShortBuffer, input); } Daten sind zu lang ! MyShortBuffer 16 256 MyShortBuffer Gehackte Adresse Malcode Böser Inhalt von Input: Rücksprung an gehackte Adresse… Malcode ausführen Stack
7
Sichere Libraries Die C Runtime Library ist gut 25 Jahre alt Wurde nicht für Sicherheit designed Lösungsansatz Austauschen der gefährlichen Funktionen durch alternative Implementierungen StrSafe und Safe CRT Bibliotheken Code-Änderungen notwendig Visual Studio gibt C4996 Warnungen aus
8
Ausgangspunkt void Function(char *s1, char *s2) { char temp[16]; strcpy(temp, s1); strcat(temp, s2); } Unter Verwendung von StrSafe errno_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); }
9
Stack (bisheriger Stackinhalt) 256 MyLongBuffer Rücksprungadresse Security Cookie Strings MyShortBuffer Stack 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) ab sub 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
10
/SAFESEH Verhindert die Ausführung ungültiger (überschriebener) Exception-Handler /NXCOMPAT Opt-In für Data Execution Prevention (DEP) /DYNAMICBASE Address Space Layout Randomization (ASLR) Vergabe zufälliger Speicheradressen für Image, Stack und Heap
11
SQL Injection HTML und Script Injection Directory Traversal …
12
Kontroll-KanalDaten-Kanal select userID from users where username = 'input 1 ' and password = 'input 2 ' input 1 = dominick input 2 = geheim select userID from users where username = 'dominick' and password = 'geheim'
13
Kontroll-KanalDaten-Kanal select userID from users where username = 'input 1 ' and password = 'input 2 ' input 1 = dominick' -- input 2 = egal select userID from users where username = 'dominick' -- and password = 'egal'
14
Niemals SQL Statements selbst zusammenbauen Parametrisierte Queries mit SqlCommand anstatt Stored Procedures LINQ to SQL
15
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(); … } 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(); … }
16
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(); … } 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(); … }
17
Kontroll-KanalDaten-Kanal Hello input </html input = dominick Hello dominick </html
18
Kontroll-KanalDaten-Kanal Hello input </html input = dominick Hello dominick </html
19
Daten immer für den entsprechenden Ausgabetyp enkodieren HTML (Attribute) XML (Attribute) URLs JavaScript VBScript Microsoft AntiXSS Library und XSSDetect
21
Kontroll-KanalDaten-Kanal string path = "c:\content\"; File.ReadAllText( path + input); input = readme.txt File.ReadAllText(@ "c:\content\readme.txt)
22
Kontroll-KanalDaten-Kanal string path = "c:\content\"; File.ReadAllText( path + input); input =..\inetpub\wwwroot\ web.config File.ReadAllText(@ "c:\content\..\inetpub\wwwroot\ web.config)
23
Flexibilität von Windows macht es äußerst schwierig Diese 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
24
Vermeiden von Dateinamen als Eingabe Ersetzen durch IDs Erzeugen einer Liste von gültigen Dateien Einsatz von CAS static string ReadFile(string filename) { string path = @"c:\content\"; new FileIOPermission( FileIOPermissionAccess.Read, path).PermitOnly(); return File.ReadAllText(path + filename); } static string ReadFile(string filename) { string path = @"c:\content\"; new FileIOPermission( FileIOPermissionAccess.Read, path).PermitOnly(); return File.ReadAllText(path + filename); }
25
Typische Anwendungen/Dienste brauchen kein Administrator Konto SYSTEM Konto Trotzdem viele Anwendungen fehlerhaft Zugriff auf Systemverzeichnisse Zugriff auf HKLM
26
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 entfernt Wird standardmäßig durch 3.5 Kompilierung deaktiviert
27
Code untersuchen Schreiben nur ins Profil und HKCU Virtualization abschalten Immer gewünschter Zugriffsmodus bei Ressourcenzugriffen explizit angeben Standard User Analyzer hilft beim Finden von Problemen
28
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
29
FxCop untersucht regelbasiert managed Code Zwei Varianten Stand-alone VS 2005 integriert
31
AppVerifier untersucht unmanaged Code Zugriffe auf Win32 APIs Speicherverwaltung Registry-Zugriffe Dateisystem-Zugriffe NULL DACLs PREfast führt Code Analyse durch /analyze Schalter Wird unterstützt durch SAL (Standard Annotation Language)
33
95% aller Sicherheitslücken entstehen durch bekannte und wohl verstandene Programmierfehler Gegenmaßnahmen sind meist mechanisch durchzuführen Halten Sie die benötigten Privilegien für Ihren Anwendungen und Dienste so niedrig wie möglich
34
© 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.
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.