www.wikidata.de-de.nina.az
Dieser Artikel ist nicht hinreichend mit Belegen beispielsweise Einzelnachweisen ausgestattet Angaben ohne ausreichenden Beleg konnten demnachst entfernt werden Bitte hilf Wikipedia indem du die Angaben recherchierst und gute Belege einfugst Im Artikel sind Belege nur gelegentlich zu finden Pufferuberlaufe englisch buffer overflow nicht zu verwechseln mit Stapeluberlaufen englisch stack overflows gehoren zu den haufigsten Sicherheitslucken in aktueller Software die sich u a uber das Internet ausnutzen lassen konnen Im Wesentlichen werden bei einem Pufferuberlauf durch Fehler im Programm zu grosse Datenmengen in einen dafur zu kleinen reservierten Speicherbereich den Puffer geschrieben wodurch nach dem Ziel Speicherbereich liegende Speicherstellen uberschrieben werden Ursache fur unerwunschtes Schreiben ausserhalb des Puffers kann nicht nur eine ubergrosse Datenmenge sondern auch ein Uberlauf oder sonstige fehlerhafte Berechnung der Zieladresse sein die anzeigt wo der Datensatz in den Puffer geschrieben werden soll In diesem Fall wird von einem pointer overflow vom englischen pointer fur Zeiger gesprochen Inhaltsverzeichnis 1 Gefahren durch Pufferuberlaufe 2 Programmiersprachen 3 Prozessoren und Programmierstil 4 Gegenmassnahmen 4 1 Programmerstellung 4 2 Uberprufung des Programmcodes 4 3 Unterstutzung durch Compiler 5 Compiler und Compilererweiterungen 6 Heap Uberlauf 7 Beispiel 8 Siehe auch 9 Literatur 10 Weblinks 11 EinzelnachweiseGefahren durch Pufferuberlaufe BearbeitenEin Pufferuberlauf kann zum Absturz des betreffenden Programms zur Verfalschung von Daten oder zur Beschadigung von Datenstrukturen der Laufzeitumgebung des Programms fuhren Durch Letzteres kann die Rucksprungadresse eines Unterprogramms mit beliebigen Daten uberschrieben werden wodurch ein Angreifer durch Ubermittlung von beliebigem Maschinencode beliebige Befehle mit den Privilegien des fur den Pufferuberlauf anfalligen Prozesses ausfuhren kann Dieser Code hat in der Regel das Ziel dem Angreifer einen komfortableren Zugang zum System zu verschaffen damit dieser das System dann fur seine Zwecke verwenden kann Pufferuberlaufe in verbreiteter Server und Clientsoftware werden auch von Internetwurmern ausgenutzt Angriffe mit Pufferuberlaufen sind ein wichtiges Thema in der Computersicherheit und Netzwerksicherheit Sie konnen nicht nur uber jegliche Art von Netzwerken sondern auch lokal auf dem System versucht werden Behoben werden sie in der Regel nur durch kurzfristig gelieferte Fehlerkorrekturen Patches der Hersteller Interpretierte Sprachen sind abgesehen von Fehlern im Interpreter in der Regel nicht anfallig da der Speicher vom Interpreter und nicht vom Programm selbst verwaltet wird Programmiersprachen BearbeitenDie wesentlichste Ursache fur Pufferuberlaufe ist die Verwendung von Programmiersprachen die nicht die Moglichkeit bieten Grenzen von Speicherbereichen automatisch zu uberwachen um eine Bereichsuberschreitung von Speicherbereichen zu verhindern Dazu gehort besonders die Sprache C die das Hauptgewicht auf Performance und ursprunglich Einfachheit des Compilers legt und auf eine Uberwachung verzichtet sowie die C Weiterentwicklung C Hier ist ein Programmierer teilweise gezwungen den entsprechenden Code von Hand zu generieren wobei oft absichtlich oder aus Nachlassigkeit darauf verzichtet wird Die Uberprufung ist haufig auch fehlerhaft implementiert da wahrend der Programmtests diese Programmteile meist nicht oder ungenugend getestet werden Daneben stellen der im Fall von C komplexe Sprachumfang und die Standardbibliothek sehr viele fehleranfallige Konstrukte zur Verfugung zu denen es in vielen Fallen kaum eine Alternative gibt Die haufig verwendete Programmiersprache C bietet nur eingeschrankte Moglichkeiten zur automatischen Uberprufung von Feldgrenzen Als Weiterentwicklung der Programmiersprache C ubernimmt sie die meisten Eigenschaften von C wobei sich aber das Risiko von Pufferuberlaufen bei Benutzung von modernen Sprachmitteln u a automatische Speicherverwaltung weitestgehend vermeiden lasst Aus Gewohnheit Kompatibilitatsgrunden zu vorhandenem C Code Systemaufrufen in C Konvention sowie aus Performancegrunden wird von diesen Moglichkeiten aber nicht immer Gebrauch gemacht Laufzeituberprufungen sind im Gegensatz zu Sprachen wie beispielsweise Pascal oder Ada nicht Bestandteil der Sprache lassen sich aber in einigen Anwendungsfallen z B mit Smart Pointern nachrusten Da die meisten Programmiersprachen auch Standardbibliotheken definieren bedeutet die Wahl einer Sprache meist auch die Verwendung der entsprechenden Standardbibliotheken Im Fall von C und C enthalt die Standardbibliothek eine Anzahl von gefahrlichen Funktionen die zum Teil gar keine sichere Verwendung zulassen und zu denen zum Teil keine Alternativen bestehen Auf Programmiersprachenebene kann die Gefahr von Pufferuberlaufen durch die Verwendung von Programmiersprachen die konzeptionell sicherer als C oder C sind verringert oder ausgeschlossen werden Ein sehr viel geringeres Risiko besteht zum Beispiel in Programmiersprachen wie Rust Java C oder der Pascal Familie Modula Object Pascal oder Ada Fast ausgeschlossen sind Pufferuberlaufe beispielsweise in der Programmiersprache Java da die Ausfuhrung im Bytecode uberwacht wird Aber auch in Java gibt es einerseits Pufferuberlaufe deren Ursache im Laufzeitsystem liegt und von denen mehrere JRE Versionen betroffen sind 1 2 Prozessoren und Programmierstil BearbeitenWeitere Eigentumlichkeiten von C und C sowie der am haufigsten eingesetzten Prozessoren machen das Auftreten von Pufferuberlaufen wahrscheinlich Die Programme in diesen Sprachen bestehen zum Teil aus Unterprogrammen Diese besitzen lokale Variablen Bei modernen Prozessoren ist es ublich die Rucksprungadresse eines Unterprogramms und dessen lokale Variablen auf einen als Stack bezeichneten Bereich zu legen Dabei werden beim Unterprogrammaufruf zunachst die Rucksprungadresse und danach die lokalen Variablen auf den Stack gelegt Bei modernen Prozessoren wie dem Intel Pentium wird der Stack durch eingebaute Prozessorbefehle verwaltet und wachst zwingend nach unten Werden Felder oder Zeichenketten in den lokalen Variablen verwendet werden diese meist nach oben beschrieben Wird die Feldgrenze nicht gepruft kann man damit durch Uberschreiten des Feldes die Ruckkehradresse auf dem Stack erreichen und gegebenenfalls absichtlich modifizieren Das folgende Programmstuck in C das in ahnlicher Form oft verwendet wird zeigt einen solchen Pufferuberlauf void input line char line 1000 if gets line gets erhalt Zeiger auf das Array keine Langeninformation puts line puts schreibt den Inhalt von line nach stdout Bei Prozessoren die den Stack nach unten beschreiben sieht dieser vor dem Aufruf von gets Funktion der Standard Bibliothek von C so aus wenn man vom eventuell vorhandenen Base Pointer absieht 3 Rucksprungadresse1000 Zeichen 3 Zeichen2 Zeichen1 Zeichen StackpointerDer Stack wachst nach unten die Variable wird nach oben uberschriebengets liest eine Zeile von der Eingabe und schreibt die Zeichen ab line 0 in den Stack Es uberpruft die Lange der Zeile nicht Gemass der Semantik von C erhalt gets nur die Speicheradresse als Pointer jedoch keinerlei Information uber die verfugbare Lange Wenn man jetzt 1004 Zeichen eingibt uberschreiben die letzten 4 Bytes die Rucksprungadresse unter der Annahme dass eine Adresse hier 4 Bytes gross ist die man auf ein Programmstuck innerhalb des Stack richten kann In den ersten 1000 Zeichen kann man gegebenenfalls ein geeignetes Programm eingeben 00 45eA A 4 0A amp Eingabe wird von gets in den Stack geschrieben 1004 Zeichen modifizierte Rucksprungadresseline 1000 Zeichen line 5 Zeichen drittes Byte im Codeline 4 Zeichen zweites Byte im Codeline 3 Zeichen Ziel der Rucksprungadresse Programmcodestartline 2 Zeichenline 1 Zeichen StackpointerUberschreiben der Rucksprungadresse und Programmcode im StackFalls das Programm hohere Privilegien besitzt als der Benutzer kann dieser unter Ausnutzung des Pufferuberlaufs durch eine spezielle Eingabe diese Privilegien erlangen Gegenmassnahmen BearbeitenProgrammerstellung Bearbeiten Eine sehr nachhaltige Gegenmassnahme besteht in der Verwendung typsicherer Programmiersprachen und werkzeuge wie zum Beispiel Java oder C bei denen die Einhaltung von zugewiesenen Speicherbereichen gegebenenfalls schon beim Ubersetzen in Maschinensprache mit dem Compiler kontrolliert aber spatestens zur Laufzeit mit entsprechendem Programmcode uberwacht wird Es ist hierbei unerlasslich dass das Verandern von Zeigervariablen nur nach strengen einschrankenden Regeln erfolgen darf und es ist in diesem Zusammenhang auch hilfreich wenn ausschliesslich das Laufzeitsystem automatische Speicherbereinigungen durchfuhrt Bei der Erstellung von Programmen muss also auf die Uberprufung aller Feldgrenzen geachtet werden Dies liegt bei nicht typsicheren Programmiersprachen in der Verantwortung des Programmierers Allerdings sollte vorzugsweise die Verwendung von Programmiersprachen die automatisch Feldgrenzen uberwachen in Erwagung gezogen werden was jedoch nicht immer ohne weiteres moglich ist Bei Verwendung von C sollte die Verwendung von Feldern im C Stil so weit wie moglich vermieden werden void input line char line 1000 if fgets line sizeof line stdin fgets uberpruft die Lange puts line puts schreibt den Inhalt von line nach stdout Gegenmassnahme fgets uberpruft die EingabelangeUberprufung des Programmcodes Bearbeiten Spezielle Uberprufungswerkzeuge erlauben die Analyse des Codes und entdecken mogliche Schwachstellen Allerdings kann der Code zur Feldgrenzenuberprufung fehlerhaft sein was oft nicht getestet wird Unterstutzung durch Compiler Bearbeiten In C und C steht eine sehr grosse Auswahl bestehender Programme zur Verfugung Moderne Compiler wie neue Versionen des GNU C Compilers erlauben die Aktivierung von Uberprufungscode Erzeugung bei der Ubersetzung Sprachen wie C erlauben aufgrund ihres Designs nicht immer die Uberprufung der Feldgrenzen Beispiel gets Die Compiler mussen andere Wege gehen Sie fugen zwischen der Rucksprungadresse und den lokalen Variablen Platz fur eine Zufallszahl auch Canary genannt ein Beim Programmstart wird diese Zahl ermittelt wobei sie jedes Mal unterschiedliche Werte annimmt Bei jedem Unterprogrammaufruf wird die Zufallszahl in den dafur vorgesehenen Bereich geschrieben Der erforderliche Code wird vom Compiler automatisch generiert Vor dem Verlassen des Programms uber die Rucksprungadresse fugt der Compiler Code ein der die Zufallszahl auf den vorgesehenen Wert uberpruft Wurde sie geandert ist auch der Rucksprungadresse nicht zu trauen Das Programm wird mit einer entsprechenden Meldung abgebrochen RucksprungadresseZufallszahlbarriereline 1000 Zeichen line 3 Zeichenline 2 Zeichenline 1 Zeichen StackpointerGegenmassnahme ZufallszahlbarriereDaneben kann man manche Compiler auch veranlassen beim Unterprogrammaufruf eine Kopie der Rucksprungadresse unterhalb der lokalen Felder zu erzeugen Diese Kopie wird beim Rucksprung verwendet die Ausnutzung von Pufferuberlaufen ist dann wesentlich erschwert Rucksprungadresseline 1000 Zeichen line 3 Zeichenline 2 Zeichenline 1 ZeichenKopie der Rucksprungadresse StackpointerGegenmassnahme Kopie der RucksprungadresseCompiler und Compilererweiterungen BearbeitenFur die GNU Compiler Collection existieren beispielsweise zwei verbreitete Erweiterungen die Massnahmen wie die oben beschriebenen implementieren Der Stack Smashing Protector von IBM ehemals als ProPolice bekannt Homepage englisch Der Stack Guard entwickelt an der Oregon Health amp Science University zwischenzeitlich bei der Linux Distribution Immunix jetzt bei Novell Heap Uberlauf BearbeitenEin Heap Uberlauf ist ein Pufferuberlauf der auf dem Heap stattfindet Speicher auf dem Heap wird zugewiesen wenn Programme dynamischen Speicher anfordern etwa uber malloc oder den new Operator in C Werden in einen Puffer auf dem Heap Daten ohne Uberprufung der Lange geschrieben und ist die Datenmenge grosser als die Grosse des Puffers so wird uber das Ende des Puffers hinausgeschrieben und es kommt zu einem Speicheruberlauf Durch Heap Uberlaufe kann durch Uberschreiben von Zeigern auf Funktionen beliebiger Code auf dem Rechner ausgefuhrt werden insbesondere wenn der Heap ausfuhrbar ist FreeBSD hat beispielsweise einen Heap Schutz hier ist das nicht moglich Sie konnen nur in Programmiersprachen auftreten in denen bei Pufferzugriffen keine Langenuberprufung stattfindet C C oder Assembler sind anfallig Java oder Perl sind es nicht Zum Bsp wurde am 23 Juni 2015 von Adobe bekannt gegeben dass durch solch einen Pufferuberlauf beliebiger Schadcode auf Systemen ausgefuhrt werden konne und so die Kontrolle uber das System ubernommen werden konnte auf denen der Flash Player installiert sei 4 5 Siehe auch Shellcode und ExploitBeispiel Bearbeiten define BUFSIZE 128 char copy string const char s char buf malloc BUFSIZE Annahme Langere Strings kommen niemals vor if buf strcpy buf s Heap Uberlauf falls strlen s gt 127 return buf Da strcpy die Grossen von Quelle und Ziel nicht uberpruft sondern als Quelle einen null terminierten 0 Speicherbereich erwartet ist auch die folgende Variante unsicher sie wird allerdings nicht uber buf hinausschiessen sondern ggf uber das Ende des s zugewiesenen Speicherbereichs char buf buf malloc 1 strlen s Plus 1 wegen des terminierenden NUL Zeichens if buf strcpy buf s Der strncpy Befehl dagegen kopiert maximal n Zeichen von der Quelle zum Ziel und funktioniert somit wenn s nullterminiert oder grosser als BUFSIZE ist char buf if buf malloc BUFSIZE NULL Uberprufung des Zeigers strncpy buf s BUFSIZE 1 buf BUFSIZE 1 0 Nachteil Die Zeichenkette muss manuell terminiert werden return buf Einige Betriebssysteme z B OpenBSD bieten die Funktion strlcpy an die ihrerseits sicherstellt dass der Zielstring nullterminiert wird und das Erkennen eines abgeschnittenen Zielstrings vereinfacht Siehe auch BearbeitenAngriffsvektor Arithmetischer Uberlauf NX BitLiteratur BearbeitenAleph One Smashing The Stack For Fun And Profit In Phrack Magazin 7 Nr 49 Dieser Artikel veranschaulicht sehr gut die Wirkungsweise von Pufferuberlaufen Jon Erickson Forbidden Code mitp Bonn 2004 ISBN 3 8266 1457 7 Tobias Klein Buffer Overflows und Format String Schwachstellen Funktionsweisen Exploits und Gegenmassnahmen Dpunkt Heidelberg 2004 ISBN 3 89864 192 9 Felix Lindner Ein Haufen Risiko Pufferuberlaufe auf dem Heap und wie man sie ausnutzt In c t Magazin fur Computer Technik 23 9 2006 S 186 192 auch kostenlos online im heise Security Oliver Muller Uberlaufer Systemeinbruch via Stack Overflow In iX Magazin fur professionelle Informationstechnik Band 2 2007 S 100 105 Stephan Kallnik Daniel Pape Daniel Schroter Stefan Strobel Daniel Bachfeld Eingelocht Buffer Overflows und andere Sollbruchstellen heise Security auch in c t 23 2001 S 216 Memento vom 14 November 2001 im Internet Archive Einfuhrungsartikel mit einfachen Beispielen in C Weblinks BearbeitenTechnische Details von Buffer Overflow und Exploits Ausnutzung eines Heap overflow Buffer Overflows und wie man sich davor schutzt Memento vom 14 November 2001 im Internet Archive Buffer Overflows und andere SollbruchstellenEinzelnachweise Bearbeiten Schwachstelle im Sun Java Runtime Environment LinuxCommunity am 17 Januar 2007 Sun Java JRE bis 1 5 x GIF Image Handler Pufferuberlauf vuldb com am 22 Januar 2007 letzte Anderung am 7 Juli 2015 Was ist ein Stack 2 Juni 2012 Dennis Schirrmacher Adobe Notfall Update fur Flash Player In Heise Security Heise online 24 Juni 2015 abgerufen am 29 Juni 2015 Security updates available for Adobe Flash Player CVE number CVE 2015 3113 In Adobe Security Bulletin Adobe Inc 23 Juni 2015 abgerufen am 29 Juni 2015 Normdaten Sachbegriff GND 4752450 9 lobid OGND AKS Abgerufen von https de wikipedia org w index php title Pufferuberlauf amp oldid 236800782