use-after-free
termoprogramaçãosegurançahacking
Usar um ponteiro para memória que já foi liberada, de volta a quando ele ainda significava algo.
O ponteiro agora está pendurado: o alocador pode ter entregado aquele bloco a outra coisa inteiramente, então o programa está lendo ou escrevendo dados de outro objeto pela lente errada. É mais perigoso que uma simples queda porque o conteúdo é influenciável por quem ataca, se conseguir controlar o que é alocado no espaço liberado, o que faz dele um pilar da exploração moderna de navegadores e de kernel, e a razão de o duplo free ser tratado como seu irmão. As defesas são disciplina de propriedade, anular ponteiros após liberar, alocadores endurecidos e, no limite, linguagens que tornam o padrão irrepresentável. É a CWE-416.
O uso após liberação acessa memória já devolvida, momento em que o alocador pode tê-la entregue a outra coisa. O perigo não é a leitura em si, e sim que um atacante que controle o que é alocado naquele espaço controla para onde o ponteiro obsoleto agora aponta.
É mais difícil de raciocinar que um estouro porque o defeito e sua consequência estão separados no tempo e frequentemente no código. Sanitizadores o encontram em teste ao adiar o reúso e envenenar regiões liberadas, alocadores endurecidos tornam a exploração menos confiável, e nenhum dos dois o elimina. É o defeito grave de memória mais comum em bases modernas de C e C++, o que é boa parte da razão dos modelos de posse nas linguagens mais novas.
Também conhecido como: UAF, dangling pointer, CWE-416