Reino: Code Quality
Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.
Double Free
Abstract
Chamar
free()
duas vezes no mesmo endereço de memória pode resultar em um buffer overflow.Explanation
Erros de liberação dupla ocorrem quando
Chamar
Exemplo 1: O código a seguir mostra um exemplo simples de uma vulnerabilidade de liberação dupla.
Vulnerabilidades de liberação dupla têm duas causas em comum (e algumas vezes sobrepostas):
- Condições de erro e outras circunstâncias excepcionais.
- Confusão acerca de qual parte do programa é responsável por liberar a memória.
Embora algumas vulnerabilidades de liberação dupla não sejam muito mais complicadas do que o exemplo anterior, a maioria se dispersa entre centenas de linhas de código ou até mesmo arquivos diferentes. Programadores parecem particularmente susceptíveis a liberar variáveis globais mais de uma vez.
free()
é chamado mais de uma vez com o mesmo endereço de memória que um argumento.Chamar
free()
duas vezes no mesmo valor pode resultar em um buffer overflow. Quando um programa chama free()
duas vezes com o mesmo argumento, as estruturas de dados de gerenciamento de memória desse programa se tornam corrompidas. Essa corrupção pode fazer com que o programa trave ou, em algumas circunstâncias, com que duas chamadas posteriores para malloc()
retornem o mesmo apontador. Se malloc()
retornar o mesmo valor duas vezes, e, mais tarde, o programa der ao invasor controle sobre os dados que são gravados nessa memória duplamente alocada, o programa se tornará vulnerável a um ataque de buffer overflow.Exemplo 1: O código a seguir mostra um exemplo simples de uma vulnerabilidade de liberação dupla.
char* ptr = (char*)malloc (SIZE);
...
if (abrt) {
free(ptr);
}
...
free(ptr);
Vulnerabilidades de liberação dupla têm duas causas em comum (e algumas vezes sobrepostas):
- Condições de erro e outras circunstâncias excepcionais.
- Confusão acerca de qual parte do programa é responsável por liberar a memória.
Embora algumas vulnerabilidades de liberação dupla não sejam muito mais complicadas do que o exemplo anterior, a maioria se dispersa entre centenas de linhas de código ou até mesmo arquivos diferentes. Programadores parecem particularmente susceptíveis a liberar variáveis globais mais de uma vez.
References
[1] J. Koziol et al. The Shellcoder's Handbook: Discovering and Exploiting Security Holes John Wiley & Sons
desc.controlflow.cpp.double_free