Use-After-Free (UAF) ist eine Schwachstelle im Kontext der falschen Verwendung von dynamischem Speicher während der Programmausführung. Wenn ein Programm nach dem Freigeben eines Speicherplatzes den Pointer auf diesen Speicher nicht löscht, kann ein Angreifer diesen Fehler nutzen, um das Programm zu hacken.
UAF-Schwachstellen sind auf den Mechanismus der dynamischen Speicherzuweisung zurückzuführen. Im Gegensatz zum Stack ist der dynamische Speicher (auch als Heap bekannt) für die Speicherung großer Datenmengen ausgelegt. Programmierer können ihm Blöcke beliebiger Größe zuweisen, die Tasks innerhalb eines Programms dann entweder ändern oder freigeben und an den Heap zurückgeben können zur späteren Verwendung durch andere Tasks desselben Programms.
Da dynamischer Speicher immer wieder neu zugewiesen wird, müssen Programme wiederholt überprüfen, welche Bereiche des Heaps frei und welche belegt sind. Dabei helfen Header, indem sie auf zugewiesene Speicherbereiche verweisen. Jeder Header enthält die Anfangsadresse des entsprechenden Blocks. UAF-Fehler entstehen, wenn Programme diese Header nicht richtig verwalten.
Dies geschieht folgendermaßen. Pointer in einem Programm verweisen auf Datensätze im dynamischen Speicher. Wenn ein Datensatz gelöscht oder in einen anderen Block verschoben wird, der Pointer aber nicht gelöscht (auf nul„ gesetzt) wird, sondern weiterhin auf den nun freien Speicher verweist, entsteht ein „Dangling Pointer„. Wenn das Programm dann denselben Speicherbereich einem anderen Objekt zuweist (z. B. Daten, die von einem Angreifer eingegeben wurden), verweist der „Dangling Pointer“ nun auf diesen neuen Datensatz. Mit anderen Worten: UAF-Schwachstellen ermöglichen das Ersetzen von Daten, welche dann im vorgesehenen Code verwendet werden.
Mögliche Folgen der Ausnutzung von UAF sind:
- Beschädigung von Daten
- Programmabstürze
- Willkürliche Codeausführung