Mehrfache Deallokation
Double free() (doppelter Aufruf der Funktion free) bezeichnet einen Fehler in Computerprogrammen, wenn diese versuchen den gleichen Speicherbereich mehrmals freizugeben. Double free ist eine potentielle Sicherheitslücke.[1] Der Name leitet sich von der Funktion zur Speicherfreigabe ab, die in vielen Programmiersprachen wie z. B. C free heißt.
Hintergründe
[Bearbeiten | Quelltext bearbeiten]In einem C-Programm wird dynamischer Speicher per malloc (memory allocation) angefordert; nach der Verwendung muss er per free wieder freigegeben werden. Wenn allerdings versucht wird, einen Speicherbereich mehrfach mittels free freizugeben, kommt es bei den meisten free-Implementierungen zu nicht definiertem Verhalten. Es ist möglich, das Programm auf diesem Weg abstürzen zu lassen oder sogar an bestimmten Stellen in den Programm-Speicher zu schreiben, was zur Ausführung von beliebigem Code und Manipulation von Werten in Registern genutzt werden kann.[1] Meist werden solche Situationen erreicht, wenn innerhalb von Signalhandlern oder anderem Code, der unter bestimmten Bedingungen mehrfach benutzt werden kann, Speicher-Freigaben erfolgen.
Weitere Informationen enthält der Artikel zu Speicherlecks, bei denen die gleichen Mechanismen zu Programmierfehlern führen.
Abhilfen
[Bearbeiten | Quelltext bearbeiten]Da mehrfache Speicherfreigabe ein Fehler des Programmierers ist, lässt sich das Problem durch aufmerksames Programmieren und alle Vorgehensweisen zum Aufspüren von Bugs finden.
Einige Programmierer setzen Zeiger nach der Speicherfreigabe auf null und prüfen an anderen Stellen, ob der Pointer der Nullzeiger ist.
void *ptr; /* zeigt irgendwann auf Speicher von malloc() */
if (ptr) {
free(ptr);
ptr = NULL;
}
Allerdings behebt dieses Vorgehen nicht das Problem, wenn zwei Zeiger das gleiche Ziel haben. Wird bei einem der Speicher freigegeben und der Zeiger auf null gesetzt, so zeigt der zweite Zeiger immer noch auf den freigegebenen Speicher.
void *ptr; /* zeigt irgendwann auf Speicher von malloc() */
void *ptr2 = ptr;
if (ptr2) {
free(ptr2); /* Speicher freigegeben, auf den ptr und ptr2 zeigen */
ptr2 = NULL;
}
/* Der Speicher wurde freigegeben, ptr ist aber nicht null! */
if (ptr) {
free(ptr); /* double free trotz Test */
ptr = NULL;
}
Darüber hinaus gibt es auch Software wie Valgrind, um Speicheroperationen genauer zu untersuchen und somit bei der manuellen Suche zu unterstützen.
Intelligente Zeiger (englisch smart pointers) verhindern, dass Speicher freigegeben wird, der noch durch andere Zeiger referenziert wird. Die Zeiger auf einen Speicherbereich werden gezählt und erst wenn der letzte Zeiger freigegeben wird, erfolgt die tatsächliche Freigabe des Speichers.[2]
Automatische Speicherbereinigung (englisch garbage collection) ist eine weitere Möglichkeit, mehrfache Speicherfreigaben zu vermeiden.
Andere Programmiersprachen als C
[Bearbeiten | Quelltext bearbeiten]Die Funktion free ist nur in C, C++ (als Operator delete
) und verwandten Sprachen existent, in der Programmiersprache Object Pascal (Borland Delphi) beispielsweise ist GetMem() / FreeMem() die Entsprechung zum Funktionspaar malloc() / free(). Zum Freigeben von Objekten wird dort zur Vermeidung dieses Problems statt des Destruktors Destroy meist die Prozedur Free genutzt.
Programmiersprachen mit automatischer Speicherbereinigung wie Java oder Python kennen keine explizite Speicherfreigaben und haben deshalb auch keine Möglichkeit freigegebenen Speicher erneut freizugeben.
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Double-free CVS Server Advisory
- Double-free MIT Kerberos 5 Advisory
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ a b Doubly freeing memory. In: owasp.org. Open Web Application Security Project, abgerufen am 17. September 2023 (englisch).
- ↑ Tyler Whitney et al.: Intelligente Zeiger (Modern C++). In: learn.microsoft.com. Microsoft, 16. Juni 2023, abgerufen am 17. September 2023.