¿Protege ASLR contra un desbordamiento de búfer dentro de una estructura?

3

Supongamos una estructura simple:

struct test {
   char variable[4];
   char variable2;
}

Si escribo algo como variable[4] = '%code%' hay un desbordamiento de búfer que modifica variable2.

¿ASLR evita este desbordamiento de búfer?

    
pregunta yzT 25.05.2014 - 20:23
fuente

1 respuesta

6

ASLR nunca evita cualquier desbordamiento de búfer. Un desbordamiento de búfer se produce cuando la aplicación escribe más bytes en un búfer de los que pueden caber; poner el búfer en cualquier dirección aleatoria no puede arreglar eso.

Lo que ASLR cambia son las consecuencias del desbordamiento. Un atacante explota un desbordamiento de búfer al tratar de hacer que los bytes adicionales se extiendan sobre otros elementos de forma controlada. ASLR lo hace más difícil de dos maneras:

  • Al "mover las cosas", el campo que el atacante intenta sobrescribir no necesariamente se ubicará en un lugar predecible más allá del búfer de desbordamiento.
  • Un exploit de desbordamiento clásico consiste en sobrescribir un campo de salto (dirección de retorno en la pila, vtable para un objeto C ++ ...) para que la ejecución salte en otra parte; ASLR intenta forzar un salto ciego que es poco probable que vaya a algún lugar interesante (para el atacante).

En el caso de un struct , ASLR no separará los dos campos de estructura, ya que eso sería contrario a la especificación de C, y rompería el código. Independientemente de ASLR, el campo variable2 siempre estará justo después del búfer variable en la RAM, por lo que el desbordamiento del búfer se sobrescribirá predeciblemente variable2 . Sin embargo, ASLR aún mueve los fragmentos de código entre dos ejecuciones de la aplicación, por lo que sobrescribir variable2 podría no ser suficiente para, por ejemplo, inyectar código arbitrario.

    
respondido por el Thomas Pornin 25.05.2014 - 20:31
fuente

Lea otras preguntas en las etiquetas