¿Por qué el SO moderno asigna direcciones estáticas o por qué todavía se necesita ASLR?

1

Tengo una pregunta sobre ASLR que asigna direcciones aleatorias para cosas. Según mi entendimiento (lo que podría estar mal), un sistema operativo moderno tiene mecanismos de administración de memoria bastante complicados y parece REALMENTE un desafío asignar la misma dirección para el mismo programa cada vez. En otras palabras, por intuición, creo que la dirección aleatoria debería ser el comportamiento predeterminado, y asignar una dirección estática requeriría un poco de esfuerzo.

¿Esta comprensión es completamente errónea? ¿O el sistema operativo asigna un espacio de direcciones separado para cada proceso de modo que en cada espacio de direcciones el proceso siempre obtenga su dirección estática cómoda de forma predeterminada?

    
pregunta ios learner 14.12.2018 - 03:08
fuente

1 respuesta

2

La mayoría de los sistemas modernos tienen una Unidad de administración de memoria o MMU. La MMU es responsable de traducir las direcciones físicas a direcciones virtuales. Esto se utiliza para dar a cada proceso su propia memoria virtual privada. La dirección X de un proceso no es lo mismo que la dirección X de otro proceso. Esto mejora el rendimiento, la seguridad y reduce el riesgo de bloqueos, pero también tiene la ventaja de poder utilizarse para implementar ASLR. Si bien los datos se pueden colocar en direcciones no aleatorias en la memoria física, el sistema puede colocar los datos en cualquier lugar que desee en la memoria virtual de un proceso.

Cuando se crea un proceso por primera vez, la única memoria real a la que tiene acceso es la pila, que está limitada y no está diseñada para fines generales. Siempre que se requiera una cantidad no trivial de memoria, el proceso debe utilizar el heap . La única forma de hacerlo es solicitar memoria del kernel a través de una llamada del sistema. A esta llamada del sistema se le dan algunos argumentos que especifican la cantidad de memoria que desea, el tipo de memoria, etc. La llamada devuelve la dirección base de alguna memoria recién asignada del tamaño especificado. Una de las cosas que hace ASLR es hacer que esta dirección base sea impredecible. Cuando ASLR está deshabilitado, la memoria asignada se coloca en ubicaciones predecibles.

ASLR hace más que solo aleatorizar la base de memoria asignada. Cuando se ejecuta un binario, el enlazador dinámico lo conecta a todas las bibliotecas compartidas que necesita. Aunque cualquier biblioteca dada se guarda en un solo lugar en la memoria física, el sistema puede traducirla a una dirección virtual para cada proceso que la use. Esta traducción de direcciones se realiza por razones de eficiencia, pero ASLR hace un uso adicional de la misma al garantizar que la dirección virtual sea aleatoria. Un ejecutable compilado especialmente como ejecutable independiente de la posición (PIE) puede llamar a las funciones de biblioteca incluso si La dirección base de la biblioteca es aleatoria.

Esto no es todo lo que hace ASLR, y ciertos sistemas operativos centrados en la seguridad (OpenBSD, HardenedBSD, Linux con parches grsecurity / PaX, etc.) utilizan una forma de ASLR que hace aún más.

    
respondido por el forest 14.12.2018 - 04:37
fuente

Lea otras preguntas en las etiquetas