Pufferüberlauf

Im Informationssicherheit und Programmierung, a Pufferüberlauf, oder Pufferüberlauf, ist ein Anomalie wo ein Programmwährend des Schreibens Daten zu einem Pufferüberrollt die Grenze des Puffer und überschreibt nebeneinander Erinnerung Standorte.
Puffer sind Speicherbereiche, die für die Aufbewahrung von Daten vorgesehen sind, häufig, während sie sie von einem Abschnitt eines Programms auf einen anderen oder zwischen Programmen verschieben. Pufferüberläufe können häufig durch missgebildete Eingänge ausgelöst werden. Wenn man davon ausgeht, dass alle Eingänge kleiner als eine bestimmte Größe sind und der Puffer so groß ist, dass diese Größe ist, kann eine anomale Transaktion, die mehr Daten erzeugt, dazu führen, dass sie das Ende des Puffers überschreiten. Wenn dies benachbarte Daten oder ausführbare Code überschreibt, kann dies zu einem unregelmäßigen Programmverhalten führen, einschließlich Speicherzugriffsfehler, falschen Ergebnissen und stürzt ab.
Das Verhalten eines Pufferüberlaufs auszunutzen ist ein bekannt Sicherheitsnutzung. Auf vielen Systemen ist das Speicherlayout eines Programms oder des gesamten Systems gut definiert. Durch das Senden von Daten, die einen Pufferüberlauf verursachen, können Sie in Bereiche einschreiben, von denen bekannt ist, ausführbarer Code und ersetzen Sie es durch Schadcodeoder um Daten selektiv zu überschreiben, die sich auf den Status des Programms beziehen, wodurch ein Verhalten verursacht wird, das vom ursprünglichen Programmierer nicht beabsichtigt war. Puffer sind weit verbreitet in Betriebssystem (Betriebssystem) Code, daher ist es möglich, Angriffe zu tätigen, die ausgeführt werden Privilegienkalation und erhalten unbegrenzten Zugriff auf die Ressourcen des Computers. Die Berühmten Morris Worm 1988 verwendete dies als eine seiner Angriffstechniken.
Programmiersprachen häufig mit Pufferüberläufen verbunden C und C ++, die keinen integrierten Schutz gegen den Zugriff auf oder überschreiben Sie Daten in einem Teil des Speichers und überprüfen Sie nicht automatisch, dass Daten an einen geschrieben wurden Array (Der eingebaute Puffertyp) liegt innerhalb der Grenzen dieses Arrays. Grenzenprüfung Kann Pufferüberläufe verhindern, erfordert jedoch zusätzliche Code- und Verarbeitungszeit. Moderne Betriebssysteme verwenden eine Vielzahl von Techniken, um böswillige Pufferüberläufe zu bekämpfen, insbesondere von Randomisierung des Speicherlayoutsoder absichtlich Platz zwischen Puffern und nach Aktionen, die in diese Bereiche schreiben ("Kanarien").
Technische Beschreibung
Ein Pufferüberlauf tritt auf, wenn Daten In einen Puffer geschrieben wird auch die Datenwerte in verfälscht in Speicheradressen neben dem Zielpuffer aufgrund unzureichender Grenzenprüfung. Dies kann beim Kopieren von Daten von einem Puffer zu einem anderen auftreten, ohne zuerst zu überprüfen, ob die Daten in den Zielpuffer passt.
Beispiel
Im folgenden Beispiel ausgedrückt in C, ein Programm hat zwei Variablen, die im Speicher nebeneinander stehen: einen 8-Byte-Long-Streicherpuffer, A und ein Zwei-Byte Big-Endian Ganzzahl, B.
verkohlen A[8] = "" "; ohne Vorzeichen kurz B = 1979;
Anfangs enthält A nur null Bytes und B enthält die Zahl 1979.
Variablennamen | EIN | B | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
Wert | [NULL -Saite] | 1979 | ||||||||
Sechskantwert | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 07 | BB |
Jetzt versucht das Programm, die zu speichern NULL-terminierte Zeichenfolge "excessive"
mit ASCII Codierung im A -Puffer.
Strcpy(A, "übermäßig");
"excessive"
ist 9 Zeichen lang und kodiert für 10 Bytes, einschließlich des Null -Terminators, aber A kann nur 8 Bytes nehmen. Wenn Sie die Länge der Zeichenfolge nicht überprüfen, überschreiben Sie auch den Wert von B:
Variablennamen | EIN | B | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
Wert | "E" | 'x' | 'c' | "E" | 's' | 's' | 'ich' | 'V' | 25856 | |
verhexen | 65 | 78 | 63 | 65 | 73 | 73 | 69 | 76 | 65 | 00 |
Bs Wert wurde nun versehentlich durch eine Zahl ersetzt, die aus einem Teil der Zeichenzeichenfolge gebildet wurde. In diesem Beispiel würde "E", gefolgt von einem Null -Byte, 25856.
Das Schreiben von Daten nach dem Ende des zugewiesenen Speichers kann manchmal vom Betriebssystem erkannt werden, um a zu generieren Segmentierungsfehler Fehler, der den Prozess endet.
Um zu verhindern, dass der Pufferüberlauf in diesem Beispiel auftritt Strcpy könnte durch ersetzt werden durch strlcpy, was die maximale Kapazität von a (einschließlich eines Null-Termination-Zeichens) als zusätzlicher Parameter nimmt und stellt sicher, dass nicht mehr als diese Datenmenge auf a geschrieben wird:
strlcpy(A, "übermäßig", Größe von(A));
Wenn verfügbar, die strlcpy Die Bibliotheksfunktion wird bevorzugt strncpy Dies wird den Zielpuffer nicht beendet, wenn die Länge der Quellzeichenfolge größer oder gleich der Größe des Puffers ist (das dritte Argument, das an die Funktion übergeht) A Möglicherweise nicht nullterminiert und kann nicht als gültige Schnur im C-Stil behandelt werden.
Ausbeutung
Die Techniken zu Ausbeuten Ein Pufferüberlauf variieren je nach Anlastung die Architektur, durch Betriebssystem und nach Gedächtnisregion. Zum Beispiel Ausnutzung auf der Haufen (Wird für das dynamisch zugewiesene Speicher verwendet) unterscheidet sich deutlich von der Ausbeutung auf der Rufen Sie Stack an.
Stapelbasierte Ausbeutung
Ein technisch geneigter Benutzer kann Stack-basierte Pufferüberläufe ausnutzen, um das Programm auf verschiedene Weise zu seinem Vorteil zu manipulieren:
- Indem Sie eine lokale Variable überschreiben, die sich in der Nähe des schutzbedürftigen Puffers im Stapel befindet, um das Verhalten des Programms zu ändern
- Durch Überschreiben der Rückgabeadresse in a Stapelrahmen auf den vom Angreifer ausgewählten Code verweisen, normalerweise als die genannt Shellcode. Sobald die Funktion zurückgibt, wird die Ausführung im Shellcode des Angreifers fortgesetzt.
- Durch Überschreiben a Funktionszeiger[1] oder Ausnahmebehandler auf den Shellcode zeigen, der anschließend ausgeführt wird
- Durch Überschreiben einer lokalen Variablen (oder Zeiger) eines anderen Stapelrahmens, der von der Funktion verwendet wird, die diesen Rahmen später besitzt.[2]
Der Angreifer entwirft Daten, um einen dieser Exploits zu verursachen, und platziert diese Daten dann in einen Puffer, der den Benutzern durch den gefährdeten Code zur Verfügung gestellt wird. Wenn die Adresse der von den Benutzer gelieferten Daten, die verwendet werden, um den Stack-Pufferüberlauf zu beeinflussen, unvorhersehbar ist, wird es viel schwieriger, einen Stapelpufferüberlauf auszunutzen, um die Ausführung der Remotecode zu verursachen. Eine Technik, mit der ein solcher Pufferüberlauf genutzt werden kann, wird genannt ""Trampolin springen"In dieser Technik findet ein Angreifer einen Zeiger auf den gefährdeten Stapelpuffer und berechnet den Ort ihres Shellcode relativ zu diesem Zeiger. Dann werden sie das Überschreiben verwenden, um zu einem zu springen Anweisung Bereits im Speicher, das einen zweiten Sprung macht, diesmal relativ zum Zeiger; Dieser zweite Sprung verzweigt die Ausführung in den Shellcode. Geeignete Anweisungen sind häufig in großem Code vorhanden. Das Metasploit -ProjektUnterhält beispielsweise eine Datenbank mit geeigneten Opcodes, obwohl sie nur die in der gefundenen Listen auflistet Fenster Betriebssystem.[3]
Haufenbasis Ausbeutung
Ein Pufferüberlauf, der im Heap-Datenbereich auftritt, wird als Heap-Überlauf bezeichnet und in einer Weise ausnutzbar als die von Stack-basierten Überläufen. Der Speicher auf dem Heap wird von der Anwendung zur Laufzeit dynamisch zugewiesen und enthält normalerweise Programmdaten. Die Ausbeutung wird durchgeführt, indem diese Daten auf bestimmte Weise verfälscht werden, um die Anwendung zu veranlassen, interne Strukturen wie verknüpfte Listenzeiger zu überschreiben. Die kanonische Heap -Überlauftechnik überschreibt die dynamische Speicherzuweisungsverknüpfung (wie z. Malloc Meta -Daten) und verwendet den resultierenden Zeigeraustausch, um einen Programmfunktionszeiger zu überschreiben.
Microsoft's GDI+ Verwundbarkeit in der Handhabung Jpegs ist ein Beispiel für die Gefahr, die ein Heap -Überlauf vorhanden ist.[4]
Barrieren für die Ausbeutung
Die Manipulation des Puffers, der vor dem Lesen oder Ausführen auftritt, kann zum Versagen eines Ausbeutungsversuchs führen. Diese Manipulationen können die Gefahr einer Ausbeutung abschwächen, machen sie jedoch möglicherweise nicht unmöglich. Manipulationen können die Umwandlung in den oberen oder unteren Fall und die Entfernung von umfassen Metacharaccters und aus Non-Nicht-Filternalphanumerisch Saiten. Es gibt jedoch Techniken, um diese Filter und Manipulationen zu umgehen. Alphanumerischer Shellcode, Polymorpher Code, selbstmodifizierender Code und Return-to-libc-Angriffe. Die gleichen Methoden können verwendet werden, um die Erkennung durch zu vermeiden Einbrucherkennungssystem. In einigen Fällen, einschließlich des Umgangs mit Code in konvertiert Unicode,[5] Die Bedrohung durch die Verletzlichkeit wurde von den Angaben falsch dargestellt, da die Fernausführung des willkürlichen Kodex tatsächlich nur die Denialverweigerung möglich ist.
Praktiken der Ausbeutung
In realen Exploits gibt es eine Vielzahl von Herausforderungen, die für Exploits zuverlässig bearbeitet werden müssen. Diese Faktoren umfassen Null-Bytes in Adressen, Variabilität am Standort von Shellcode, Unterschiede zwischen Umgebungen und verschiedenen Gegenmaßnahmen im Betrieb.
NOP -Schlittentechnik

