Buffer Overflow Angriff

Inhaltsverzeichnis

Was ist ein Buffer Overflow Angriff?

Ein Buffer Overflow (dt. Pufferüberlauf) ist eine Schwachstelle im Bereich der Speicherbelegung, die von Angreifern ausgenutzt werden kann. Sie liegt vor, wenn mehr Daten in einen Puffer (Speicherbereich) kopiert werden können, als dieser verarbeiten kann.

Am relevantesten sind heute Stack-Pufferüberläufe und Heap-Pufferüberläufe. Stack und Heap sind Elemente des Arbeitsspeichers, die dem ausführenden Programm vom Betriebssystem zur Verfügung gestellt werden.

Wann entsteht ein Buffer Overflow Angriff?

Ein Buffer Overflow tritt auf, wenn Daten mithilfe von Funktionen kopiert werden, die keine Längenüberprüfung vornehmen – beziehungsweise wenn ein Programmierer solch eine Funktion verwendet und keine Längenüberprüfung vornimmt. Es handelt sich beim Buffer Overflow somit nicht um Malware, sondern um das Ausnutzen einer Schwachstelle.

Wird ein Puffer von einer solchen Funktion ohne Längenüberprüfung mit mehr Daten beschrieben als er aufnehmen kann, kommt es zu einem Überlauf: dem Buffer Overflow. In diesem Fall werden Speicherbereiche überschrieben, die für andere Zwecke reserviert sind und nicht zu diesem Puffer gehören.

Im günstigsten Fall kommt es zu einem Absturz des Programms oder des Systems. Bei geschickter Wahl des Eingabestroms gelingt es dem Angreifer im ungünstigsten Fall, die Kontrolle über den Programmfluss zu erlangen und gezielt Code auszuführen. Dies funktioniert, indem Shellcode (Code, der zum Shellzugriff führt) in den Puffer geschrieben wird und versucht wird, den Speicherbereich zu beschreiben, der die Rücksprungadresse enthält. Kontrolliert man die Rücksprungadresse, kann man versuchen, zum Shellcode zu springen und er wird ausgeführt.

Ist Deine IT für einen
Buffer Overflow anfällig?
Mit unserem Penetration Test finden wir Deine Schwachstellen!
Zur Seite

Schwachstellen wie der Buffer Overflow müssen von ihren Entdeckern nicht zwangsläufig ausgenutzt werden. Wer eine Schwachstelle in einem Programm entdeckt, kann den Hersteller darüber informieren. Dieser hat dann die Möglichkeit, die Schwachstelle durch ein Update zu beheben.

In unserem Beitrag über Zero-Day-Exploits könnt ihr nachlesen, wie wir von ProSec vorgehen, wenn wir auf eine solche Schwachstelle stoßen.

Gegenmaßnahmen bei Buffer Overflow

Eine wirkungsvolle Gegenmaßnahme bei Buffer-Overflow ist beispielsweise DEP (Data-Execution-Prevention), welche Speicherbereiche als nicht ausführbar markiert und somit die Ausführung von Shellcode verhindern kann.

Die ASLR (Address Layout Randomization) ist eine Technik, die die Adressen von Funktionen im Speicher zufällig verändert. Dadurch wird die gezielte Manipulation von Rücksprungadressen erschwert.

Eine dritte Gegenmaßnahme ist die Stack-Smashing-Protection. Zu deren Maßnahmen gehört das Speichern der Rücksprungadresse außerhalb des Stacks und das Generieren eines Kontrollwerts (Canary) von der Rücksprungadresse. Durch diese Maßnahmen fällt eine Manipulation der Rücksprungadresse auf.

Die Kritikalität von Buffer Overflow

Bei erfolgreicher Ausnutzung der Buffer Overflow Schwachstelle agiert man mit den Rechten, die das Programm oder der Dienst auf dem System haben. Voraussetzung hierfür ist eine rollenbasierte Rechteverwaltung. Dies bedeutet, dass ein Angreifer beispielsweise bei Übernahme eines Web oder Mail Servers nur die eingeschränkten Rechte erhält, die dieser Dienst hat.

