Ein Heap Overflow ist ein Buffer Overflow der auf dem Heap stattfindet. Speicher auf dem Heap wird allokiert wenn Programme dynamischen Speicher anfordern, etwa über malloc() oder den C++ new Operator. Werden in einen Puffer auf dem Heap Daten ohne Überprüfung der Länge geschrieben, kommt es zu einem Speicherüberlauf.
Durch Heap Overflows kann meist beliebiger Code auf dem Rechner ausgeführt werden, ins besondere 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.
Beispiel
#define BUFSIZE 128 int main(int argc, char** argv) { char* buf=malloc(BUFSIZE); /* ... */ strcpy(buf, argv[1]); /* Heap Overflow */ return 0; }
Man sollte lieber folgendes verwenden:
strncpy(buf. argv[1], BUFSIZE-1);