Dominick Baier Security Consultant thinktecture. 2 Wir unterstützen Software-Entwickler und...

Preview:

Citation preview

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/dominick.baier@thinktecture.com

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.

Recommended