Gefahrenreduzierung nach stackbasierten BufferOverflows

Ähnliche Dokumente
Exploit-Entwicklung mit Python

Buffer Overflows. Daniel Hepper, Irina Krivochtchekova, Elyasin Shaladi

Vorbemerkungen Einführung Buffer Heap vs. Stack Sicherheit Literatur. Umgang mit Buffern. Stefan Bruhns

GCC 3.x Stack Layout. Auswirkungen auf Stack-basierte Exploit-Techniken. Tobias Klein, 2003 Version 1.0

Übungen zur Vorlesung Systemsicherheit

Übungen zu Softwaresysteme I Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2004 K-Uebung9.fm

U23 - Shellcode. Twix Chaos Computer Club Cologne. Motivation Einstieg Der erste Shellcode Nullbytes, NOP Slides

Abstrakte C-Maschine und Stack

Buffer Overflow. Denis Graf, Tim Krämer, Konstantin Schlese. Universität Hamburg Fachbereich Informatik. 6. Januar 2013

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C

Assembler. Dr.-Ing. Volkmar Sieh. Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg

Buffer Overflow 1c) Angriffsstring: TTTTTTTTTTTTTTTT (16x) Beachte: Padding GCC-Compiler Zusatz: gcc O2 verhindert hier den Angriff (Code Optimierung)

Stack Smashing Protector

Maschinencode Dateiformat und Stackframes

Rechnernetze und -Organisation. Teil B 2012 Tomislav Nad Karl C. Posch

Vorlesung: Rechnerstrukturen, Teil 2 (Modul IP7)

Rechnernetze und -Organisation. Teil B (30. März 2011) 2011 Michael Hutter Karl C. Posch

Tafelübung zu BSRvS 1 6. Sicherheit

Assembler Unterprogramme

Rechnerne etze und -O Organisatio on

6. Grundlagen der Programmierung

U23 Assembler Workshop

Hacking in C (Windows) Reinhard Oertel

Assembler - Einleitung

Sicherheit in Software

2. Aufgabenblatt Musterlösung

Kodieren von Anweisungen im Binärformat für Maschinen quasi natürlich, zumindest effizient. Für Menschen hingegen ist Binärformat schwierig

U23 Assembler Workshop

Rechnernetze und Organisation

Sicheres C Programmieren in Embedded Systemen ARM II (ARM7TMDI [1] ) Wintersemester

Kompilierung eines Programmes. Mnemonics, ld, GCC, AS

Netzwerksicherheit. Teil 2: Buffer Overflows und andere Gemeinheiten. Philipp Hagemeister. Sommersemester 2017 Heinrich-Heine-Universität Düsseldorf

PS Kryptographie und IT-Sicherheit. Thema: Software-Sicherheit. Thomas Loch, Michael Streif 2012

Übung 1 - Betriebssysteme I

Einleitung Funktionsaufrufe Berechnungen Verzweigungen Systemaufrufe Speicherzugriffe Fazit Quellen. Laufzeitkosten in C.

Lehrstuhl für Datenverarbeitung. Technische Universität München. Grundkurs C++ Debugging

Assembler (NASM) Crashkurs von Sönke Schmidt

Grundlagen der Informatik III Wintersemester 2010/ Vorlesung Dr.-Ing. Wolfgang Heenes

Seminar IT Sicherheit

Systemaufrufe. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2010/2011

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2012 / Vorlesung 9, Dienstag 18.

Rechnernetze und -Organisation. Teil D Tomislav Nad Karl C. Posch

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

1 Maschinenunabhängige Optimierungen. Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17

Praktikum Compilerbau Sitzung 9 Codeerzeugung

Buffer Overflows. Daniel Hepper Irina Krivochtchekova Elyasin Shaladi

Übung zu Betriebssysteme

BTD Antivirus Evasion: Von der Idee zum PoC. Daniel Sauder SySS GmbH

Buffer Overflows. Florian Westphal. 24. November 2005

Rechnern netze und Organisatio on

Rechnernetze und -Organisation. Teil D3 2010, Ver 0.9 Michael Hutter Karl C. Posch

Homogene Multi-Core-Prozessor-Architekturen

Besprechung Aufgabe 1: Prozesse verwalten Fortsetzung Grundlagen C-Programmierung Aufgabe 2: Threadsynchronisation

Einführung zum MS Visual Studio

Betriebssysteme. Tafelübung 2. Thread-Synchronisation. Olaf Spinczyk.

Compiler: Vom Code zum Maschinen-Code. C Programmierung - Vorlesung 2 Hochschule Regensburg Universitätsstraße 31, Regensburg

Software Security. Andreas Kostecka Alexander Miller Patrick Rappensberger

