Linux met à zéro (c'est-à-dire remplit de zéros) toutes les pages de mémoire non pas lorsqu'elles sont libérées, mais lorsqu'elles sont données à un autre processus. Ainsi, aucun processus ne peut obtenir des extraits de données d'un autre processus. Cependant, les pages conserveront leur ancien contenu jusqu'à ce qu'elles soient réutilisées. Je ne suis au courant d'aucun correctif qui effectue la mise à zéro lors de la publication de la page (Modifier : comme @user2313067 le souligne dans sa réponse, le patch PaX offre cette option, à un coût qui peut ou non être un problème sur un système donné) ; de manière générale, cela nuirait aux performances car cela remplirait les caches avec les zéros, expulsant plus de données "utiles" (et cela ne compte pas l'espace d'échange, qui manque probablement à votre périphérique intégré, mais la plupart des systèmes Linux là-bas ont swap) .
Vous pouvez forcer une sorte d'effacement des données en allouant simplement chaque page possible d'un autre processus. Quelque chose comme ça :
#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 vous exécutez ce programme en tant que root
, puis il récupère toute la mémoire disponible et la remplit (afin de forcer l'allocation réelle), en ne sortant que lorsqu'il ne reste plus de mémoire. Exécuté en tant que root
est nécessaire car le noyau réserve les dernières pages à root
.
Notez que le remplissage de la mémoire déclenche des conditions OOM, à quel point le noyau se sent autorisé à lancer des processus afin de faire de la place. Cela se produit uniquement lorsqu'il ne reste plus de page libre, c'est-à-dire l'état que vous souhaitez atteindre (aucune page libre restante signifie que toutes les anciennes pages ont été réattribuées, et donc mises à zéro). C'est une sorte de suicide pour le système d'exploitation, car le code de gestion du MOO peut tuer certains processus essentiels (il essaye pas, mais bon, ce ne sont que des heuristiques). Cependant, cela semble approprié dans votre cas :si une effraction est détectée, l'appareil n'a d'autre choix que l'éventration honorable.
Il vous suffit donc de lancer votre application critique dans un wrapper (un simple script) qui lance le programme ci-dessus lorsque l'application critique se ferme (probablement à cause d'une altération détectée).
Grsecurity a PAX_MEMORY_SANITIZE pour faire cela. Voir l'option sur cette page.