Student Technology Conference 2004 Daniel Kirstenpfad Writing Secure Code.

Post on 05-Apr-2015

119 views 3 download

Transcript of Student Technology Conference 2004 Daniel Kirstenpfad Writing Secure Code.

Student Technology Conference 2004

Daniel Kirstenpfad

Writing Secure Code

Agenda

• Gefahren und Szenarien

• Gegenmaßnahmen - Verteidigung

• Threat Modelling

Gefahren und Szenarien

• Gefahren ergeben sich aus:– Eingaben allgemein– allem anderen

• Gefahren lauern nahezu überall Sicherheit entsteht nicht von alleine

Gefahren und Szenarien

• Beispiele für solche Probleme:– Buffer Overflow

– SQL Injection

– Arithmetik Fehler• overflow/underflow

10101101101101011011101011011011010110111101000101001010

Blake Blake’ drop table Daten --

Gefahren und Szenarien

1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999

0

5

10

15

20

25

30

Buffer Overruns Total Vulnerabilities

Quelle: CERT

Gefahren und Szenarien

• Was sind Buffer Overflows ?– treten auf, wenn Daten die erwartete Größe

überschreiten und andere Werte überschreiben– Tritt überall dort auf wo direkt auf den Speicher

zugegriffen werden kann– 4 Typen

• Stack Overflow• Heap Overflow• V-Table/Function Pointer Overflows• Exception Handling Overflows

Gefahren und Szenarien

• Beispiel: Stack Buffer Overflow bei der Arbeit: Höhere Adressbereiche

BufferAndere

vars

EB

P

EIP Args

void oflow(char *p, int i) { int j = 0; CFlow oflow; int (*fp)(int) = &func; char b[16];}

Gefahren und Szenarien

• Beispiel: Stack Buffer Overflow bei der Arbeit:Höhere Adressbereiche

BuffersAndere

vars

EB

P

EIP Args

RücksprungAdresse

Exception handlers

Function pointersVirtual methods0wn3d!

0wn3d!

Gefahren und Szenarien

• Ergebniss eines Buffer Overflows– Mit viel Glück erhält man einen Speicherzugriffs

Fehler Denial Of Service (DoS)– Mit weniger Glück wird das Programm instabil– Mit ausgesprochenem Pech kann der Angreifer

seinen Code in dein Prozess einfügen und ausführen

Gefahren und Szenarien

• Beispiel-Quelltext für einen Buffer Overflow// cchAttribute enthält die Anzahl der vom User eingegebenen // Zeichen

WCHAR wcsAttribute[200];if ( cchAttribute >= sizeof wcsAttribute) THROW( CException( DB_E_ERRORSINCOMMAND ) );

DecodeURLEscapes( (BYTE *) pszAttribute, cchAttribute, wcsAttribute,webServer.CodePage());

