Double Free
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Si liberas un bloque de memoria más de una vez, puede desordenar los datos del asignador y abrir la puerta a ataques. Así es como sucede: cuando liberas un bloque de memoria, vuelve a una lista de fragmentos libres (por ejemplo, el "fast bin"). Si liberas el mismo bloque dos veces seguidas, el asignador detecta esto y lanza un error. Pero si liberas otro fragmento entre medio, la verificación de doble liberación se omite, causando corrupción.
Ahora, cuando pides nueva memoria (usando malloc
), el asignador podría darte un bloque que ha sido liberado dos veces. Esto puede llevar a que dos punteros diferentes apunten a la misma ubicación de memoria. Si un atacante controla uno de esos punteros, puede cambiar el contenido de esa memoria, lo que puede causar problemas de seguridad o incluso permitirles ejecutar código.
Ejemplo:
En este ejemplo, después de llenar el tcache con varios chunks liberados (7), el código libera el chunk h
, luego el chunk i
, y luego h
nuevamente, causando un doble free (también conocido como Fast Bin dup). Esto abre la posibilidad de recibir direcciones de memoria superpuestas al reallocar, lo que significa que dos o más punteros pueden apuntar a la misma ubicación de memoria. Manipular datos a través de un puntero puede afectar al otro, creando un riesgo crítico de seguridad y potencial de explotación.
Al ejecutarlo, nota cómo i1
e i2
obtuvieron la misma dirección:
Solo podemos asignar chunks del tamaño de Fast-Bin excepto para el tamaño 0x70
, lo que impide la habitual sobrescritura de __malloc_hook
.
En su lugar, usamos direcciones PIE que comienzan con 0x56
como objetivo para Fast Bin dup (1/2 de probabilidad).
Un lugar donde se almacenan las direcciones PIE es en main_arena
, que está dentro de Glibc y cerca de __malloc_hook
.
Apuntamos a un desplazamiento específico de main_arena
para asignar un chunk allí y continuar asignando chunks hasta alcanzar __malloc_hook
para obtener ejecución de código.
Usando bins de Tcache y un desbordamiento de byte nulo, podemos lograr una situación de doble free:
Asignamos tres chunks de tamaño 0x110
(A
, B
, C
)
Liberamos B
Liberamos A
y asignamos nuevamente para usar el desbordamiento de byte nulo
Ahora el campo de tamaño de B
es 0x100
, en lugar de 0x111
, por lo que podemos liberarlo nuevamente
Tenemos un Tcache-bin de tamaño 0x110
y uno de tamaño 0x100
que apuntan a la misma dirección. Así que tenemos un doble free.
Aprovechamos el doble free usando Tcache poisoning
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)