binarios sin gadgets resistentes a ROP

5

G-Free: derrota la programación orientada al retorno a través de binarios sin gadget

Este documento describe lo que parece ser una técnica realmente genial para prevenir ataques de ROP si la fuente está disponible. Utilizan un preprocesador de ensamblaje entre gcc y el ensamblador para eliminar o proteger todas las ramas libres posibles (devoluciones y saltos indirectos). Afirman tener un impacto de velocidad / rendimiento de < 3% (1% promedio).

Modifican las instrucciones o agregan no-ops para cambiar la alineación para que se eliminen las instrucciones de bifurcación no deseadas / no alineadas. Para proteger los retornos y saltos legítimos, cifran la dirección de retorno con una clave de tiempo de ejecución aleatoria en el prólogo de la función y la descifran XOR justo antes de la devolución. Se supone que esto impide que la ejecución de retorno se ejecute con éxito a menos que el punto de entrada estuviera al comienzo de la función.

Mi pregunta es ¿cómo evitará que se utilicen los dispositivos ROP con el cifrado de direcciones de retorno? La clave / cookie se almacena en la pila justo encima de la dirección de retorno, por lo tanto, ¿qué evitará que el atacante modifique la cadena del gadget en la pila para incluir también una clave 0x00000000 después de cada dirección de retorno?

El documento parece haber obtenido 73 citas y nadie ha mencionado algo así por lo que puedo ver, así que debo estar perdiendo algo. ¿Alguien puede aclarar cómo funciona el código de protección para saltos legítimos y devoluciones?

(Sé que esta es una pregunta larga que requiere la lectura de un artículo largo, pero espero que al menos quien lo lea encuentre el artículo tan genial como lo hice yo)

Actualizar

Aparentemente, esta es la misma técnica (o muy similar) utilizada en StackGuard y ProPolice. ¿Alguien puede decirme cómo les va en contra de las vulnerabilidades de divulgación de memoria? Parece que no puedo averiguar con seguridad. Lo que sí encuentro, o los menciona de pasada, o simplemente pregona sus virtudes.

    
pregunta staticd 10.12.2013 - 06:16
fuente

1 respuesta

3

El cifrado de la dirección de retorno evita que se utilicen los dispositivos ROP porque el atacante no podrá predecir el valor de la clave, por lo que el atacante no sabrá qué escribir en la pila para provocar la instrucción de retorno al final de un gadget para transferir el control al siguiente gadget.

Recuerda cómo funcionan los ataques de ROP. El ataque consiste en ejecutar una secuencia de gadgets ROP. El atacante debe organizar la memoria para que estos dispositivos se ejecuten en la secuencia deseada. En un ataque de ROP, el atacante lo hace sobrescribiendo la pila para que contenga un montón de marcos de pila falsos, donde cada marco de pila contiene los datos de pila que un solo gadget necesitará o esperará. Cada gadget ROP termina en una instrucción RET (retorno), por lo que el marco de pila falso correspondiente contiene una dirección de retorno guardada que utilizará la instrucción RET: cuando ejecute el gadget, cuando llegue a la instrucción RET, la instrucción RET saca la "dirección de retorno" de la pila y salta a ella. Por lo tanto, el atacante organiza el contenido de la pila para que tenga una "dirección de retorno" falsa para cada gadget, y la "dirección de retorno" falsa tiene un valor que es la dirección de la primera instrucción del siguiente gadget a ejecutar.

En un ataque ROP estándar, esto funciona, porque el atacante conoce la dirección de cada gadget y puede escribir esas direcciones en la pila.

Con el cifrado de la dirección de retorno de G-Free, este ataque ya no funciona. El atacante no puede almacenar la dirección del gadget en la pila; en cambio, el atacante debe almacenar una dirección de retorno cifrada (es decir, el cifrado de la dirección del siguiente gadget). Sin saber la clave de cifrado, el atacante no sabrá qué escribir.

Por lo tanto, sin conocer la clave de cifrado, los ataques de ROP no funcionan, porque el atacante no puede encadenar los gadgets.

P.S. Estoy de acuerdo contigo. G-Free es realmente impresionante. Desearía tener un indicador de compilador que me permita compilar un programa con G-Free; Es una defensa muy interesante, con un impacto de rendimiento modesto.

    
respondido por el D.W. 21.03.2014 - 20:37
fuente

Lea otras preguntas en las etiquetas