¿Cómo deshabilitar la aleatorización del espacio de direcciones para un binario en Linux?
gcc aslr (3)
¿Hay alguna razón por la que no pueda asignar un espacio de memoria compartido o usar un FIFO nombrado?
Estoy trabajando en un sistema de tiempo de ejecución para programas paralelos que pueden aprovechar un diseño de espacio de direcciones común en múltiples procesos, potencialmente repartidos en varios (miles) nodos. Muchas veces, el software creado para este entorno se ejecuta en sistemas Linux que tienen habilitada la asignación aleatoria de espacio de direcciones por defecto, y los usuarios pueden no querer o no poder desactivarlo en todo el sistema (a través de sysctl -w kernel.randomize_va_space=0
y similares) . Esto impone algunas limitaciones en los programas paralelos y puede afectar el rendimiento. Por lo tanto, queremos descubrir cómo deshabilitarlo para los binarios que construimos. La seguridad no es un problema, ya que este software siempre se ejecuta en entornos controlados.
He encontrado referencias a varios indicadores y variables, como ET_EXEC
, EF_AS_NO_RANDOM
(¿aparentemente nunca fusionado?) Y PF_RANDOMIZE
, pero no puedo encontrar ningún documento que describa lo que puedo hacer para establecer estos indicadores. Una respuesta ideal me dirá qué indicador de compilador / ensamblador / vinculador deshabilitará la aleatorización para el binario resultante, y en qué versiones de la cadena de herramientas / kernel funciona. El siguiente mejor sería una herramienta que haga lo mismo después de que se construya un binario.
Como estoy seguro de que alguien lo sugerirá, ya estoy consciente de que podemos hacer este cambio en tiempo de ejecución con setarch -R
, pero es preferible que lo grabemos en el ejecutable.
Parece que paxctl -rx
debería hacer el truco, pero no parece aplicarse al método actual utilizado en los núcleos que no incluyen los parches PaX.
Al menos algunas versiones anteriores de ASLR en el kernel de Linux conservaron las compensaciones al forking . En lugar de deshabilitar la aleatorización para sus procesos, ¿podría simplemente organizarlos bajo una jerarquía de procesos padre / hijo que mantuviera las compensaciones iguales entre las instancias del binario bifurcado por el mismo padre?
Probablemente tienes algún tipo de demonio que invoca tus programas paralelos en los nodos. Si es así, puede hacer que este padre común deshabilite ASLR para cualquier proceso secundario que cree.
Busque en las fuentes de GDB (7.0 o CVS Head) para saber cómo hacerlo. Lo esencial es llamar personality(orig_personality|ADDR_NO_RANDOMIZE)
después de fork
y antes de exec
.