Return into libc

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

Return into libc (auch return-to-libc) ist eine Methode zur Attacke von Computersystemen, um entweder Schaden anzurichten (z. B. bei einer Denial of Service-Attacke) oder um den Host (Server) zur Ausführung unerwünschter Programme zu missbrauchen.

Grundprinzip[Bearbeiten]

Computerprogramme verwenden einen speziellen Speicherbereich, den sogenannten Stack, um Variablen und Rücksprungadressen (englisch return address) aus Unterprogrammen zu verwalten. Wird der Stack nun so manipuliert, dass er statt der erwarteten Rücksprungadresse die Adresse einer anderen Funktion enthält, kann diese Funktion benutzt werden, um die gewünschten schädlichen Funktionen auszuführen. Die „libc“ ist eine Sammlung von Funktionen, die die Programmiersprache C zur Verfügung stellt. Damit muss also keine neue Funktion in das laufende System gebracht werden, so wie dies bei Shellcode Exploits üblicherweise notwendig ist. In dieser Sammlung befindet sich z. B. eine populäre Funktion „system()“, welche die Ausführung beliebiger Systemprogramme ermöglicht. Sie benötigt dabei nur einen Parameter, nämlich das auszuführende Kommando.

Die Manipulation des Stacks wird typischerweise durch einen Buffer Overflow hervorgerufen. Dabei wird eine Variable, die nur eine bestimmte Anzahl von Zeichen aufnehmen kann, mit einer längeren, genau ermittelten, Zeichenkette belegt, die auf dem Stack dann die hinter der Variablen liegende Rücksprungadresse überschreibt. Ebenso werden die gewünschten Argumente für die (libc-)Funktion auf den Stack geschrieben, zum Beispiel die Adresse einer Zeichenkette.

Variablen können unter anderem dann einen solchen Überlauf erzeugen, wenn sie z. B. in einer Web-Adresse als Parameter übergeben werden können und diese etwa an ein CGI-Programm übergeben werden. Zwingende Voraussetzung für eine solche Attacke ist jedoch ein anfälliges Programm, das – entgegen üblicher Programmiertechniken – die Länge von Eingabevariablen nicht prüft.

Schutzmöglichkeiten[Bearbeiten]

Ein mittels NX-Bit geschützter nicht-ausführbarer Stack kann zwar der Einschleusung von Schadcode durch Code Injection vorbeugen, eine Return-to-libc-Attacke kann jedoch trotzdem durchgeführt werden, da hierbei bereits existenter Code aufgerufen wird. Eine Abwehrmöglichkeit solcher Attacken kann auf 64-Bit-Systemen durch ASLR erreicht werden. Dabei werden die Speicheradressen der System-Funktionen zufällig erteilt, ein genauer Rücksprung auf diese Funktionen wird dabei also unwahrscheinlich. Stack-Schutzmechanismen wie der Stack Smashing Protector können weitere Angriffe aufdecken oder verhindern.

Siehe auch[Bearbeiten]