Ein NOP-Sled ist die älteste und am weitesten verbreitete Technik zur Ausnutzung von Stapelpufferüberläufen.[6] Es löst das Problem, die genaue Adresse des Puffers zu finden, indem die Größe des Zielbereichs effektiv erhöht wird. Dazu sind viel größere Abschnitte des Stapels mit dem beschädigt No-op Maschinenanweisung. Am Ende der Angreifer gelieferten Daten legt der Angreifer nach den Anweisungen ohne OP eine Anweisung, einen relativen Sprung an die Spitze des Puffers durchzuführen, wo die Shellcode befindet sich. Diese Sammlung von No-OPs wird als "NOP-Sled" bezeichnet, denn wenn die Absenderadresse mit einer Adresse innerhalb des No-Op-Bereichs des Puffers überschrieben wird, wird die Ausführung die No-Ops ", bis es ist Umgeleitet in den tatsächlichen böswilligen Code durch den Sprung am Ende. Diese Technik erfordert, dass der Angreifer erraten muss, wo auf dem Stapel die NOP-SLED anstelle des vergleichsweise kleinen Shellcode ist.[7]
Aufgrund der Popularität dieser Technik viele Anbieter von Anbietern Intrusion Prevention Systems Sucht nach diesem Muster von Anweisungen mit No-op-Maschinen, um den verwendeten Shellcode zu erkennen. Es ist wichtig zu beachten, dass eine NOP-SLED nicht unbedingt nur herkömmliche Anweisungen für No-OP-Maschinen enthält. Jede Anweisung, die den Maschinenzustand nicht bis zu einem Punkt beschädigt, an dem der Shellcode nicht ausgeführt wird, kann anstelle der hardware-assistierten No-op verwendet werden. Infolgedessen ist es für Exploit-Autoren üblich geworden, den No-Op-Schlitten mit zufällig ausgewählten Anweisungen zu komponieren, die keinen wirklichen Einfluss auf die ShellCode-Ausführung haben.[8]
Diese Methode verbessert zwar die Chancen, dass ein Angriff erfolgreich sein wird, aber nicht ohne Probleme. Heldentaten, die diese Technik verwenden, müssen sich immer noch auf ein gewisses Glück angewiesen haben, dass sie Offsets auf dem Stapel erraten, das sich in der NOP-STEL-Region befindet.[9] Eine falsche Vermutung führt normalerweise zum Absturz des Zielprogramms und kann die alarmieren Systemadministrator zu den Aktivitäten des Angreifers. Ein weiteres Problem ist, dass die NOP-SLED eine viel größere Menge an Speicher erfordert, um eine NOP-Sleee zu halten, die groß genug ist, um nützlich zu sein. Dies kann ein Problem sein, wenn die zugewiesene Größe des betroffenen Puffer zu klein ist und die aktuelle Tiefe des Stapels flach ist (d. H. Es gibt nicht viel Platz vom Ende des aktuellen Stapelrahmens bis zum Start des Stapels). Trotz seiner Probleme ist die NOP-SLED oft die einzige Methode, die für eine bestimmte Plattform, Umgebung oder Situation funktioniert, und als solche ist es immer noch eine wichtige Technik.
Der Sprung zur Adresse, die in einer Register -Technik gespeichert ist
Die Technik "Sprung to Register" ermöglicht eine zuverlässige Ausbeutung von Stack-Puffer-Überläufen, ohne dass zusätzlichen Platz für eine NOP-STE-STECE und ohne Stapel-Offsets erraten werden müssen. Die Strategie besteht darin, den Rückgabeinzeiger mit etwas zu überschreiben, das das Programm dazu bringt, zu einem bekannten Zeiger zu springen, der in einem Register gespeichert ist, das auf den kontrollierten Puffer und damit auf den Shellcode hinweist. Wenn beispielsweise Register A einen Zeiger auf den Beginn eines Puffers enthält, kann jeder Sprung oder Anruf dieses Register als Operand verwendet werden, um die Kontrolle über den Ausführungsfluss zu erhalten.[10]