Einführung in (Intel) 80x86 Assembler. Einführung in (Intel) 80x86 Assembler Wintersemester 2009/10 1 / 31

Übersicht der wichtigsten Assemblerbefehle in ATT-Syntax. Operanden, Statusflags und Registersatz

Inhaltsverzeichnis. 1 Einleitung 2

Übungen zu Systemprogrammierung 2 (SP2)

Betriebssysteme. Tafelübung 6. Sicherheit. Olaf Spinczyk.

Tafelübung zu BS 2. Threadsynchronisation

Matthias Hanreich - TheGreyKnight

Einführung. Übungen zur Vorlesung Virtuelle Maschinen. Stefan Potyra. SoSe 2009

Hinweise 80x86-Architektur

Unterprogramme. Unterprogramme

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Netzwerksicherheit. Teil 2: Buffer Overflows und andere Gemeinheiten. Martin Mauve, Björn Scheuermann und Philipp Hagemeister

Malware-Analyse und Reverse Engineering. 13: Rückblick über das Semester Prof. Dr. Michael Engel

Einführung in (Intel) 80x86 Assembler. Einführung in (Intel) 80x86 Assembler Wintersemester 2008/09 1 / 26

Teil I Debuggen mit gdb

Aufgabe 1 Entwicklung einer Virtuellen Maschine

Algorithmen zur Datenanalyse in C++

Buffer Overflows und Format-String-Schwachstellen

Grundlagen der Informatik III Wintersemester 2010/ Vorlesung Dr.-Ing. Wolfgang Heenes

Betriebssysteme Teil 3: Laufzeitsystem für Programme

Formale Systeme, Automaten, Prozesse

Formale Systeme, Automaten, Prozesse

1 Vorwort. 2 Programmhierarchie. 3 Organisationsprinzipien. 4 Zusammenfassung

C-Kurs 2010 Pointer. 16. September v2.7.3

Systemprogrammierung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Gliederung Programmiersprachen. Programmiersprachen Einführung in C. Buffer overflows. Basic stack exploit. What are buffer overflows?

Malware-Analyse und Reverse Engineering. 4: Startup Prof. Dr. Michael Engel

Programmiersprachen Einführung in C

Tafelübung zu BSRvS 1 4. Speicherverwaltung

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Programm(ier)fehler, Exploits und Gegenmaßnahmen

Assembler - Adressierungsarten

Übung zu Betriebssysteme

x86 Assembler Praktische Einführung Sebastian Lackner Michael Müller 3. Juni 2013

Tafelübung zu BS 2. Threadsynchronisation

Tafelübung zu BS 2. Threadsynchronisation

Transkript:

Gefahrenreduzierung nach stackbasierten s Lars Knösel 22. Dezember 2005

Wichtiger Hinweis Dieses Dokument und die Live-nstration liefern Informationen, mit deren Hilfe es möglich wird, stackbasierte Pufferüberläufe dahingehend auszunutzen, unautorisierten Zugriff auf Rechnern zu erlangen. Sämtliche Informationen, die in diesem Dokument zur Verfügung gestellt werden, dienen ausschließlich der Lehre. Dieser Sachverhalt gilt ebenfalls für die Live-nstration. Der Autor haftet in keinster Weise für den Missbrauch dieser Informationen. Copyright 2005 2007 Lars Knösel Lars Knösel 2

Motivation URL:http://www.debian.org/ (Stand: 21.12.2005) Lars Knösel 3

Überblick Software Lars Knösel 4

Software - Sicherheit,,Almost all the security problems that happen in Software, like probably 95 percent of them, are low-level programmer errors. Theo de Raadt Ein Angreifer nutzt die Seiteneffekte, die durch einen Softwarefehler entstehen, weil er sie versteht Der Angreifer erlangt Privilegien, da sich Systeme immer wieder gleich verhalten Es gibt grundsätzlich zwei Möglichkeiten, dies zu unterbinden: Fehler in der Software beseitigen Das System so verändern, dass es sich nicht mehr auf herkömmliche Weise für Angriffe nutzen lässt Lars Knösel 5

Grundlagen Segmente Text-Segment (ro) Data-Segment BSS (Block Started by Symbol) Heap Abbildung 1: (-) Segmente Lars Knösel 6

Grundlagen Register x86/ia-32 16 Basisregister Zwischenspeicher Extended Instruction Pointer (EIP) Extended Base Pointer (EBP) Extended Pointer (ESP) Lars Knösel 7

Funktionsweise Zwischenspeicher für lokale Variablen Beginnt am oberen Ende des Adressraums Wächst nach unten (LIFO) Es gibt zwei Basisoperationen push() pop() Lars Knösel 8

Steuerung Frame Inhalt des Frames Call Abbildung 2: (-) Frame Lars Knösel 9

