Zum Inhalt springen

„Heap Overflow“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[ungesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
warum sollte das umleiten?
redirect (Information momentan komplett doppelt, siehe Diskussion:Pufferüberlauf#Heap_Overflow)
 
Zeile 1: Zeile 1:
#redirect [[Pufferüberlauf]]
Ein '''Heap-Überlauf''' (''heap overflow'') ist ein [[Pufferüberlauf]], der auf dem [[Dynamischer Speicher|Heap]] stattfindet. Speicher auf dem Heap wird zugewiesen, wenn Programme dynamischen Speicher anfordern, etwa über malloc() oder den ''new''-Operator in [[C-Plusplus|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 (Programmiersprache)|C]], [[C-Plusplus|C++]] oder [[Assemblersprache|Assembler]] sind anfällig, [[Java (Programmiersprache)|Java]] oder [[Perl (Programmiersprache)|Perl]] sind es nicht.

''siehe auch'': [[Shellcode]], [[Exploit]]

== Beispiel ==

<code>
#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;
}
</code>

Man sollte lieber folgendes verwenden:

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

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

== Weblinks ==
* http://www.w00w00.org/files/articles/heaptut.txt

[[en:Heap overflow]]
[[Kategorie:Sicherheitslücken]]
[[Kategorie:Programmierung]]

Aktuelle Version vom 20. Dezember 2005, 19:48 Uhr

Weiterleitung nach: