Los errores de corrupción de memoria

Cuando hablamos de errores de corrupción de memoria, lo primero que se nos viene a la cabeza es el clásico buffer overflow, lo cual tiene mucho sentido ya que, aunque algunos lo llamaban la vulnerabilidad de la década allá por el año 2000, a día de hoy sigue ocupando la tercera posición en el ranking MITRE de errores de software más peligrosos.

Sin embargo, la corrupción de memoria abarca todo tipo de alteración involuntaria que se produce en el contenido de una o varias direcciones de memoria, como sucede al operar con un array fuera de sus límites. Por otra parte, dentro de los errores de corrupción de memoria también se incluyen aquellos que producen comportamientos indefinidos o revelación de información al hacer un uso indebido de la propia memoria. Todos estos errores comúnmente se clasifican en dos tipos: espaciales y temporales.

Los errores espaciales son violaciones causadas al operar con un puntero que apunta a una dirección fuera de los límites, superiores o inferiores, de su referente. El buffer overflow/underflow se encuentra en esta categoría puesto que cualquier tipo de operación que resulte en un acceso de memoria fuera de los límites se considera un error espacial.

Los errores temporales se caracterizan por ser causados por el uso de un puntero cuyo referente no es un objeto válido debido a que no ha sido inicializado o ha sido liberado anteriormente (mediante una operación free). Los ejemplos más claros son el use-after-free, en el que se incluyen el double-free y la desreferencia de dangling pointers, y por otro lado el use-before-initialization, como son las lecturas no inicializadas.

Como se ha podido ver en la serie de hardening de binarios de este mismo blog, existen y se siguen desarrollando numerosas soluciones que tratan de mitigar este tipo de errores, ya que desencadenar un error de corrupción de memoria es el primer paso que toman gran cantidad de exploits.

Oscar Llorente
Acerca de
Investigador de DT
Expertise: Scam, program analysis