Double Free
Basic Information
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 dessa memória, o que pode causar problemas de segurança ou até mesmo permitir que ele execute código.
Example:
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:
Exemplos
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 nuloAgora o campo de tamanho de
B
é0x100
, em vez de0x111
, então podemos liberá-lo novamenteTemos um Tcache-bin de tamanho
0x110
e um de tamanho0x100
que apontam para o mesmo endereço. Portanto, temos um double free.Aproveitamos o double free usando Tcache poisoning
Referências
Last updated