„Heap Overflow“ – Versionsunterschied
[ungesichtete Version] | [ungesichtete Version] |
Keine Bearbeitungszusammenfassung |
→Beispiel: Vereinfacht; Kommentar korrigiert (off-by-one); strncpy nicht als "gutes" Beispiel anführen |
||
Zeile 10: | Zeile 10: | ||
#define BUFSIZE 128 |
#define BUFSIZE 128 |
||
char * |
|||
int main(int argc, char** argv) { |
|||
copy_string(const char *s) |
|||
⚫ | |||
char *buf = malloc(BUFSIZE); /* Annahme: Längere Strings kommen niemals vor */ |
|||
⚫ | |||
char* buf=malloc(BUFSIZE); |
|||
return buf; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
return 0; |
|||
} |
} |
||
</code> |
</code> |
||
Man sollte lieber folgendes verwenden: |
Man sollte lieber folgendes verwenden: |
||
<code> |
<code> |
||
char *buf; |
|||
strncpy(buf, argv[1], BUFSIZE); |
|||
⚫ | |||
buf[BUFSIZE-1] = '\0'; /* Falls strlen(argv[1]) >= BUFSIZE war, fügt strncpy kein terminiertendes Nullbyte an. */ |
|||
buf = malloc(1 + strlen(s)); /* Plus 1 wegen des terminierenden NUL-Zeichens */ |
|||
strcpy(buf, s); |
|||
</code> |
</code> |
||
Einige Betriebssysteme, z. B. [[OpenBSD]], bieten eine Funktion ''strlcpy'' an, die sicherstellt, dass der Zielstring nullterminiert wird und das Erkennen eines abgeschnittenen Zielstrings vereinfacht. |
Einige Betriebssysteme, z. B. [[OpenBSD]], bieten eine Funktion ''strlcpy'' an, die sicherstellt, dass der Zielstring nullterminiert wird und das Erkennen eines abgeschnittenen Zielstrings vereinfacht. |
||
== Weblinks == |
== Weblinks == |
Version vom 2. Juni 2005, 20:00 Uhr
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 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 Overflows 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 Overflow, 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 eine Funktion strlcpy an, die sicherstellt, dass der Zielstring nullterminiert wird und das Erkennen eines abgeschnittenen Zielstrings vereinfacht.