Reino: Code Quality

Una mala calidad del código lleva a un comportamiento no predecible. Desde la perspectiva de un usuario, muchas veces también supone una usabilidad limitada. Pero para un atacante es una oportunidad para atacar al sistema de formas insospechadas.

Double Free

Abstract
Llamar dos veces a free() en la misma dirección de memoria puede provocar un buffer overflow.
Explanation
Los errores de doble liberación se producen cuando se llama a free() más de una vez con la misma dirección de memoria como argumento.



Al llamar a free() dos veces con el mismo valor, se puede producir un buffer overflow. Si un programa llama a free() dos veces con el mismo argumento, las estructuras de datos de administración de memoria del programa se dañan. Esto puede provocar que el programa se bloquee o, en algunas circunstancias, que se realicen dos llamadas posteriores a malloc() para devolver la misma referencia. Si malloc() devuelve el mismo valor dos veces y el programa concede posteriormente al usuario malintencionado control de los datos escritos en la memoria que se ha asignado dos veces, el programa será vulnerable a un ataque de buffer overflow.

Ejemplo 1: en el siguiente código se muestra un sencillo ejemplo de una vulnerabilidad de doble liberación.


char* ptr = (char*)malloc (SIZE);
...
if (abrt) {
free(ptr);
}
...
free(ptr);


Las vulnerabilidades de doble liberación presentan dos causas habituales (que a veces se superponen):

- Condiciones de error y otras circunstancias excepcionales.

- Confusión en cuanto a la parte del programa responsable de liberar la memoria.

Aunque algunas vulnerabilidades de doble liberación no son mucho más complicadas de las que se indican en el ejemplo anterior, la mayoría se han dispersado en cientos de líneas de código o incluido en diferentes archivos. Los programadores parecen especialmente susceptibles a liberar variables globales más de una vez.
References
[1] J. Koziol et al. The Shellcoder's Handbook: Discovering and Exploiting Security Holes John Wiley & Sons
desc.controlflow.cpp.double_free