...void DecodeURLEscapes( BYTE * pIn, ULONG & l,

WCHAR * pOut, ULONG ulCodePage ) { WCHAR * p2 = pOut; ULONG l2 = l;

... for( ; l2; l2-- ) {

(aus der Index Server ISAPI)

Gefahren und Szenarien

• Beispiel-Quelltext für einen Buffer Overflow

(aus der Index Server ISAPI)

// cchAttribute enthält die Anzahl der vom User eingegebenen // Zeichen

WCHAR wcsAttribute[200];if ( cchAttribute >= sizeof wcsAttribute / sizeof WCHAR) THROW( CException( DB_E_ERRORSINCOMMAND ) );

DecodeURLEscapes( (BYTE *) pszAttribute, cchAttribute, wcsAttribute,webServer.CodePage());

...void DecodeURLEscapes( BYTE * pIn, ULONG & l,

WCHAR * pOut, ULONG ulCodePage ) { WCHAR * p2 = pOut; ULONG l2 = l;

... for( ; l2; l2-- ) {

FIXED!FIXED!

Gefahren und Szenarien

• Was ist eine SQL Injection ?– SQL Anweisungen werden über

Benutzereingaben eingeschleust– Wird dazu benutzt um:

• Spionage von Daten in Datenbanken zu betreiben• Authorisierungen zu umgehen• stored Procedures auszuführen

Gefahren und Szenarien

• Beispiel für eine SQL Injection:

• Wenn die Variable ID direkt aus dem Textfeld eines Web- oder Windows-Formulars gelesen wird, können die Benutzer folgenden Code eingeben:

• username• username' or 1=1 --• username' DROP TABLE Bestellungen --• username' exec xp_cmdshell('fdisk.exe') --

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

Gefahren und Szenarien

• Beispiel Quelltext für eine SQL Injectionstring 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();}

Gefahren und Szenarien

• Managed Code– Code Access Security != Secure Code

• überprüfbaren Code verwenden (verified)• hilft der CLR dabei Sicherheit zu schaffen

– reduziert Möglichkeiten von Buffer Overruns– Ob überprüfbarer Code verwendet werden

kann/wird hängt von der verwendeten Sprache ab

Gefahren und Szenarien

• Managed Code– VisualBasic.NET generell überprüfbar– C# überprüfbar, ausgenommen ist „unsafe“– C++ ist generell nicht überprüfbar

• Geplant für zukünftige Versionen

Gefahren und Szenarien

• Managed Code– Vorsicht vor „AllowPartialTrust“ Aufrufen– Vorsicht vor Abhängigkeiten und Verkettungen– FxCop: nützliches Tool um Probleme vorab zu

finden

Gefahren und Szenarien

• FxCop - http://www.gotdotnet.com/team/fxcop/

Gegenmaßnahmen - Verteidigung

• Vorbeugen ist die beste Verteidigung• Sprachen/Technologien ohne direkten Speicherzugriff

bzw. mit Speicherschutz verwenden (z.B. .NET / C#)• Keine als anfällig bekannte Funktionen verwenden,

z.B. bei C/C++:– Strcpy, strncpy, CopyMemory, MultiByteToWideChar

• Es gibt Werkzeuge die vom Compiler zur Verfügung gestellt werden (Static Checks)

• Bei Visual C++ mit Compiler-Option /GS

Gegenmaßnahmen - Verteidigung

• Es gibt Werkzeuge die vom Compiler zur Verfügung gestellt werden (Static Checks)

• Bei Visual C++ mit Compiler-Option /GS• schützt bspw. vor Slammer,Blaster,CodeRed

• In-Memory Cookies verwenden• Auch Heap-Cookies genannt• Einige Buffer-Overruns können so erkannt werden• Heap-basierte Attacken werden zuverlässig erkannt

Gegenmaßnahmen - Verteidigung

• Wenn Sprachen mit direkten Speicherzugriff bzw. Sprachen die als anfällig bekannt sind verwendet werden müssen: – „checked“ Speicherzugriffs-Bibliotheks-

Funktionen benutzen • Bspw. strsafe.h bei C• Erkennen wenn Speicherbereiche überschrieben

worden sind Exception

Gegenmaßnahmen - Verteidigung

• Geschützten Speicher verwenden (Windows 2003, neue Prozessoren (Itanium,K8), in Win XP SP2 enthalten)– Trennung von Code und Datenspeicher (non-

executable Memory)– Wenn der Angreifer seinen Code in den

Speicher des angegriffenen Rechners schreiben kann kann er ihn wenigstens nicht ausführen

Gegenmaßnahmen - Verteidigung

• Daten und Code an zufälligen Speicheradressen ablegen– Macht die Ausführung weniger vorhersagbar

• Es werden wahrscheinlich nur 5% aller Maschinen erfolgreich attackiert, statt 100%

– Besonders bei Buffer Overflows ist es wichtig möglichst viel über Speicheradressen zu wissen

• Beispiel: Xbox Dashboard Exploit

Gegenmaßnahmen - Verteidigung

• Überprüfung der Daten– JEDE Eingabe ist böse, solange nicht das

Gegenteil bewiesen ist– authentifizierte Verbindungen benutzen– Jede Eingabe prüfen:

• nach gültigen Eingaben suchen, alles andere verwerfen

– keine Annahmen über Eingaben machen– niemals direkt Eingaben wieder ausgeben, erst

prüfen

Gegenmaßnahmen - Verteidigung

• WICHTIG

KNOW YOUR WEAK SPOTS

Gegenmaßnahmen - Verteidigung

• Threat Modelling– Methodik um Sicherheitsaspekte zu analysieren– Hilft zu verstehen wo Angriffspunkte bestehen

oder entstehen• Lücken und Probleme aufzeigen

– Ziel ist die Reduzierung der Sicherheits-Risiken

Gegenmaßnahmen - Verteidigung

Threat Modelling Prozess

Vorhandene Strukturen identifizieren1

Übersicht der Architektur anfertigen2

Applikation auseinandernehmen3

Bedrohungen identifizieren4

Bedrohungen dokumentieren5

Bedrohungen einstufen6

Gegenmaßnahmen - Verteidigung

• Schritt 1: Vorhandene Strukturen identifizieren– Eine Liste anfertigen welche Teile überhaupt

geschützt werden müssen:• Sicherheitsrelevante Daten (z.B. Kundendaten)• Web-Seiten• Teile die die Verfügbarkeit beeinflussen• Alles andere, das, wenn es kompromittiert würde den

korrekten Programm-Ablauf beeinflusst

Gegenmaßnahmen - Verteidigung

• Schritt 2: Übersicht der Architektur anfertigen– Was tut die Applikation– Architektur-Diagramm:

Gegenmaßnahmen - Verteidigung

• Schritt 3: Applikation auseinandernehmen– Die Applikation komplett zerlegen– Sicherheits-Profil basierend auf den „traditionellen“

Bereichen von Angriffen anfertigen– Abläufe zwischen Subsystemen untersuchen– Bspw. UML Diagramme nutzen

Gegenmaßnahmen - Verteidigung

• Schritt 3: Applikation auseinandernehmen

Vertrauens-Grenzen erkennen

Datenfluss analysieren

Eingstiegspunkte/Eingaben

Sicherheitsprofil

Gegenmaßnahmen - Verteidigung

• Schritt 4: Bedrohungen identifizieren– Netzwerk-Bedrohungen

• eventuell benutzte Protokolle

– Lokale Bedrohungen• Trojaner usw.

– Applikations-spezifische Bedrohungen• Kundendaten in eigener Datenbank bspw.

Gegenmaßnahmen - Verteidigung

• Schritt 4: Bedrohungen identifizieren– S.T.R.I.D.E.

Bedrohungsarten Beispiele

Spoofing• fälschen von eMails• Authentifizierungen mithören

Tampering• Daten wärend der Übermittlung verändern (Man in the Middle)• Daten auf Festplatte verändern

Repudiation• User gibt vor bestimmte Aktionen nicht ausgeführt zu haben• Gegenteil kann nicht bewiesen werden

Information disclosure• zuviele Informationen in Fehlermeldungen• Quellcode auf Webseiten

Denial of Service • Flooding: “überfluten” des Netzwerkes mit Packeten

Elevation of privilege • System/Administrator Rechte durch Exploit erlangen

Gegenmaßnahmen - Verteidigung

• Schritt 4: Bedrohungen identifizieren– Attack-Trees

Bedrohung #1Abrechungs-Daten

1.1Netzwerk-Verkehr ist

ungeschützt

1.2Angreifer belauscht Netzwerk-Verkehr

1.2.1Netzwerk-Verkehr mithören

(Protocol-Analyzer)

1.2.2Router-Netzwerk-Verkehr

mithören

1.2.2.1Router hat nicht neuesten

Patch

1.2.2.2Router angreifen und

exploiten

1.2.2.3Router Passwort erraten

Gegenmaßnahmen - Verteidigung

• Schritt 5: Bedrohungen dokumentieren

Beschreibung SQL Injection

ZielDatenzugriff / Subsystem das für den Datenbankzugriff zuständig ist

Risiko (nächstes Slide)

TechnikenAngreifer fügt SQL Kommandos zu Eingaben hinzu welche genutzt werden um SQL Anfragen zu stellen.

GegenmassnahmeRegular Expression benutzen um Eingabe zu validieren und stored Procedure mit Parametern benutzen um auf die Datenbank zuzugreifen

Gegenmaßnahmen - Verteidigung

• Schritt 6: Bedrohungen einstufen– Formel:

Risiko = Wahrscheinlichkeit * Zerstörungspotential

– D.R.E.A.D. Schema benutzen:• Damage potential• Reproducibility• Exploitability• Affected Users• Discoverability

Gegenmaßnahmen - Verteidigung

• Thread Modelling– Hilft dabei die gefährdetsten Teile der Applikation zu

finden– Prioritäten erkennen

Gegenmaßnahmen - Verteidigung

• Vielen Dank.