Prevención de ejecución de datos

La prevención de ejecución de datos (DEP) es una característica de protección de memoria de nivel de sistema integrada en el sistema operativo a partir de Windows XP y Windows Server 2003. DEP permite al sistema marcar una o varias páginas de memoria como no ejecutables. Marcar las regiones de memoria como no ejecutables significa que el código no se puede ejecutar desde esa región de memoria, lo que dificulta la explotación de saturaciones del búfer.

DEP impide que el código se ejecute desde páginas de datos, como el montón predeterminado, las pilas y los grupos de memoria. Si una aplicación intenta ejecutar código desde una página de datos protegida, se produce una excepción de infracción de acceso a memoria y, si la excepción no se controla, se finaliza el proceso de llamada.

DEP no está pensado para ser una defensa integral contra todas las vulnerabilidades de seguridad; está pensado para ser otra herramienta que puede usar para proteger la aplicación.

Funcionamiento de la prevención de ejecución de datos

Si una aplicación intenta ejecutar código desde una página protegida, la aplicación recibe una excepción con el código de estado STATUS_ACCESS_VIOLATION. Si la aplicación debe ejecutar código desde una página de memoria, debe asignar y establecer los atributos de protección de memoria virtual adecuados. La memoria asignada debe marcarse PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE o PAGE_EXECUTE_WRITECOPY al asignar memoria. Las asignaciones de montón realizadas mediante una llamada a las funciones malloc y HeapAlloc no son ejecutables.

Las aplicaciones no pueden ejecutar código desde el montón de procesos predeterminado ni la pila.

DEP se configura en el arranque del sistema según la configuración de directiva de protección de páginas sin ejecutar en los datos de configuración de arranque. Una aplicación puede obtener la configuración de directiva actual llamando a la función GetSystemDEPPolicy . Según la configuración de directiva, una aplicación puede cambiar la configuración de DEP para el proceso actual mediante una llamada a la función SetProcessDEPPolicy .

Consideraciones sobre la programación

Una aplicación puede usar la función VirtualAlloc para asignar memoria ejecutable con las opciones de protección de memoria adecuadas. Se recomienda que una aplicación establezca, como mínimo, la opción de protección de memoria PAGE_EXECUTE . Una vez generado el código ejecutable, se recomienda que la aplicación establezca protecciones de memoria para no permitir el acceso de escritura a la memoria asignada. Las aplicaciones pueden impedir el acceso de escritura a la memoria asignada mediante la función VirtualProtect . No permitir el acceso de escritura garantiza la máxima protección para las regiones ejecutables del espacio de direcciones del proceso. Debe intentar crear aplicaciones que usen el espacio de direcciones ejecutables más pequeño posible, lo que minimiza la cantidad de memoria expuesta a la explotación de memoria.

También debe intentar controlar el diseño de la memoria virtual de la aplicación y crear regiones ejecutables. Estas regiones ejecutables deben encontrarse en un espacio de memoria inferior a las regiones que no son ejecutables. Al buscar regiones ejecutables debajo de regiones que no son ejecutables, puede ayudar a evitar que un desbordamiento de búfer se desborde en el área ejecutable de la memoria.

Compatibilidad de aplicaciones

Algunas funcionalidades de la aplicación no son compatibles con DEP. Las aplicaciones que realizan la generación dinámica de código (como la generación de código Just-In-Time) y no marcan explícitamente el código generado con el permiso de ejecución pueden tener problemas de compatibilidad en los equipos que usan DEP. Las aplicaciones escritas en la versión 7.1 de la Biblioteca de plantillas activas (ATL) y anteriores pueden intentar ejecutar código en páginas marcadas como no ejecutables, lo que desencadena un error de NX y finaliza la aplicación; para obtener más información, vea SetProcessDEPPolicy. La mayoría de las aplicaciones que realizan acciones incompatibles con DEP deben actualizarse para funcionar correctamente.

Un pequeño número de archivos ejecutables y bibliotecas puede contener código ejecutable en la sección de datos de un archivo de imagen. En algunos casos, las aplicaciones pueden colocar pequeños segmentos de código (normalmente denominados thunks) en las secciones de datos. Sin embargo, DEP marca secciones del archivo de imagen que se cargan en memoria como no ejecutables a menos que la sección tenga aplicado el atributo ejecutable.

Por lo tanto, el código ejecutable de las secciones de datos debe migrarse a una sección de código o la sección de datos que contiene el código ejecutable debe marcarse explícitamente como ejecutable. El atributo ejecutable, IMAGE_SCN_MEM_EXECUTE, debe agregarse al campo Características del encabezado de sección correspondiente para las secciones que contienen código ejecutable. Para obtener más información sobre cómo agregar atributos a una sección, consulte la documentación incluida con el enlazador.

Prevención de ejecución de datos

Cómo configurar la protección de memoria en Windows XP SP2