Zum Inhalt springen

Heap Overflow

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 2. Dezember 2005 um 11:44 Uhr durch Stern (Diskussion | Beiträge) (warum sollte das umleiten?). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Ein Heap-Überlauf (heap overflow) ist ein Pufferüberlauf, der auf dem Heap stattfindet. Speicher auf dem Heap wird zugewiesen, wenn Programme dynamischen Speicher anfordern, etwa über malloc() oder den new-Operator in C++. Werden in einen Puffer auf dem Heap Daten ohne Überprüfung der Länge geschrieben und ist die Datenmenge größer als die Größe des Puffers, so wird über das Ende des Puffers hinausgeschrieben und es kommt zu einem Speicherüberlauf.

Durch Heap-Überläufe kann meist beliebiger Code auf dem Rechner ausgeführt werden, insbesondere wenn der Heap ausführbar ist. FreeBSD hat z.B. einen Heap-Schutz, hier ist dies nicht möglich. Sie können nur in Programmiersprachen auftreten, in denen bei Pufferzugriffen keine Längenüberprüfung stattfindet. C, C++ oder Assembler sind anfällig, Java oder Perl sind es nicht.

siehe auch: Shellcode, Exploit

Beispiel

#define BUFSIZE 128

char * copy_string(const char *s)
{
    char * buf = malloc(BUFSIZE); /* Annahme: Längere Strings kommen niemals vor */

    strcpy(buf, s); /* Heap-Überlauf, falls strlen(s) > 127 */

    return buf;
}

Man sollte lieber folgendes verwenden:

char * buf;

buf = malloc(1 + strlen(s)); /* Plus 1 wegen des terminierenden NUL-Zeichens */
strcpy(buf, s);

Einige Betriebssysteme, z. B. OpenBSD, bieten die Funktion strlcpy an, die sicherstellt, dass der Zielstring nullterminiert wird und das Erkennen eines abgeschnittenen Zielstrings vereinfacht.