- Double free()
-
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. Der Name leitet sich von der Funktion zur Speicherfreigabe ab, die in vielen Sprachen wie z. B. C free heißt.
Inhaltsverzeichnis
Hintergründe
Wenn ein Programm dynamischen Speicher benötigt, fordert es diesen per malloc an, danach 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 kann möglich sein das Programm auf diesen 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. 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
Da mehrfache Speicherfreigabe ein Fehler des Programmierers ist, lässt sich das Problem durch aufmerksames Programmieren und alle Vorgehensweise zum Aufspüren von Bugs finden.
Einige Programmierer setzen Zeiger nach der Speicherfreigabe auf null und prüfen an anderen Stelle, 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 (Smart Pointers) verhindern, dass Speicher freigegeben wird, auf den noch andere Zeiger referenzieren. Die Zeiger auf einen Speicherbereich werden gezählt und erst wenn der letzte Zeiger freigegeben wird, erfolgt die tatsächliche Freigabe des Speichers.
Automatische Speicherbereinigung (Garbage Collection) ist eine weitere Möglichkeit doppelte Speicherfreigaben zu vermeiden. Garbage Collection löst viele Probleme mit der händischen Speicherverwaltung, ist aber besonders bei systemnaher Programmierung und in Echzeitanwendungen unerwünscht.
Andere Programmiersprachen als C
Die Funktion free ist nur in C, C++ und verwandten Sprachen existent, in der Programmiersprache Object Pascal (Borland Delphi) beispielsweise ist GetMem() / FreeMem() die Entsprechung zum Funktionspaar malloc() / free(). Zum Freigeben von Klassen wird dort zur Vermeidung dieses Problems ironischerweise statt des Destrukturs 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
- http://www.cert.org/advisories/CA-2003-02.html – Double-free CVS Server Advisory
- http://web.mit.edu/kerberos/advisories/MITKRB5-SA-2004-002-dblfree.txt – Double-free MIT Kerberos 5 Advisory
- http://www.hackerwiki.org/index.php/Angriffe_auf_unsicher_programmierte_Signal-Handler – typisches Beispiel für die Möglichkeit eines double-free()-Angriffs
Wikimedia Foundation.