Return into libc
# Return into libc

Return into libc (auch return-to-libc) ist eine Methode zur Ausnutzung einer Sicherheitslücke in einem Computerprogramm.

## Grundprinzip

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, ist das Programm kompromittiert. Bei libc handelt sich im Allgemeinen um die Standardbibliothek der Programmiersprache C. Damit braucht also keine neue Funktion in das laufende System gebracht zu werden, so wie dies bei Shellcode Exploits üblicherweise notwendig ist. In dieser Bibliothek befindet sich z. B. eine Funktion „system“, welche die Ausführung beliebiger weiterer Anwendungen oder Skripte erlaubt. 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 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. Voraussetzung für eine solche Attacke ist jedoch ein anfälliges Programm, das – entgegen üblichen Programmiertechniken – die Länge von Eingabevariablen nicht prüft.

Eine Erweiterung und Verallgemeinerung dieser Technik beschreibt das Return Oriented Programming, bei dem sowohl die Voraussetzung externer Einbindungen aufgegeben wird als auch die Zielmarke einer Funktion, insofern hier beliebige Instruktionen angesprungen werden und sich vom Angreifer benötigte Funktionalität durch indirekte Verkettung dieser erreichen lässt.

## Schutzmöglichkeiten

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

Dieses Prinzip wurde erstmals in den späten 1990ern beschrieben und stetig verbessert, es war Grundlage etlicher Exploits besonders in den frühen 2000ern. Mit dem wachsenden Augenmerk auf Sicherheitsaspekte bei Betriebssystemen wie Compilern und Systemsoftware u. a. durch besagte Mechanismen verlor die hier beschriebene klassische Vorgehensweise praktisch an Bedeutung.