Funktionen Funktions-Prolog Zustand des s sichern reservieren Funktions-Epilog Zustand des s wiederherstellen Lars Knösel 10

Aufbau 01 void 02 function(const char* msg) 03 { 04 int var1; 05 char buf[80]; 06 int var2; 07 08 strcpy(buf, msg); 09 } 10 int 11 main(int argc, char** argv) 12 { 13 function(argv[1]); 14 return (0); 15 } Abbildung 3:. Vgl. [Richarte2002] Lars Knösel 11

Angriffsmöglichkeiten durch s Denial of Service Modifikation des Programmflusses Ausführen eingeschleusten Programmcods Frame Pointer Overwriting Lars Knösel 12

Angriffsziele auf dem Rücksprungadresse Lokale Variablen Argument Variablen Svd. Frame Pointer Abbildung 4: Angriffsziele () Lars Knösel 13

Grundlagen GNU Abbildung 5: (gdb) info frame level 0, frame at 0xbfbaa890: eip = 0x8048360 in function (test3.c:4); saved eip 0x804837e called by frame at 0xbfbaa8a0 source language c. Arglist at 0xbfbaa888, args: a=255 Locals at 0xbfbaa888, Previous frame's sp is 0xbfbaa890 Saved registers: ebp at 0xbfbaa888, eip at 0xbfbaa88c Lars Knösel 14

Beispiel inhalt 01 void 02 function(int a) 03 { 04 int var = a; 05 } 06 07 int 08 main(void) 09 { 10 function(255); 11 return (0); 12 } Ausgabe gdb Abbildung 6: (gdb) x/4x &var 0xbfef7b54: 0x000000ff 0xbfef7b68 0x0804837e 0x000000ff Lars Knösel 15

Klassischer 01 void 02 function(const char* args) 03 { 04 char buffer[4]; 05 strcpy(buffer, args); 06 } 07 08 int 09 main(int argc, char** argv) 10 { 11 function(argv[1]); 12 return (0); 13 } Abbildung 7: -./faulty `perl e 'print X x 12'` Ausgabe gdb (gdb) x/4x buffer 0xbfef7b54: 0x58585858 0x58585858 0x58585858 0xbff9fe00 Lars Knösel 16

Bug ausnutzen Aufdecken des Fehlers Ziel festlegen Shellcode (Payload) erstellen schreiben Bug mit Hilfe des s ausnutzen :-) Lars Knösel 17

Shellcode erstellen Beispiel exit() Assembler Code mov $1,%al xorl %ebx,%ebx int $0x80 Assemblieren $ as o exit.o exit.asm Linken $ ld o exit exit.o Disassemblieren des Maschinencodes $ objdump d exit 8048074: b0 01 mov $0x1,%al 8048076: 31 db xor %ebx,%ebx 8048078: cd 80 int $0x80 Shellcode \xb0\x01\x31\xdb\xcd\x80 Lars Knösel 18

Funktionalität eines s (Beispiel) Feststellen des aktuellen Pointers (ESP) Trick: 01 unsigned long 02 getesp(void) 03 { 04 asm ( movl %esp,%eax ); 05 },,NOPs einfügen Shellcode (Payload) einfügen Rücksprungadresse(n) einfügen Lars Knösel 19

Funktionalität eines s mit NOP-Sliding Abbildung 8: nach Klassische Methode. Vgl. [Klein2004] Abbildung 9: nach mit NOP-Sliding. Vgl. [Klein2004] Lars Knösel 20

Zwischenzusammenfassung Register EIP, EBP, ESP Rücksprungadresse Payload (Shellcode) NOPs Lars Knösel 21

System für x86 LINUX gcc Version 2.95.2 Kernel 2.2.16 Lars Knösel 22

zur Gefahrenreduzierung Compiler-Erweiterungen Guard SSP Ghost (sparc) Bounds Checking Wrapper für Bibliotheksfunktionen Libsafe Modifikation der Prozessumgebung Non-executable PaX Lars Knösel 23

Guard Überblick Guard schützt (bedingt) vor Angriffen Seit 1998 als Erweiterung für gcc verfügbar Der Verlust an Performance ist gering, aber vorhanden Guard verwendet eine spezielle Umgebung, die Canary genannt wird Lars Knösel 24

Guard Entwurf Es gibt drei verschiedene Arten von Canaries: terminator canary (CR, EOF, LF, Null) random canary random xor canary Guard verwendet terminator canary Lars Knösel 25

Guard Implementierung Schutz der Rücksprungadresse Dieser bereich wird durch einen (terminator) Canary geschützt Überprüfung des Canarys Canary Wert: Falsch Richtig Lars Knösel 26