Anders wiederum sieht es bei Systemdiensten aus. Bei der SMB Schwachstelle Eternalblue handelt man nach der erfolgreichen Ausnutzung des Exploits als „NT-Authority\System“ (Account mit höchsten Rechten auf einem lokalen Windows System).

Bei nicht erfolgreicher Ausnutzung kommt es in der Regel zum Absturz des Programms oder Systems und damit zu einem „Denial of Service“.

buffer-overflow angriff
Quelle: https://www.acunetix.com/blog/web-security-zone/what-is-buffer-overflow/

Was ist ein Formatstring Angriff?

Formatstring-Angriffe oder -Schwachstellen gehören zur Klasse der Programmierfehler in Form fehlender „User Input Validation“ durch den Entwickler. Eine häufig verwendete Funktion in der Programmiersprache „C“ ist printf(), „print formatted“. Hierbei handelt es sich um eine Funktion aus der Familie der Stringverarbeitung. Ihre Funktionalität besteht darin, einen String (Zeichenkette) und auf Wunsch auch übergebene Werte (z. B. Eingaben) in einer gewünschten Formatierung auszugeben – sprich eine Anweisung, wie ein String zusammenzubauen ist.

Format-String Angriff

Eingaben und Werte werden ebenfalls im Stack gespeichert. Nimmt ein Programmierer keine Formatspezifikation (z.B. %s oder %d) vor, bedeutet dies, dass nicht genau definiert wird, welcher Datentyp erwartet wird (Inputvalidierung). Dadurch besteht die Gefahr, dass der Input vom System als Kommando interpretiert wird.

Hat ein Angreifer die Möglichkeit, den Inhalt des Formatstrings zum Teil oder ganz zu bestimmen, kann er dadurch einen Buffer Overflow auslösen.

Werden der „printf“ Funktion z.B. durch einen Angreifer selbst Formatspezifikationen mitgegeben, so sucht sie für jede gelieferte Spezifikation einen Wert, der dann in angegebener Form ausgegeben wird – und zwar aus ihrem Stack!

Je nach Applikation und Kontext kann es sich hierbei dann um Rücksprungadressen, Werte von Variablen, Pointern, Funktionsparametern oder auch von Nutzern bereitgestellte Informationen handeln.

In Beispielen zu Formatstring-Angriffen wird gerne „C“ gezeigt, man sollte jedoch nicht dem Trugschluss erliegen, solche Angriffe wären nur auf diese Programmiersprache beschränkt. Auch Python ist hierfür verwundbar und nicht ohne Grund beinhaltet der WSTG (Web Security Testing Guide) im Modul „Input Validation Testing“ unter anderem eine Subkategorie „Testing for Format String Injection“ – immerhin sind viele Backend-Applikationen wie Webserver ebenfalls in C oder C++ geschrieben.

Gegenmaßnahmen bei Formatstring Angriffen

Wie bereits weiter oben unter „Gegenmaßnahmen bei Buffer Overflow“ genannt, hilft ASLR auch gegen Formastring-Angriffe.

Die beste und wirksamste Gegenmaßnahme ist jedoch die Einführung einer Input Validierung seitens der Entwickler durch Regulierung der vorgesehenen Länge, dem Verbot bestimmter Zeichen, der Vorgabe von Formatspezifikationen und dem bereinigen externer Eingaben, bevor sie der Applikation übergeben werden. Entscheidend ist ebenfalls ein sauberer und sicherheitsbewusster Programmierungstandard sowie ein Sourcecode-Screening durch Spezialisten.

Kritikalität von Formatstring Angriffen

Das Ausnutzen dieser Schwachstelle kann dazu führen, dass ein Angreifer Bereiche des Stacks auslesen, Code ausführen oder einen Segmentierungsfehler (Speicherzugriffverletzung) in der laufenden Anwendung verursachen kann.
ANDERE BEITRÄGE

Inhaltsverzeichnis

Willst Du Teil unseres Teams werden?