ASLR ( aleatorización del diseño del espacio de direcciones - " aleatorización del diseño del espacio de direcciones ") es una tecnología utilizada en los sistemas operativos , que cambia aleatoriamente la ubicación en el espacio de direcciones de un proceso de estructuras de datos importantes, a saber, imágenes de archivos ejecutables , bibliotecas cargables , montones y pilas .
ASLR está diseñado para dificultar la explotación de varios tipos de vulnerabilidades . Por ejemplo, si un atacante obtiene la capacidad de transferir el control a una dirección arbitraria mediante un desbordamiento de búfer u otro método, deberá adivinar en qué dirección se puede colocar la pila, el montón u otras estructuras de datos en Shellcode . Surgirán problemas similares con un ataque de retorno a libc: el atacante no sabrá la dirección donde se carga la biblioteca. En los ejemplos anteriores, las direcciones específicas están ocultas para el atacante y, si no se puede adivinar la dirección correcta, es probable que la aplicación se bloquee, privando así al atacante de la oportunidad de volver a atacar y atrayendo la atención del administrador del sistema .
Los desarrolladores de OpenBSD estuvieron entre los primeros en implementar ASLR. ASLR está habilitado de forma predeterminada.
El kernel de Linux ha tenido una variante simple de ASLR desde 2005 (desde la versión 2.6.12). Se ofrecen variantes de ASLR más complejas y completas como parches ( PaX , ExecShield, etc.). En las distribuciones que incluyen la palabra "endurecido" en sus nombres, así como en las versiones modernas de la distribución de Ubuntu , las variantes duras están habilitadas de manera predeterminada.
Para que ASLR funcione (para colocar archivos ejecutables en la memoria en direcciones aleatorias), los archivos ejecutables deben compilarse en modo ejecutable independiente de la posición (un tipo de código independiente de la posición para archivos ejecutables).
En Windows , ASLR ha sido compatible desde Windows Vista (2007) [1] para archivos ejecutables y bibliotecas creadas con indicadores especiales.
ASLR también es compatible con versiones posteriores de Windows , como Windows Server 2008 , Windows 7 , Windows Server 2008 R2 , Windows 8 , Windows 8.1 , Windows 10 .
ASLR no se usa para aplicaciones creadas sin marcas especiales y cuando se ejecuta en modo de compatibilidad para versiones anteriores de Windows.
En Windows XP y Windows Server 2003 , ASLR se puede habilitar para cualquier aplicación seleccionada utilizando Microsoft EMET [2] (kit de herramientas de experiencia de mitigación mejorada).
Se agregó algo de aleatoriedad en la carga de la biblioteca en Mac OS X v10.5 Leopard (2007) [3] . En OS X 10.8 Mountain Lion (2012), ASLR es parte del kernel del sistema [4] .
iOS ha estado usando la tecnología ASLR desde la versión 4.3 [5] . Para kernel, usado desde iOS 6 [6] .
ASLR es un compromiso entre mayor seguridad y menor almacenamiento privado disponible de 24 bits, 31 bits y 64 bits. Habilitar el almacenamiento virtual de 24 y 31 bits reducirá el almacenamiento privado disponible a 63 y 255 páginas, respectivamente. El tamaño del área de trabajo solicitado aún debe satisfacerse desde el área privada reducida para que se ejecute el trabajo. Los trabajos cuyo tamaño de alcance no se puede satisfacer darán como resultado un error ABEND 822. Si el tamaño de alcance solicitado del trabajo satisface, es posible que el tamaño de almacenamiento privado reducido impida que el trabajo se complete, lo que genera el error ABEND 878.
Una forma de determinar si los trabajos no se pueden ejecutar con el límite de tamaño de almacenamiento privado de 24 o 31 bits que ocurrirá con ASLR habilitado es especificar un valor mayor para el parámetro CSA en parmlib. Aumentar los tamaños de CSA de 24 y 31 bits en 1 millón reduce efectivamente el tamaño del almacenamiento privado de 24 y 31 bits en 1 millón, que es más que la reducción máxima que ocurrirá con ASLR [7] .
Para usar ASLR, los ejecutables deben construirse con banderas especiales. Como resultado, las direcciones permanentes no se utilizarán en el código, pero al mismo tiempo:
Además, la protección se puede omitir mediante el agotamiento de la memoria [8] o los métodos Heap Spray [9] .