Guard Funktionsweise Prolog der Funktion: Canary anlegen function_prologue: pushl $0x000aff0d pushl %ebp mov %esp, %ebp subl $108, %esp (function body) Epilog der Funktion: Canary kontrollieren function_epilogue: leave cmpl $0x000aff0d,(%esp) jne canary_changed addl $4, %esp ret Lars Knösel 27

Guard ansicht (Terminator) Canary Bereich Abbildung 11: mit (Terminator) Canary Lars Knösel 28

Smashing Protector Überblick Als Erweiterung für gcc verfügbar Neue Idee, um bekannte Methoden (Guard) zu verbessern SSP verwendet unter anderem ebenfalls einen Canary-Bereich Schützt vor den gängigsten Angriffsmethoden SSP ist deutlich performanter als Guard Seit Dezember 2002 in OpenBSD integriert Lars Knösel 29

Smashing Protector Entwurf Verwendung eines Canary-Bereichs (random) Reorganisation von lokalen Variablen Kopieren von Funktionsargumenten Lars Knösel 30

Smashing Protector Implementierung Der Focus von SSP liegt auf folgenden Bereichen: Lage der Argumente der Funktion Rücksprungadresse Gesicherter Frame Pointer (EBP) Lokale Variablen Ein Canary-Bereich schützt die ersten drei aufgeführten Bereiche Die benutzung wird restriktiver behandelt (Reorganisation) Lars Knösel 31

Smashing Protector Funktionsweise Prolog der Funktion function_prologue: pushl %ebp mov %esp,%ebp subl $272,%esp protection_prologue: movl guard, %eax movl %eax, 24(%ebp) (function body) Epilog der Funktion protection_epilogue: movl 24(%ebp), %edx cmpl guard, %edx je standard_epilogue movl 24(%ebp), %eax pushl %eax pushl $function_name call stack_smash_handler addl $8, %esp standard_epilogue:... Lars Knösel 32

Smashing Protector ansicht (Random) Canary Bereich Abbildung 12: mit (Random) Canary Lars Knösel 33

Smashing Protector Reorganisation der Variablen Abbildung13: vor Reorganisation. Vgl. [Richarte2002] Abbildung14: nach Reorganisation. Vgl. [Richarte2002] Lars Knösel 34

Smashing Protector Kopieren der Argumente Abbildung15: vor und nach Kopie. Vgl. [Richarte2002] Lars Knösel 35

Sicherheitslücken durch s dürfen auf keinen Fall unterschätzt werden Die Ausnutzung einer solchen Schwachstelle ist jedoch nicht trivial Es existieren gute Schutzmechanismen, nutzen! Lars Knösel 36

Literatur Debugging with gdb URL:https://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gdb/stack.html (Stand: November 2005). [Etho2000] Etho, Hiroaki. Protecting from stack-smashing attacks. URL:http://www.research.ibm.com/trl/projects/security/ssp/main.html (Stand: November 2005) [Kallnik2001] Kallnik, Stephan; Pape, Daniel; Schrter, Daniel; Strobel, Stefan: Das Sicherheitsloch. URL:http://www.heise.de/ct/01/23/216/ (Stand: November 2005). [De Raadt2005] De Raadt, Theo: Mitigation Techniques. URL:http://openbsd.informatik.uni-erlangen.de/papers/ven05-deraadt/index.html (Stand: November 2005). [Wagle] Wagle, Perry; Cowan, Crispin: Guard: Simple Smash Protection for GCC. URL:http://gcc.fyxm.net/summit/2003/guard.pdf (Stand: November 2005). [One] Aleph One: Smashing The For Fun And Profit. Phrack Magazine #49 Artikel 14. URL:http://www.phrack.org (Stand: November 2005) Lars Knösel 37

Literatur [Hildebrand2005] Hildebrand, Matthew: Interview with Theo de Raadt on Industry and Free Software. 05.07.2005, URL: http://www.theepochtimes.com/news/5-7-5/30084.html (Stand: Dezember 2005). [Klein2004] Klein, Tobias: Buffer Overflows und Format-String-Schwachstellen. dpunkt.verlag Heidelberg 2004. 1. Aufl. [Richarte2002] Richarte, Gerardo: Four different tricks to bypass Shild and Guard protection. 9.4.2002 3.6.2004, URL:http://www.coresecurity.com/files/files/11/guardPaper.pdf (Stand: November 2005) [De Raadt2004] De Raadt, Theo: OpenBSD's Theo de Raadt talks software security. 10.09.2004, URL:http://www.computerworld.com.au/index.php/id;1498222899;fp;16;fpid;0 (Stand: Oktober 2005) Lars Knösel 38

Lars Knösel Vielen Dank für die Aufmerksamkeit