Linux pone a cero (es decir, llena con ceros) todas las páginas de la memoria no cuando se liberan, sino cuando se entregan 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 antiguo contenido hasta que sean reutilizadas. No tengo conocimiento de ningún parche que ponga a cero al publicar la página (Editar: como @user2313067 señala en su respuesta, el parche PaX 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 porque llenaría los cachés con ceros, expulsando más datos "útiles" (y eso sin contar el espacio de intercambio, del que probablemente carece su dispositivo integrado, pero la mayoría de los sistemas Linux tienen intercambio) .
Puede forzar una especie de borrado de datos simplemente asignando todas las páginas posibles 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
, luego toma toda la memoria disponible y la llena (para forzar la asignación real), saliendo solo cuando no queda memoria. Corriendo como root
es necesario porque el kernel reserva las últimas páginas para root
.
Tenga en cuenta que llenar la memoria activa las condiciones OOM, momento en el que el kernel se siente autorizado a disparar procesos para hacer algo de espacio. 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 puesto a cero). Es una especie de suicidio para el sistema operativo, porque el código de manejo de OOM puede eliminar algunos procesos esenciales (intenta no, pero bueno, esto son solo heurísticas). Sin embargo, esto parece apropiado en su caso:si se detecta una manipulación, el dispositivo no tiene otra opción que el destripamiento honorable.
Entonces, solo tiene que iniciar su aplicación crítica en un contenedor (un script simple) que inicia el programa anterior cuando la aplicación crítica sale (presumiblemente debido a la manipulación detectada).
Grsecurity tiene PAX_MEMORY_SANITIZE para hacer esto. Ver la opción en esta página.