2010-10-03 11 views
6

He escuchado la teoría. Address Space Location Randomization toma bibliotecas y las carga en ubicaciones aleatorias en el espacio de direcciones virtuales, de modo que en caso de que un hacker encuentre un agujero en su programa, no tenga una dirección conocida para ejecutar un ataque de retorno a la libc contra, por ejemplo. Pero después de pensarlo por unos segundos, no tiene ningún sentido como medida defensiva.¿Cómo puede ser efectivo ASLR?

Digamos que nuestra hipotética TargetLib (libc o cualquier otra cosa que el hacker está buscando) se carga en una dirección aleatorizada en lugar de una determinista. Ahora el hacker no sabe de antemano dónde están TargetLib y las rutinas dentro de él, pero tampoco lo hace el código de la aplicación. Necesita encontrar algún tipo de tabla de búsqueda en algún lugar del binario para encontrar las rutinas dentro de TargetLib, y eso tiene que ser en una ubicación determinista. (O en una ubicación aleatoria, señalada por otra cosa. Puede agregar tantos indirectos como desee, pero finalmente debe comenzar en una ubicación conocida.)

Esto significa que en lugar de apuntar su código de ataque al ubicación conocida de TargetLib, todo lo que el hacker necesita hacer es apuntar su código de ataque a la entrada de la tabla de búsqueda de la aplicación para TargetLib y desreferenciar el puntero a la rutina objetivo, y el ataque continúa sin obstáculos.

¿Hay algo sobre la forma en que funciona ASLR que no entiendo? Debido a que como se describe, no veo cómo es algo más que un bache de velocidad, proporcionando la imagen de seguridad, pero sin sustancia real. ¿Me estoy perdiendo de algo?

Respuesta

2

Creo que esto es efectivo porque cambia la dirección base de la biblioteca compartida. Recuerde que las funciones importadas de una biblioteca compartida se parchean en su imagen ejecutable cuando se cargan y, por lo tanto, no existe una tabla per se, solo direcciones específicas que apuntan a datos y códigos dispersos por todo el código del programa.

Aumenta la barra para un ataque efectivo porque hace que un desbordamiento de búfer simple (donde se puede establecer la dirección de retorno en la pila) en uno donde el desbordamiento debe contener el código para determinar la ubicación correcta y luego ejecutarlo . Presumiblemente esto solo lo hace más difícil.

Virtualmente todas las DLL en Windows se compilan para una dirección base que probablemente no se ejecutarán y se moverán de todos modos, pero las principales de Windows tienden a tener su dirección base optimizada para que la reubicación no sea necesaria.

+1

¿Alguna vez depuró un EXE de Windows en el nivel de ASM? Hay una tabla de importación real allí. El cargador no aplica parches al código, (todos los lugares donde su código puede llamar a alguna rutina externa), parchea la tabla de importación, que es básicamente una larga secuencia de instrucciones JMP, a la cual el compilador genera LLAMADAS. –

+0

No solo es memoria compartida ... – rook

+0

@Mason Wheeler: no por un largo tiempo, pero eso es bueno saberlo. Si bien eso hace que sea más fácil determinar una dirección particular, el efecto neto es el mismo, ¿no es así? Cambia un conocido por desconocido, lo que simplemente hace que el ataque sea más difícil. –

1

No sé si le hacen la pregunta correctamente pero explicaré cuándo ASLR es efectivo y cuándo no.

Digamos que tenemos app.exe y TargetLib.dll. app.exe está utilizando (vinculado a) TargetLib.dll. Para simplificar la explicación, supongamos que el espacio de direcciones virtuales solo tiene estos 2 módulos.

Si ambos son ALSR habilitados, la dirección base de app.exe es desconocida. Puede resolver algunas direcciones de llamadas a funciones cuando se carga, pero un atacante no sabe dónde está la función ni dónde están las variables resueltas. Lo mismo sucede cuando se carga TargetLib.dll. Aunque app.exe tiene una tabla de búsqueda, un atacante no sabe dónde está la tabla.

Como un atacante no puede decir cuál es el contenido de una dirección específica, debe atacar la aplicación sin utilizar ninguna información de dirección fija. Por lo general, es más difícil si utiliza el método de ataque habitual, como desbordamiento de pila, desbordamiento de pila, uso después de la liberación ...

Por otro lado, si app.exe NO está habilitado para ASLR, es mucho más fácil para un atacante para explotar la aplicación. Porque puede haber una llamada de función a una API interesante en una dirección específica en la aplicación.exe y el atacante pueden usar la dirección como dirección de destino para saltar. (Atacar una aplicación generalmente comienza desde saltar a una dirección arbitraria).

Suplementación: Es posible que ya entenderlo, pero quiero dejar una cosa clara. Cuando un atacante explota una aplicación por vulnerabilidad, como corrupción de memoria, generalmente se le obliga a usar fixed address jump instruction. No pueden usar la instrucción relative address jump para explotar. Esta es la razón por la cual ALSR es realmente efectiva para tales exploits.

+0

De acuerdo. Es el último punto que no entiendo. ¿Por qué un atacante puede usar 'salto de dirección fija' (que es un código de operación ASM) pero no 'salto de dirección relativa' (que es simplemente otro código de operación de ASM)? ¿Hay alguna diferencia mágica de la que no tenga conocimiento? –

+1

Bueno, para explicarlo primero debes entender cómo funciona ese exploit. Un buen ejemplo es el típico desbordamiento de búfer y la sobrescritura de dirección de retorno. No explico el detalle aquí, pero el punto principal es que lo que hace un atacante es sobreescribir la 'dirección de retorno' con algún valor fijo. Cuando el flujo de ejecución sale de la función vulnerable, salta a la dirección sobrescrita. Este salto siempre es 'salto de dirección fija' no' salto relativo'. Puede haber algunas vulnerabilidades que puede usar 'salto relativo' para explotar, pero son un caso raro. –

+1

En otras palabras, lo que un atacante puede hacer es corromper 'data' no' instruction'. Para explotar una aplicación, corrompen los 'datos' utilizados por la instrucción 'salto de dirección fija'. Lo que hace un atacante es extraer el shellcode (código que quiere ejecutar) y saltar al shellcode. En el shellcode pueden usar saltos relativos, pero en circunstancias ASLR saltar a shellcode en sí es un problema difícil. –