Double Free
Grundinformationen
Wenn du einen Block Speicher mehr als einmal freigibst, kann das die Daten des Allocators durcheinanderbringen und die Tür zu Angriffen öffnen. So passiert es: Wenn du einen Block Speicher freigibst, geht er zurück in eine Liste freier Blöcke (z. B. den "fast bin"). Wenn du denselben Block zweimal hintereinander freigibst, erkennt der Allocator dies und wirft einen Fehler. Aber wenn du dazwischen einen anderen Block freigibst, wird die Double-Free-Prüfung umgangen, was zu einer Beschädigung führt.
Wenn du jetzt neuen Speicher anforderst (mit malloc
), könnte der Allocator dir einen Block geben, der zweimal freigegeben wurde. Dies kann dazu führen, dass zwei verschiedene Zeiger auf denselben Speicherort zeigen. Wenn ein Angreifer einen dieser Zeiger kontrolliert, kann er den Inhalt dieses Speichers ändern, was zu Sicherheitsproblemen führen oder ihm sogar ermöglichen kann, Code auszuführen.
Beispiel:
In diesem Beispiel, nachdem der Tcache mit mehreren freigegebenen Chunks (7) gefüllt wurde, freed der Code Chunk h
, dann Chunk i
und dann h
erneut, was zu einem Double Free führt (auch bekannt als Fast Bin dup). Dies eröffnet die Möglichkeit, überlappende Speicheradressen beim Reallokieren zu erhalten, was bedeutet, dass zwei oder mehr Zeiger auf denselben Speicherort zeigen können. Das Manipulieren von Daten über einen Zeiger kann dann den anderen beeinflussen, was ein kritisches Sicherheitsrisiko und Potenzial für Ausnutzung schafft.
Beim Ausführen, beachten Sie, wie i1
und i2
die gleiche Adresse erhalten haben:
Beispiele
Wir können nur Fast-Bin-große Chunks außer der Größe
0x70
zuweisen, was das übliche__malloc_hook
Überschreiben verhindert.Stattdessen verwenden wir PIE-Adressen, die mit
0x56
beginnen, als Ziel für Fast Bin dup (1/2 Chance).Ein Ort, an dem PIE-Adressen gespeichert sind, ist in
main_arena
, das sich innerhalb von Glibc und in der Nähe von__malloc_hook
befindet.Wir zielen auf einen bestimmten Offset von
main_arena
, um dort einen Chunk zuzuweisen und weiterhin Chunks zuzuweisen, bis wir__malloc_hook
erreichen, um Codeausführung zu erhalten.Mit Tcache-Bins und einem Null-Byte-Overflow können wir eine Double-Free-Situation erreichen:
Wir weisen drei Chunks der Größe
0x110
zu (A
,B
,C
)Wir geben
B
freiWir geben
A
frei und weisen erneut zu, um den Null-Byte-Overflow zu nutzenJetzt ist das Größenfeld von
B
0x100
, anstatt0x111
, sodass wir es erneut freigeben könnenWir haben einen Tcache-Bin der Größe
0x110
und einen der Größe0x100
, die auf dieselbe Adresse zeigen. Also haben wir einen Double Free.Wir nutzen den Double Free mit Tcache poisoning
Referenzen
Last updated