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 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