2009-09-21 9 views
16

Estoy trabajando en un sistema en tiempo de ejecución para programas paralelos que pueden aprovechar un diseño de espacio de direcciones común en múltiples procesos, potencialmente distribuidos en varios (miles) nodos. Muchas veces, el software creado para este entorno se ejecuta en sistemas Linux que tienen habilitada la aleatorización del espacio de direcciones de forma predeterminada, y es posible que los usuarios no quieran o no puedan deshabilitarlo 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 dañar 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.Cómo deshabilitar la aleatorización de espacio de direcciones para un binario en Linux?

que he encontrado referencias a varios indicadores y variables, como ET_EXEC, EF_AS_NO_RANDOM (aparentemente nunca se fusionó?) Y PF_RANDOMIZE, pero no puedo encontrar ningún documento que describe lo que puedo hacer para establecer estas banderas. Una respuesta ideal me diría qué indicador de compilador/ensamblador/enlazador deshabilitará la asignación aleatoria para el binario resultante, y en qué versiones de la cadena de herramientas/núcleo funciona. Lo mejor sería una herramienta que hace lo mismo después de construir un binario.

Como estoy seguro de que alguien lo sugerirá, ya soy consciente de que podemos hacer este cambio en tiempo de ejecución con setarch -R, pero es preferible grabar esto en el ejecutable.

Parece que paxctl -rx debería ser el truco, pero no parece aplicarse al método actual utilizado en kernels que no incluyen los parches PaX.

Respuesta

14

Es de suponer que tiene algún tipo de daemon que invoca sus programas paralelos en los nodos. De ser así, puede hacer que este padre común desactive ASLR para cualquier proceso secundario que cree.

Mire en las fuentes GDB (7.0 o CVS Head) para saber cómo hacer eso. La esencia de esto es llamar al personality(orig_personality|ADDR_NO_RANDOMIZE) después de fork y antes de exec.

+0

Investigaré e intentaré esto ahora. – Novelocrat

+0

Parece que funcionó. ¡Gracias! – Novelocrat

0

Al menos algunas versiones anteriores de ASLR en el núcleo de Linux preserved offsets when forking. En lugar de deshabilitar la aleatorización para sus procesos, ¿podría simplemente organizarlos en una jerarquía de procesos padres/hijos que mantuviera los mismos cambios entre las instancias del binario bifurcado por el mismo padre?

+1

No, no podemos, porque estos procesos se están ejecutando en varios nodos. La migración de subprocesos es mucho más fácil cuando no tenemos que pasar por aros para sincronizar manualmente el espacio de direcciones. – Novelocrat

Cuestiones relacionadas