Double Free
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Se você liberar um bloco de memória mais de uma vez, isso pode bagunçar os dados do alocador e abrir a porta para ataques. Veja como isso acontece: quando você libera um bloco de memória, ele volta para uma lista de blocos livres (por exemplo, o "fast bin"). Se você liberar o mesmo bloco duas vezes seguidas, o alocador detecta isso e gera um erro. Mas se você liberar outro bloco no meio, a verificação de double-free é contornada, causando corrupção.
Agora, quando você pede nova memória (usando malloc
), o alocador pode lhe dar um bloco que foi liberado duas vezes. Isso pode levar a dois ponteiros diferentes apontando para o mesmo local de memória. Se um atacante controla um desses ponteiros, ele pode alterar o conteúdo daquela memória, o que pode causar problemas de segurança ou até mesmo permitir que ele execute código.
Exemplo:
Neste exemplo, após preencher o tcache com vários chunks liberados (7), o código libera o chunk h
, depois o chunk i
, e então h
novamente, causando um double free (também conhecido como Fast Bin dup). Isso abre a possibilidade de receber endereços de memória sobrepostos ao realocar, significando que dois ou mais ponteiros podem apontar para a mesma localização de memória. Manipular dados através de um ponteiro pode então afetar o outro, criando um risco crítico de segurança e potencial para exploração.
Executando, note como i1
e i2
obtiveram o mesmo endereço:
Podemos alocar apenas chunks do tamanho Fast-Bin, exceto para o tamanho 0x70
, o que impede a sobrescrita usual de __malloc_hook
.
Em vez disso, usamos endereços PIE que começam com 0x56
como alvo para Fast Bin dup (1/2 de chance).
Um lugar onde os endereços PIE são armazenados é em main_arena
, que está dentro do Glibc e perto de __malloc_hook
.
Alvo um deslocamento específico de main_arena
para alocar um chunk lá e continuar alocando chunks até alcançar __malloc_hook
para obter execução de código.
Usando bins Tcache e um overflow de byte nulo, podemos alcançar uma situação de double-free:
Alocamos três chunks de tamanho 0x110
(A
, B
, C
)
Liberamos B
Liberamos A
e alocamos novamente para usar o overflow de byte nulo
Agora o campo de tamanho de B
é 0x100
, em vez de 0x111
, então podemos liberá-lo novamente
Temos um Tcache-bin de tamanho 0x110
e um de tamanho 0x100
que apontam para o mesmo endereço. Portanto, temos um double free.
Aproveitamos o double free usando Tcache poisoning
Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)