Eingelocht

Seite 4: Evolution

Inhaltsverzeichnis

Neben den klassischen Buffer-Overflows tauchen auch vermehrt Angriffe über Format-Strings und Heap-Overflows auf -- auch als Exploits der dritten Generation bezeichnet. Format-Strings [4] werden in C-Programmen benutzt, um Ausgaben besser lesbar zu gestalten. Dazu wird ein solcher String entweder als Argument oder als Teil einer Zeichenkette übergeben. Neben üblichen Format Strings (%d, %s, %h) existiert auch ein selten benutzter: %n. Dieser weist die printf-Funktion an, die Anzahl der übergebenen Zeichen an eine wählbare Adresse zu schreiben [5]:

printf ("%.*d%n\n", (int) attack_code , 0 , return_addr_ptr);

In diesem Beispiel lässt sich die exakte Anzahl der zu schreibenden Werte definieren (%.*d), der Wert attack_code wird an die Stelle geschrieben, auf die return_addr_ptr zeigt. Zu Problemen kann es kommen, wenn es einem Angreifer gelingt, obige Zeichenkette irgendwie an printf() zu übergeben. Verwundbarer Code sieht zum Beispiel so aus:

while (fgets(buf, sizeof buf, f))
lreply(200, buf);
...
}

void lreply(int n, char *fmt, ...) {
...
vnsprintf(buf, sizeof buf, fmt, ap);
...
}

Der Ausschnitt liest eine Zeile vom Netzwerk und übergibt sie an lreply(), welche sie wiederum an vnsprintf() weitergibt. vsnprintf() wertet ebenfalls Format-Strings aus. Dabei hat der Programmierer hier bei der Übergabe vergessen, den Format-String-Specifier (lreply(200, "%s", buf)) anzugegeben. Enthält buf Format-Strings wie oben, lässt sich eigener Code in den Speicher schreiben und im Kontext des Programmes, welches vnsprintf() aufgerufen hat, ausführen. Im Gegensatz zu den klassischen Buffer Overflows ist ein Angreifer nun nicht mehr auf den Stack beschränkt. Glücklicherweise finden sich derartige Schwachstellen relativ selten, obwohl sie im Quellcode leicht zu entdecken sind.

Heap-Overflows [6] machen sich spezifische Eigenschaften verschiedener Compiler beim Reservieren und Freigeben von Datenbereichen zu Nutze. Man kann durch geschickte Wahl der Parameter gezielt Datenbereiche mit beliebigem Code überschreiben und ausführen. Heap-Overflows sind schwer zu finden und auszunutzen, deshalb existieren auch nur wenige Exploits. Allerdings kann man damit Abwehrmaßnahmen auf Systemen umgehen, die den Stack mit speziellen Programmen überwachen und schützen, um zum Beispiel Buffer-Overflows ins Leere laufen zu lassen. Der Kreativität der Angreifer ist offenbar keine Grenze gesetzt. Auch das Appellieren an Entwickler sichere Programme zu schreiben, trägt keine Früchte. Der Anwender ist daher gezwungen seine Systeme selbst zu schützen. Wie das aussehen kann und welche Maßnahmen man ergreifen kann, wird in einem Folgeartikel erklärt.

[1] Smashing the Stack for Fun and Profit, Aleph One

[2] Buffer Overflows und Format Strings, Linuxfocus.org

[3] FAQ über BufferOverflows, GCF

[4] Tutorial über Format Strings, Team Teso

[5] Paper über Format Strings, Avaya Labs

[6] Tutorial über Heap Overflows, w00w00 (dab)