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.