¿Existe alguna distribución de Linux o parche de kernel que borre el espacio de la memoria del proceso después de que el proceso finalice?

9

Una aplicación se ejecuta en una PC con batería incorporada, accesible a un público restringido, que almacena secretos en la RAM. Para evitar ataques de arranque en frío y que la PC sea robada para extraer sus secretos, tiene sensores a prueba de temperatura. Si se detecta una manipulación indebida, la aplicación existe (pero no borra toda la memoria del proceso antes de hacerlo). No puedo cambiar este comportamiento.

¿El kernel de Linux borra la memoria de proceso liberada por defecto? ¿Alguna distro de Linux lo hace? ¿Hay un parche para hacerlo?

Al borrar me refiero a relleno cero, o reescritura de pasos múltiples.

    
pregunta SDL 10.09.2013 - 22:36
fuente

2 respuestas

10

Linux pone a cero (es decir, rellena con ceros) todas las páginas de la memoria, no cuando se liberan, sino cuando se asignan a otro proceso. Por lo tanto, ningún proceso puede obtener extractos de datos de otro proceso. Sin embargo, las páginas conservarán su contenido anterior hasta que sean reutilizadas. No tengo conocimiento de ningún parche que haga la reducción a cero en el lanzamiento de la página ( Editar: como @ user2313067 señala en su respuesta, PaX parche ofrece esta opción, a un costo que puede o no ser un problema en cualquier sistema dado); en general, sería perjudicial para el rendimiento, ya que llenaría los cachés con los ceros, desalojando datos más "útiles" (y eso no es contar el espacio de intercambio, que probablemente carece de su dispositivo integrado, pero la mayoría de los sistemas Linux tienen intercambio) .

Puede forzar una especie de borrado de datos simplemente asignando cada página posible de otro proceso. Algo como esto:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
    for (;;) {
        void *x = malloc(2000);
        if (x == NULL) {
            break;
        }
        memset(x, 'T', 2000);
    }
    return 0;
}

Si ejecuta este programa como root , entonces toma toda la memoria disponible y la llena (para forzar la asignación real), saliendo solo cuando no queda memoria. Se necesita ejecutar root porque el kernel reserva las últimas páginas a root .

Tenga en cuenta que al rellenar la memoria se activan las condiciones de OOM , momento en el que el núcleo se siente capaz de disparar procesos para hacer alguna habitacion Esto sucede solo cuando no queda ninguna página libre, es decir, el estado que desea lograr (no queda ninguna página libre significa que todas las páginas antiguas se han reasignado y, por lo tanto, se han eliminado). Es un tipo de suicidio para el sistema operativo, ya que el código de manejo de OOM puede matar algunos procesos esenciales ( intenta no, pero bueno, estos son solo heurísticos). Sin embargo, esto parece apropiado en su caso: si se detecta una manipulación indebida, el dispositivo no tiene otra opción excepto desembarco honorable .

Entonces, solo tiene que iniciar su aplicación crítica en un envoltorio (una secuencia de comandos simple) que inicia el programa anterior cuando la aplicación crítica sale (probablemente debido a una manipulación detectada).

    
respondido por el Thomas Pornin 10.09.2013 - 23:19
fuente
5

Grsecurity tiene PAX_MEMORY_SANITIZE para hacer esto. Consulte la opción en esta página .

    
respondido por el user2313067 11.09.2013 - 21:17
fuente

Lea otras preguntas en las etiquetas