Es malloc determinista?


Es malloc determinista? Digamos que si tengo un proceso bifurcado, es decir, una réplica de otro proceso, y en algún momento ambos llaman a la función malloc. ¿La dirección asignada sería la misma en ambos procesos? Suponiendo que otras partes de la ejecución también son deterministas.

Nota: Aquí, solo estoy hablando de memoria virtual, no física.

Author: Jens, 2011-11-17

7 answers

No hay ninguna razón para que sea determinista, de hecho puede haber algún beneficio para que no sea determinista, por ejemplo aumentando la complejidad de la explotación de errores (véase también este documento).

Esta aleatoriedad puede ser útil para hacer exploits más difíciles de escribir. Para explotar con éxito un desbordamiento de búfer, normalmente necesita hacer dos cosas:

  1. Entregar una carga útil en una ubicación de memoria predecible/conocida
  2. Hacer que la ejecución salte a esa ubicación

Si la ubicación de la memoria es impredecible, hacer ese salto puede ser mucho más difícil.

La cita relevante de la norma §7.20.3.3 / 2:

La función malloc asigna espacio a un objeto cuyo tamaño es especificado por tamaño y cuyo valor es indeterminado

Si se tratara de la intención de hacerlo determinista entonces eso estaría claramente establecido como tal.

Aunque hoy parezca determinista, no apostaría en él permaneciendo así con un núcleo más nuevo o una versión más nueva de libc/GCC.

 27
Author: Flexo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 18:56:19

La especificación C99 (al menos, en su borrador público final) establece en 'J. 1 Comportamiento no especificado':

Lo siguiente no está especificado: ... El orden y la contigüidad del almacenamiento asignados por sucesivas convocatorias a las funciones calloc, malloc y realloc (7.20.3).

Así que parece que malloc no tiene que ser determinista. Por lo tanto, no es seguro asumir que lo es.

 11
Author: Tommy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 16:53:44

Eso depende completamente de la implementación malloc. No hay ninguna razón inherente por la cual una implementación malloc particular introduciría el no determinismo (excepto posiblemente como una prueba de fuzzing de aplicación, pero incluso entonces debería deshabilitarse por defecto). Por ejemplo, Doug Lea malloc no utiliza rand(3) ni ningún método similar.

Pero, dado que malloc hace llamadas al núcleo tales como sbrk(2) o mmap(2) en Linux o VirtualAlloc en Windows, esas llamadas al sistema pueden no ser siempre deterministas, incluso en procesos idénticos. El núcleo puede decidir proporcionar intencionalmente diferentes direcciones mmap'ed en diferentes procesos por cualquier razón.

Por lo tanto, para asignaciones pequeñas, que generalmente son atendidas en el espacio de usuario sin una llamada al sistema, es muy probable que los punteros resultantes sean los mismos después de una fork(); las asignaciones grandes que son atendidas por un sistema, una llamada puede ser la misma.

En general, sin embargo, no dependen de ello. Si realmente necesita punteros idénticos en procesos separados, créelos antes de bifurcarlos o use memoria compartida y compártalos apropiadamente.

 7
Author: Adam Rosenfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 16:55:47

Depende de las implementaciones detalladas de malloc. Una implementación típica malloc (por ejemplo, dlmalloc) solía ser determinista. Esto es simplemente porque el algoritmo en sí es determinista.

Sin embargo, debido a muchos ataques de seguridad como los ataques de desbordamiento de montón, malloc, que es un gestor de montón, introdujo algo de aleatoriedad en sus implementaciones. (Pero, su entropía es relativamente pequeña porque los administradores de pilas deben considerar la velocidad y el espacio) Por lo tanto, es seguro que no debe asumir determinismo riguroso en un montón de gerentes.

También, cuando bifurcas un proceso, hay varias fuentes de aleatoriedad incluyendo ASLR.

 2
Author: minjang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 16:54:27

Sí, es determinista hasta cierto punto, pero no eso no significa necesariamente que dará resultados idénticos en dos bifurcaciones de un proceso.

Solo por ejemplo, la Especificación Única de Unix dice:" [...] para evitar errores, el proceso hijo solo puede ejecutar operaciones async-signal-safe hasta el momento en que se llame a una de las funciones exec."

Para bien o para mal, malloc es no en la lista de funciones "async-signal-safe".

Esta limitación está en una sección que analiza los programas multiproceso, pero no especifica si la limitación se aplica solo a los programas multiproceso, o también se aplica a los programas de subproceso único.

Conclusión: no se puede contar con malloc produciendo resultados idénticos en el padre y el hijo. Si el programa es multiproceso, no puede contar con que malloc funcione en absoluto en el hijo, hasta que haya llamado exec--y hay espacio para la pregunta razonable de si realmente está garantizado que funcione incluso en un solo subproceso niño antes de que el niño llame exec.

Referencias:

  1. fork especificación
  2. funciones seguras de señal asíncrona
 2
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 07:33:44

No obtendrá la misma dirección física. Si tienes proceso A y B cada llamada de malloc devuelve la dirección de un bloque libre. El orden en el que A y B llaman a malloc no es predecible. Pero nunca sucede "en el mismo momento".

 0
Author: Paolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 16:53:41

Técnicamente, si los procesos bifurcados solicitan el mismo tamaño de bloque, deberían obtener la misma dirección asignada, pero cada una de esas direcciones apuntará a una ubicación de memoria física/real diferente.

Linux usa copy-on-write para fork, por lo que los hijos bifurcados comparten la memoria de sus padres, hasta que algo se cambia en cualquiera de los procesos. En ese punto, el núcleo pasa por la secuencia de copia de memoria para dar al hijo bifurcado su propia copia dedicada/única de su espacio de memoria.

 -1
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 16:53:12