sábado, 20 de abril de 2013

Force ASLR - Trasladando forzosamente la ImageBase

Si ASLR (Address Space Layout Randomization) se introdujo como un nuevo sistema de mitigación de ataques al sistema operativo Windows Vista (sí también a Linux y otros), con la aparición de Windows 7 y Windows Server 2008 R2 Microsoft ha querido fortificar aún más esta técnica mediante una actualización que incorpora lo que han denominado como "Force ASLR" algo así como ASLR Forzoso u obligatorio.

Con ASLR, el sistema operativo lo que persigue es aleatorizar o trasladar el espacio de direcciones de las librerías y aplicaciones con cada reinicio, de tal forma, que no sea predecible la ubicación de su dirección base. Como consecuencia, averiguar por ejemplo, la dirección de una determinada API del sistema o porción de código de una aplicación ya no es tan trivial (que no imposible).

Esta característica está activada por defecto en la mayor parte de las librerías del sistema operativo y, en bastantes programas siempre y cuando el desarrollador active el flag /DYNAMICBASE en el momento del "linkado".

Aquí aparece el primer "punto débil" de ASLR, ya que, debe ser el desarrollador el que decida si activarlo o no. Ahora bien, esto dependerá del entorno de desarrollo utilizado, ya que por ejemplo con Visual Studio 2008 en adelante, estará activado por defecto, no así con otros compiladores.

Bien, dicho esto sobre ASLR, aparece en acción "Force ASLR" con el fin de proteger aquellas librerías o programas cuya característica o flag /DINAMICBASE no está activado.

Con esta actualización, tenemos a nuestra disposición una nueva clave en el registro de windows:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\

En esa sub-clave podemos crear una nueva entrada por cada programa o módulo que queramos proteger. Para ello, tan solo hay que añadir una nueva clave con el nombre de imagen exacto del programa (Botón derecho/Nueva clave). A continuación deberemos añadirle a esa clave un nuevo valor de tipo QWORD (Botón derecho/Nuevo/Valor QWORD) y lo renombramos como: MitigationOptions.

A esta nueva entrada la podemos asignar uno de los valores siguientes:
  •  0x000 : No asignado
  •  0x100 : Aleatorización activada
  •  0x200 : Aleatorización explícitamente desactivada
  •  0x300 : Aleatorización activada con fallo de carga del módulo
En el primer caso (0x000), se indica de manera explícita que "Force ASLR" no ha sido asignado.

En el segundo caso, el valor 0x100, indica que se active ASLR para el módulo indicado, pero debemos tener en cuenta que solamente se aplicará la aleatorización del espacio de direcciones, en el caso de que el módulo disponga de la "Relocation Table", en caso contrario, el módulo será cargado, si procede, en la dirección indicada en su campo "ImageBase"

En el tercer caso (0x200) se indica de manera explícita que "Force ASLR" ha sido desactivado para ese módulo concreto.

Y finalmente, el último valor (0x300) activa ASLR al igual que el valor 0x100), pero en esta ocasión si el módulo no dispone de la tabla de reubicaciones (Relocation Table), en lugar de cargarlo en su "ImageBase", se producirá un error de carga.

En cualquier caso indicaros que hay herramientas (EMET) que permiten utilizar todo esto sin necesidad de manipular de forma manual el registro de windows, lo cual, como sabéis puede tener consecuencias catastróficas para el sistema operativo y/o el resto del software.

ADVERTENCIA: Modificar estos valores puede hacer que ciertos programas funcionen de manera anómala, tened en cuenta que si en algún programa hacen "uso directo" de las direcciones de memoria "pre-supuestas" y activamos "Force ASLR" estas obviamente cambiaran.

No hay comentarios:

Publicar un comentario