Dbgprint ()
Routine enthält die i386 Maschine Opcode für JMP ESP
.In der Praxis kann ein Programm möglicherweise nicht absichtlich Anweisungen enthalten, um in ein bestimmtes Register zu springen. Die traditionelle Lösung besteht darin, eine unbeabsichtigte Instanz eines geeigneten zu finden Opcode an einem festen Ort irgendwo innerhalb des Programmspeichers. In Abbildung E links ist ein Beispiel für eine so unbeabsichtigte Instanz des i386 JMP ESP
Anweisung. Der Opcode für diese Anweisung ist Ff e4
.[11] Diese Zwei-Byte-Sequenz finden Sie bei einem One-Byte-Offset ab Beginn der Anweisung Rufen Sie DBGPrint an
bei Adresse 0x7c941eed
. Wenn ein Angreifer die Programmabgabeadresse mit dieser Adresse überschreibt, wird das Programm zuerst springen 0x7c941eed
interpretieren Sie den Opcode Ff e4
als die JMP ESP
Anweisung und springt dann an die Spitze des Stapels und führt den Code des Angreifers aus.[12]
Wenn diese Technik möglich ist, steigt die Schwere der Verwundbarkeit erheblich an. Dies liegt daran, dass die Ausbeutung zuverlässig genug funktioniert, um einen Angriff mit einer virtuellen Erfolgsgarantie zu automatisieren, wenn er ausgeführt wird. Aus diesem Grund ist dies die am häufigsten verwendete Technik in Internetwürmer Dieser Exploit -Stack -Pufferüberlauf -Schwachstellen.[13]
Mit dieser Methode kann ShellCode nach der überschriebenen Rückgabeadresse auf der Windows -Plattform platziert werden. Da ausführbare Sächen hauptsächlich auf der Adresse basieren 0x00400000
und x86 ist a Kleiner Endian Architektur, das letzte Byte der Absenderadresse muss ein Null sein, der die Pufferkopie beendet und darüber hinaus nichts geschrieben wird. Dies begrenzt die Größe des Shellcode auf die Größe des Puffers, was übermäßig restriktiv sein kann. DLLs befinden sich im hohen Speicher (oben 0x01000000
) und so haben Adressen, die keine Null -Bytes enthalten, so dass diese Methode Null -Bytes (oder andere unzulässige Zeichen) aus der überschriebenen Rückgabedress entfernen kann. Auf diese Weise wird die Methode häufig als "DLL -Trampolination" bezeichnet.
Schutzmaßnahmen
Es wurden verschiedene Techniken verwendet, um Pufferüberläufe mit verschiedenen Kompromisse zu erkennen oder zu verhindern. Der zuverlässigste Weg, um Pufferüberläufe zu vermeiden oder zu verhindern, besteht darin, den automatischen Schutz auf Sprachebene zu verwenden. Diese Art von Schutz kann jedoch nicht angewendet werden Legacy -Codeund oft technische, geschäftliche oder kulturelle Einschränkungen erfordern eine verletzliche Sprache. In den folgenden Abschnitten werden die verfügbaren Auswahlmöglichkeiten und Implementierungen beschrieben.
Auswahl der Programmiersprache
Montage und C/C ++ sind beliebte Programmiersprachen, die für den Pufferüberlauf anfällig sind, teilweise, weil sie direkten Zugriff auf den Speicher ermöglichen und nicht sind stark tippt.[14] C bietet keinen integrierten Schutz gegen den Zugriff auf oder überschreiben Sie Daten in einem Teil des Speichers. Insbesondere wird nicht überprüft, ob Daten, die an einen Puffer geschrieben wurden, innerhalb der Grenzen dieses Puffers liegen. Die Standard -C ++ - Bibliotheken bieten viele Möglichkeiten, Daten sicher zu puffern, und C ++ 's Standard -Vorlagenbibliothek (STL) stellt Container bereit, die optional Grenzüberprüfungen durchführen können, wenn der Programmierer beim Zugriff auf Daten explizit Überprüfungen fordert. Zum Beispiel a Vektor
Mitgliedsfunktion bei()
führt eine Grenzenprüfung durch und wirft eine außer Reichweite
Ausnahme Wenn die Grenzenprüfung fehlschlägt.[15] C ++ verhält sich jedoch genau wie C, wenn die Grenzenprüfung nicht explizit aufgerufen wird. Techniken, um Pufferüberläufe zu vermeiden, existieren auch auch für C.
Sprachen, die stark typisiert sind und keinen direkten Speicherzugriff wie COBOL, Java, Python und andere ermöglichen, verhindern in den meisten Fällen den Auftritt des Pufferüberlaufs.[14] Viele Programmiersprachen außer C/C ++ bieten eine Laufzeitüberprüfung und in einigen Fällen sogar eine Kompilierungszeitprüfung, die eine Warnung senden oder eine Ausnahme anziehen können, wenn C oder C ++ Daten überschreibt und weitere Anweisungen ausführen würde, bis fehlerhafte Ergebnisse erzielt werden, welche möglicherweise oder, welche möglicherweise oder, welche möglicherweise oder, welche möglicherweise oder, welche möglicherweise oder Kann das Programm nicht zum Absturz bringen. Beispiele für solche Sprachen umfassen Ada, Eiffel, Lispeln, Modula-2, Smalltalk, Ocaml und solche C-Derivate wie Zyklon, Rost und D. Das Java und .NET Framework Bytecode -Umgebungen erfordern auch Grenzen, die alle Arrays überprüfen. Fast jeder Interpretierte Sprache schützt vor Pufferüberläufen und signalisiert eine gut definierte Fehlerbedingung. Oft wird eine Sprache genügend Typinformationen zur Verfügung stellt, um Grenzen durchzuführen, um eine Option zu überprüfen, um sie zu aktivieren oder zu deaktivieren. Statische Codeanalyse Kann viele dynamische gebundene und Typprüfungen entfernen, aber schlechte Implementierungen und unangenehme Fälle können die Leistung erheblich verringern. Software -Ingenieure müssen die Kompromisse bei den Sicherheitskosten sorgfältig berücksichtigen, wenn sie entscheiden, welche Sprache und Compiler -Einstellung verwendet werden soll.
Verwendung sicherer Bibliotheken
Das Problem der Pufferüberläufe ist in den C- und C ++ - Sprachen üblich, da sie repräsentative Details von Puffern als Container für Datentypen auf niedriger Ebene aufdecken. Pufferüberläufe müssen somit vermieden werden, indem ein hohes Maß an Korrektheit im Code aufrechterhalten wird, der das Puffermanagement ausführt. Es wurde auch lange empfohlen, Standardbibliotheksfunktionen zu vermeiden, die nicht geprüft werden, wie z. bekommt
, Scanf
und Strcpy
. Das Morris Worm ausgebeutet a bekommt
Rufen Sie an Finger.[16]
Gut geschriebene und getestete abstrakte Datentypbibliotheken, die das Puffermanagement, einschließlich Grenzenprüfung, zentralisieren und automatisch durchführen, können das Auftreten und die Auswirkungen von Pufferüberläufen verringern. Die beiden Hauptgebäudeblock-Datentypen in diesen Sprachen, bei denen üblicherweise Pufferüberläufe auftreten, sind Zeichenfolgen und Arrays. Somit können Bibliotheken, die Pufferüberläufe in diesen Datentypen verhindern, die überwiegende Mehrheit der erforderlichen Abdeckung liefern. Das Versäumnis, diese sicheren Bibliotheken korrekt zu verwenden, kann jedoch zu Pufferüberläufen und anderen Schwachstellen führen. und natürlich alle Insekt In der Bibliothek selbst ist eine potenzielle Verwundbarkeit. "Safe" Bibliotheksimplementierungen umfassen "The Better String Library".[17] Vstr[18] und Erwin.[19] Das OpenBSD Betriebssysteme C Bibliothek Bietet die strlcpy und strlcat Funktionen, aber diese sind eingeschränkter als vollständige sichere Bibliotheksimplementierungen.
Im September 2007 wurde der vom C Standards Committee erstellte technische Bericht 24731 veröffentlicht;[20] Es gibt eine Reihe von Funktionen an, die auf den String- und E/A-Funktionen der Standard-C-Bibliothek basieren, mit zusätzlichen Parametern der Puffergröße. Die Wirksamkeit dieser Funktionen zum Zweck der Reduzierung von Pufferüberläufen ist jedoch umstritten; Es erfordert eine Programmiererintervention auf einer Funktionsaufrufbasis, die einer Intervention entspricht, die die analogen älteren Standardbibliotheksfunktionen für den Überlauf sicher machen könnten.[21]
Pufferüberlaufschutz
Pufferüberlaufschutz wird verwendet, um die häufigsten Pufferüberläufe zu erkennen, indem er prüft, ob die Stapel wurde nicht geändert, wenn eine Funktion zurückkommt. Wenn es geändert wurde, verlässt das Programm mit a Segmentierungsfehler. Drei solche Systeme sind libsafe,[22] und die StackGuard[23] und Propolice[24] GCC Patches.
Microsoft -Implementierung von Verhinderung der Datenausführung (DEP) Modus schützt den Zeiger explizit auf die Strukturierter Ausnahmebehandler (SEH) von überschrieben.[25]
Ein stärkerer Stapelschutz ist möglich, indem der Stack in zwei Teile geteilt wird: einen für Daten und eine für Funktionsrenditen. Diese Spaltung ist in der vorhanden Forth Sprache, obwohl es keine sicherheitsbasierte Designentscheidung war. Unabhängig davon ist dies keine vollständige Lösung für Pufferüberläufe, da andere sensible Daten als die Rückgabeadresse noch überschrieben werden.
Zeigerschutz
Pufferüberläufe funktionieren durch Manipulation Zeiger, einschließlich gespeicherter Adressen. Pointguard wurde als Compiler-Erweiterung vorgeschlagen, um Angreifer daran zu hindern, zuverlässig Zeiger und Adressen zu manipulieren.[26] Der Ansatz funktioniert, indem der Compiler den Code für XOR-CODE-Zeiger vor und nach der Verwendung automatisch addiert. Theoretisch, da der Angreifer nicht weiß, mit welchem Wert der Zeiger codiert/dekodiert wird, kann er nicht vorhersagen, worauf er hinweisen wird, wenn er ihn mit einem neuen Wert überschreibt. PointGuard wurde nie veröffentlicht, aber Microsoft implementierte einen ähnlichen Ansatz, der in der Innenschrift implementiert wurde Windows XP Sp2 und Windows Server 2003 SP1.[27] Anstatt Zeigerschutz als automatische Funktion zu implementieren, fügte Microsoft eine API -Routine hinzu, die aufgerufen werden kann. Dies ermöglicht eine bessere Leistung (da es nicht die ganze Zeit verwendet wird), sondern die Belastung des Programmierers, um zu wissen, wann er notwendig ist.
Da XOR linear ist, kann ein Angreifer möglicherweise einen codierten Zeiger manipulieren, indem nur die unteren Bytes einer Adresse überschreiben. Dies kann es ermöglichen, dass ein Angriff erfolgreich ist, wenn der Angreifer den Exploit mehrmals versuchen kann oder einen Angriff ausfüllen kann, indem ein Zeiger auf einen von mehreren Stellen hinweist (z. B. an jedem Ort innerhalb eines NOP -Schlittens).[28] Microsoft fügte ihr Codierungsschema eine zufällige Rotation hinzu, um diese Schwäche zu partiellen Überschreibungen anzusprechen.[29]
Ausführbarer Raumschutz
Ausführbarer Raumschutz ist ein Ansatz zum Pufferüberlaufschutz, der die Ausführung von Code auf dem Stapel oder auf dem Haufen verhindert. Ein Angreifer kann Pufferüberläufe verwenden, um beliebigen Code in den Speicher eines Programms einzufügen. Mit einem ausführbaren Speicherschutzschutz wird jedoch jeder Versuch, diesen Code auszuführen, eine Ausnahme hervorruft.
Einige CPUs unterstützen eine Funktion namens namens NX ("Keine Ausführung") oder XD ("Deaktiviert ausführen") Bit, das in Verbindung mit Software verwendet werden kann, um zu markieren Datenseiten (wie diejenigen, die den Stapel und den Haufen enthalten) als lesbar und beschreibbar, aber nicht ausführbar.
Einige Unix -Betriebssysteme (z. OpenBSD, Mac OS) Schiff mit ausführbarem Raumschutz (z. W^x). Einige optionale Pakete umfassen:
Neuere Varianten von Microsoft Windows unterstützen auch den ausführbaren Speicherplatzschutz, das genannt wird Verhinderung der Datenausführung.[33] Proprietär Add-Ons enthalten:
Ausführbarer Raumschutz schützt im Allgemeinen nicht vor Return-to-libc-Angriffe, oder ein anderer Angriff, der nicht auf die Ausführung des Angreifer -Code beruht. Allerdings auf 64-Bit Systeme verwenden ASLRWie nachstehend beschrieben, macht es den Schutz des ausführbaren Raums weitaus schwieriger, solche Angriffe auszuführen.
Adressraumlayout Randomisierung
Adressraumlayout -Randomisierung (ASLR) ist eine Funktion für die Computersicherheit, bei der die Positionen der wichtigsten Datenbereiche angeordnet werden, einschließlich der Basis der ausführbaren Datei und der Position von Bibliotheken, Heap und Stack, zufällig im Adressraum des Prozesses.
Randomisierung der virtueller Speicher Adressen, bei denen Funktionen und Variablen gefunden werden können, können die Ausbeutung eines Pufferüberlaufs erschweren, aber nicht unmöglich. Es zwingt den Angreifer auch, den Ausbeutungsversuch auf das individuelle System anzupassen, das die Versuche von vereitelt Internetwürmer.[36] Eine ähnliche, aber weniger effektive Methode ist zu wiederherstellen Prozesse und Bibliotheken im virtuellen Adressraum.
Tiefe Paketprüfung
Die Verwendung von Deep Paket Inspection (DPI) kann am Netzwerkumfang sehr grundlegende Fernversuche erkennen, um Pufferüberläufe durch Verwendung von Angriffssignaturen und zu nutzen Heuristik. Dies sind in der Lage, Pakete zu blockieren, die die Signatur eines bekannten Angriffs aufweisen, oder wenn eine lange Reihe von Anweisungen ohne Operation (als NOP-SLED bezeichnet) festgestellt wird Nutzlast ist leicht variabel.
Das Scannen von Paketen ist keine wirksame Methode, da es nur bekannte Angriffe verhindern kann und es viele Möglichkeiten gibt, wie ein NOP-SLED codiert werden kann. Shellcode Von Angreifern verwendet werden können gemacht werden alphanumerisch, metamorph, oder selbstmodifizierend der Erkennung durch heuristische Paketscanner zu entziehen und Einbrucherkennungssystem.
Testen
Überprüfen Sie nach Pufferüberläufen und das Patch der Fehler, die sie auf natürliche Weise verursachen, können Pufferüberläufe verhindern. Eine häufige automatisierte Technik zum Entdecken ist Fuzzing.[37] Kantenfalltests können auch Pufferüberläufe aufdecken, ebenso wie eine statische Analyse.[38] Sobald ein potenzieller Pufferüberlauf erkannt wurde, muss er gepatcht werden. Dies macht den Testansatz für Software nützlich, das in der Entwicklung ist, aber weniger nützlich für Legacy -Software, die nicht mehr gewartet oder unterstützt wird.
Geschichte
Pufferüberläufe wurden bereits 1972 verstanden und teilweise öffentlich dokumentiert, als die Studie zur Planung der Computersicherheitstechnologie die Technik legte: "Der Code, der diese Funktion ausführt Der Benutzer. Dies kann verwendet werden, um Code in den Monitor zu injizieren, mit dem der Benutzer die Kontrolle über die Maschine beschlagnahmt. "[39] Heute würde der Monitor als Kernel bezeichnet.
Die früheste dokumentierte feindliche Ausbeutung eines Pufferüberlauf Morris Worm sich über das Internet verbreiten. Das ausgebeutete Programm war a Service an Unix genannt Finger.[40] Später, 1995, entdeckte Thomas Lopatic den Pufferüberlauf unabhängig voneinander und veröffentlichte seine Ergebnisse an der Bugtraq Sicherheits -Mailingliste.[41] Ein Jahr später, 1996,, Elias Levy (auch bekannt als Aleph One) veröffentlicht in Phrack Magazin Das Papier "Der Stapel für Spaß und Gewinn zerschlagen",[42] Eine Schritt-für-Schritt-Einführung in die Nutzung von Stapel-basierten Pufferüberlaufschwachstellen.
Seitdem haben mindestens zwei große Internetwürmer Pufferüberläufe ausgebeutet, um eine große Anzahl von Systemen zu beeinträchtigen. Im Jahr 2001 die Code Red Worm verzeichnete einen Pufferüberlauf in Microsoft's aus Internetinformationsdienste (Iis) 5.0[43] und im Jahr 2003 die SQL Slammer Wurm kompromittierte Maschinen, die laufen Microsoft SQL Server 2000.[44]
Im Jahr 2003 sind Pufferüberläufe in lizenziert vorhanden Xbox Spiele wurden ausgenutzt, um nicht lizenzierte Software zu ermöglichen, einschließlich Homebrew -Spiele, um auf der Konsole zu laufen, ohne Hardware -Modifikationen zu benötigen, bekannt als als Modchips.[45] Das PS2 Unabhängigkeit Exploit benutzte auch einen Pufferüberlauf, um dasselbe für die zu erreichen Playstation 2. Der Twilight -Hack hat das gleiche mit dem erreicht Wiimit einem Pufferüberlauf in Die Legende von Zelda: Twilight Prinzessin.
Siehe auch
- Milliarden lacht
- Puffer überlesen
- Konventionen codieren
- Computersicherheit
- Ende der Datei
- Haufen Überlauf
- Ping des Todes
- Port Scanner
- Return-to-libc-Angriff
- Sicherheitskritisches System
- Sicherheitsorientiertes Betriebssystem
- Selbstmodifizierender Code
- Softwarequalität
- Shellcode
- Stapelpufferüberlauf
- Unkontrollierte Formatzeichenfolge
Verweise
- ^ "Core-2007-0219: OpenBSDs IPv6 MBUFS Remote-Kernel-Pufferüberlauf". Abgerufen 2007-05-15.
- ^ "Moderne Überlaufziele" (PDF). Abgerufen 2013-07-05.
- ^ "Die Metasploit -Opcode -Datenbank". Archiviert von das Original am 12. Mai 2007. Abgerufen 2007-05-15.
- ^ "Microsoft TechNet Security Bulletin MS04-028". Microsoft. Archiviert von das Original Am 2011-08-04. Abgerufen 2007-05-15.
- ^ "Erstellen beliebiger Shellcode in unicode erweiterten Saiten" (PDF). Archiviert von das Original (PDF) am 2006-01-05. Abgerufen 2007-05-15.
- ^ Vangelis (2004-12-08). "Stack-basierter Überlauf-Exploit: Einführung in die klassische und erweiterte Überlauftechnik". Wowhacker über New Order. Archiviert von das Original (Text) Am 18. August 2007.
{{}}
: Journal zitieren erfordert|journal=
(Hilfe) - ^ Balaban, Murat. "Puffer überläuft entmystifiziert" (Text). Enderunix.org.
{{}}
: Journal zitieren erfordert|journal=
(Hilfe) - ^ Akritidis, P.; Evangelos P. Markatos; M. Polychronakis; Kostas D. Anagnostakis (2005). "Strid: Polymorphe Schlittendetektion durch Analyse der Befehlssequenz." (PDF). Proceedings der 20. IFIP International Information Security Conference (IFIP/SEC 2005). IFIP International Information Security Conference. Archiviert von das Original (PDF) Am 2012-09-01. Abgerufen 2012-03-04.
- ^ Klein, Christian (September 2004). "Pufferüberlauf" (PDF). Archiviert von das Original (PDF) am 2007-09-28.
{{}}
: Journal zitieren erfordert|journal=
(Hilfe) - ^ Shah, Saumil (2006). "Schreiben von Metasploit -Plugins: Von Anfälligkeit zur Ausnutzung" (PDF). Hack in die Box. Kuala Lumpur. Abgerufen 2012-03-04.
- ^ Intel 64 und IA-32 Architektures Softwareentwickler Handbuch Band 2A: Anweisungssatz, A-M (PDF). Intel Corporation. Mai 2007. S. 3–508. Archiviert von das Original (PDF) Am 2007-11-29.
- ^ Alvarez, Sergio (2004-09-05). "Win32 Stack Bufferoverflow Real Life Vuln-Dev-Prozess" (PDF). IT -Sicherheitsberatung. Abgerufen 2012-03-04.
{{}}
: Journal zitieren erfordert|journal=
(Hilfe) - ^ Ukai, Yuji; Soeder, Derek; Permeh, Ryan (2004). "Umgebungsabhängigkeiten bei Windows Exploitation". Blackhat Japan. Japan: Eeye Digitale Sicherheit. Abgerufen 2012-03-04.
- ^ a b https://www.owasp.org/index.php/buffer_overflowsbuffer Überläuft den Artikel über OWASP Archiviert 2016-08-29 bei der Wayback -Maschine
- ^ "Vector :: at - C ++ Referenz". Cplusplus.com. Abgerufen 2014-03-27.
- ^ "Archivierte Kopie". Wiretap.area.com. Archiviert von das Original am 5. Mai 2001. Abgerufen 6. Juni 2022.
{{}}
: CS1 Wartung: Archiviertes Kopie als Titel (Link) - ^ "Die bessere String -Bibliothek".
- ^ "Die VSTR -Homepage". Archiviert von das Original Am 2017-03-05. Abgerufen 2007-05-15.
- ^ "Die Erwin -Homepage". Abgerufen 2007-05-15.
- ^ Internationale Organisation für Standardisierung (2007). "Informationstechnologie-Programmiersprachen, ihre Umgebungen und System-Software-Schnittstellen-Erweiterungen zur C-Bibliothek-Teil 1: Grenzen-Überprüfungs-Schnittstellen". ISO Online -Browsing -Plattform.
- ^ "Cert Secure Coding Initiative". Archiviert von das Original am 28. Dezember 2012. Abgerufen 2007-07-30.
- ^ "Libsafe bei fsf.org". Abgerufen 2007-05-20.
- ^ "StackGuard: Automatische adaptive Erkennung und Prävention von Puffer-Overflow-Angriffen von Cowan et al." (PDF). Abgerufen 2007-05-20.
- ^ "Propolice bei x.org". Archiviert von das Original am 12. Februar 2007. Abgerufen 2007-05-20.
- ^ "Umgang mit Windows-Hardware-durchdrungener Datenausführungsprävention". Archiviert von das Original Am 2007-04-30. Abgerufen 2007-05-20.
- ^ "12. Usenix Security Symposium - Technisches Papier". www.usenix.org. Abgerufen 3. April 2018.
- ^ "Schutz vor Zeiger -Subterfuge (irgendwie!)". msdn.com. Archiviert von das Original Am 2010-05-02. Abgerufen 3. April 2018.
- ^ "Usenix - Die Advanced Computing Systems Association" (PDF). www.usenix.org. Abgerufen 3. April 2018.
- ^ "Schutz vor Zeiger -Subterfuge (Redux)". msdn.com. Archiviert von das Original am 2009-12-19. Abgerufen 3. April 2018.
- ^ "PAX: Homepage des PAX -Teams". Abgerufen 2007-06-03.
- ^ "Kerneltrap.org". Archiviert von das Original Am 2012-05-29. Abgerufen 2007-06-03.
- ^ "OpenWall Linux Kernel Patch 2.4.34-OW1". Archiviert von das Original Am 2012-02-19. Abgerufen 2007-06-03.
- ^ "Microsoft TechNet: Prävention zur Datenausführung". Archiviert von das Original am 2006-06-22. Abgerufen 2006-06-30.
- ^ "Puffershield: Verhinderung des Pufferüberlaufs für Windows". Abgerufen 2007-06-03.
- ^ "NGSEC Stack Defender". Archiviert von das Original am 2007-05-13. Abgerufen 2007-06-03.
- ^ "Pax bei Grsecurity.net". Abgerufen 2007-06-03.
- ^ "Der Ausbeutliche - Sicherheitsinformationen und Tutorials". Abgerufen 2009-11-29.
- ^ Larochelle, David; Evans, David (13. August 2001). "Statische Erkennung der wahrscheinlichen Schwachstellen für Pufferüberlauf". Usenix Security Symposium. 32.
- ^ "Studie zur Planung der Computersicherheitstechnologie" (PDF). p. 61. archiviert von das Original (PDF) Am 2011-07-21. Abgerufen 2007-11-02.
- ^ ""Eine Tour durch den Wurm" von Donn Seeley, Universität von Utah ". Archiviert von das Original Am 2007-05-20. Abgerufen 2007-06-03.
- ^ "Bugtraq Security Mailing List Archive". Archiviert von das Original am 2007-09-01. Abgerufen 2007-06-03.
- ^ ""Den Stapel für Spaß und Gewinn" von Aleph One zerschmettert ". Abgerufen 2012-09-05.
- ^ "Eeye Digital Security". Abgerufen 2007-06-03.
- ^ "Microsoft TechNet Security Bulletin MS02-039". Microsoft. Archiviert von das Original am 2008-03-07. Abgerufen 2007-06-03.
- ^ "Hacker bricht den Xbox-Schutz ohne Mod-Chip". Archiviert von das Original am 2007-09-27. Abgerufen 2007-06-03.
Externe Links
- "Entdecken und Ausnutzen eines Remote -Puffer -Überlaufs in einem FTP -Server" von Raykoid666
- "Den Stapel für Spaß und Gewinn zerschlagen" von Aleph eins
- Gerg, Isaac (2005-05-02). "Ein Überblick und ein Beispiel für den Puffer-Overflow-Exploit" (PDF). Ianewsletter. Analysezentrum für Information Assurance Technology. 7 (4): 16–21. Archiviert von das Original (PDF) am 2006-09-27. Abgerufen 2019-03-17.
- Cert sichere Codierungsstandards
- Cert sichere Codierungsinitiative
- Sichere Codierung in C und C ++
- SANS: Innerhalb des Pufferüberlaufangriffs
- "Fortschritte in benachbarten Speicherüberläufen" von Nomenumbra
- Ein Vergleich der Implementierungen und Schwächen der Pufferüberlaufprävention
- Weitere Sicherheits -Whitepapers über Pufferüberläufe
- Kapitel 12: Schreiben von Exploits III aus Sockets, Shellcode, Porting & Codierung: Reverse Engineering Exploits und Tool -Codierung für Sicherheitsexperten von James C. Foster ( ISBN1-59749-005-9). Detaillierte Erläuterung, wie Sie Metasploit verwenden, um einen Pufferüberlauf von Grund auf neu zu entwickeln.
- Planungsstudie zur Planung der ComputersicherheitstechnologieJames P. Anderson, ESD-TR-73-51, ESD/AFSC, Hanscom AFB, Bedford, MA 01731 (Oktober 1972) [NTIS AD-758 206]
- "Pufferüberläufe: Anatomie eines Exploits" von Nevermore
- Sichern Sie die Programmierung mit GCC und GLIBC Archiviert 2008-11-21 bei der Wayback -Maschine (2008) von Marcel Holtmann
- "Criação de Exploits Com Puffer Overflor - Parte 0 - Um Pouco de Teoria" (2018) von Helvio Junior (M4v3r1ck)