Articulo de referencia

Corrupción de memoria

La corrupción de memoria ocurre en un programa informático cuando el contenido de una ubicación de memoria se modifica debido a un comportamiento programático que excede la inte...

La corrupción de memoria ocurre en un programa informático cuando el contenido de una ubicación de memoria se modifica debido a un comportamiento programático que excede la intención del programador original o las construcciones del programa/lenguaje; esto se denomina violación de la seguridad de la memoria . Las causas más probables de corrupción de memoria son los errores de programación (fallos de software). Cuando el contenido de memoria corrupta se utiliza posteriormente en ese programa, provoca un fallo del programa o un comportamiento extraño y anómalo del mismo. Casi el 10 % de los fallos de las aplicaciones en sistemas Windows se deben a la corrupción del montón . [ 1 ]

Los lenguajes de programación modernos como C y C++ cuentan con potentes funciones de gestión explícita de memoria y aritmética de punteros . Estas funciones están diseñadas para desarrollar aplicaciones y software de sistema eficientes. Sin embargo, su uso incorrecto puede provocar errores de corrupción de memoria.

La corrupción de memoria es uno de los tipos de errores de programación más difíciles de solucionar, por dos razones:

  1. El origen de la corrupción de la memoria y su manifestación pueden estar muy alejados, lo que dificulta correlacionar la causa y el efecto.
  2. Los síntomas aparecen en condiciones inusuales, lo que dificulta reproducir el error de forma consistente.

Los errores de corrupción de memoria se pueden clasificar a grandes rasgos en cuatro categorías:

  1. Uso de memoria no inicializada : El contenido de la memoria no inicializada se trata como valores basura. El uso de dichos valores puede provocar un comportamiento impredecible del programa.
  2. Uso de memoria no asignada: Es común usar punteros para acceder y modificar la memoria. Si un puntero es nulo, colgante (apunta a memoria que ya ha sido liberada) o a una ubicación de memoria fuera de los límites de la pila o el montón , se refiere a memoria que el programa no posee. El uso de estos punteros constituye un grave error de programación. Acceder a dicha memoria suele provocar excepciones del sistema operativo, que generalmente resultan en el bloqueo del programa (a menos que se utilice un software de protección de memoria adecuado).
  3. Desbordamiento de búfer : Si se utiliza un array en un bucle con una condición de terminación incorrecta, se puede manipular accidentalmente memoria fuera de los límites del array. El desbordamiento de búfer es una de las vulnerabilidades de programación más comunes explotadas por virus informáticos, lo que provoca graves problemas de seguridad (por ejemplo , ataques de retorno a libc y protección contra la manipulación de la pila ) en programas de uso generalizado. En algunos casos, los programas también pueden acceder incorrectamente a la memoria antes del inicio del búfer.
  4. Gestión defectuosa de la memoria del montón: Las fugas de memoria y la liberación de memoria que no pertenece al montón o que no está asignada son los errores más frecuentes causados ​​por una gestión defectuosa de la memoria del montón.

Existen numerosos depuradores de memoria , como Purify , Valgrind , Insure++ , Parasoft C/C++test y AddressSanitizer , disponibles para detectar errores de corrupción de memoria.

Véase también

Referencias

  1. Radich, Q.; Sherer, T.; Sharkey, K.; Batchelor, D.; Kennedy, JT; Mabee, D.; Coulter, D.; Michael, S. (28 de abril de 2021). "Application Verifier (Windows 7 and Windows Server 2008 R2 Application Quality Cookbook) - Win32 apps" . Microsoft Developer Network . Consultado el 9 de febrero de 2022 .
  • Tutorial sobre corrupción de memoria: Introducción a las técnicas de explotación y los mecanismos de protección.