O que é use-after-free
Use-after-free é o acesso a uma região de memória depois que o programa a liberou. O código continua com o endereço e o utiliza como se o conteúdo ainda estivesse válido. O efeito depende do que ocupa aquela região no momento do acesso.
A falha aparece em código que gerencia a memória manualmente. Um objeto é liberado, e outra parte do programa mantém uma referência a ele. Quando essa referência é usada, o resultado pode ser desde um valor incorreto até o encerramento do processo.
Como a falha aparece
O caminho comum envolve uma condição de erro. O programa libera um recurso e segue adiante sem limpar a referência. Outra função, mais tarde, tenta ler ou gravar no mesmo endereço.
Em um servidor, a região liberada pode ser reutilizada por outra requisição. Se o programa volta a acessá-la, o conteúdo pode pertencer a outra operação. Essa reutilização explica por que o defeito é difícil de reproduzir em um teste simples.
O que um relatório mostra
O AddressSanitizer interrompe o programa ao detectar o acesso inválido e apresenta duas pilhas: a da liberação e a do uso. O relatório permite localizar a função que liberou a memória e o caminho que voltou a utilizá-la.
Um relatório de acesso inválido não demonstra execução remota. Ele demonstra que o programa leu ou gravou em uma região que já não pertencia a ele. A demonstração de execução exige comprovar também o controle do fluxo.
Por que não equivale a execução remota
A execução remota exige que o atacante controle o que o programa executa. O use-after-free cria uma condição que pode levar a esse controle, mas o caminho depende do conteúdo da memória reutilizada e das proteções do ambiente.
Relatórios de laboratório precisam indicar o resultado observado. Um encerramento de processo é diferente de um acesso indevido e de uma execução de código. Tratar os três como o mesmo resultado distorce a avaliação.
Como reduzir a ocorrência
Defina a propriedade de cada região de memória e limpe a referência depois da liberação. Use abstrações que acompanhem o ciclo de vida do objeto. Execute os testes com sanitizadores e inclua os caminhos de erro, que costumam concentrar esse tipo de falha.
A memória do processo e o bug original precisam ser examinados juntos. Para investigar uma falha nativa com relatório de memória, o Desenvolvimento Colaborativo da Dev Side Studio permite revisar o código e a execução durante a sessão.
Dúvidas frequentes
Perguntas frequentes sobre Use-after-free
- Todo use-after-free permite execução remota?
- Não. O acesso à memória liberada pode causar falha, leitura indevida ou comportamento imprevisível. A execução de código depende do conteúdo da memória e do controle sobre o fluxo do programa.
- O que o AddressSanitizer mostra?
- Mostra o acesso inválido, a pilha da liberação e a pilha do uso. O relatório permite localizar a região e o caminho que levou ao acesso.
- Como evitar a falha?
- Defina o dono de cada região de memória, use referências que acompanhem o ciclo de vida e execute testes com sanitizadores. A revisão do código também precisa conferir os caminhos de erro.
- A falha é exclusiva de C e C++?
- Aparece com mais frequência em código com gerenciamento manual de memória, como C e C++. Linguagens com coleta automática podem apresentar falhas equivalentes em bibliotecas nativas.
Para continuar
Recursos relacionados
Documentação
MITRE: CWE-416, uso após liberação
Descreve a fraqueza, os efeitos possíveis e as recomendações de mitigação.
Abrir recursoDocumentação
AddressSanitizer
Explica o detector de memória e como interpretar o relatório de acesso inválido.
Abrir recursoAplicação na formação
Formação DevOps
A falha aparece em componentes nativos e exige leitura do relatório antes de concluir o alcance.
Conhecer a formação
Fontes consultadas
Referências deste verbete
Este verbete ajudou você?
Obrigado pela resposta. Ela fica salva apenas neste navegador.