Linux azzera (ovvero riempie di zeri) tutte le pagine di memoria non quando vengono rilasciate, ma quando vengono assegnate a un altro processo. Pertanto, nessun processo può ottenere estratti di dati da un altro processo. Tuttavia, le pagine manterranno i loro vecchi contenuti fino a quando non verranno riutilizzate. Non sono a conoscenza di alcuna patch che esegua l'azzeramento al rilascio della pagina (Modifica: come sottolinea @ user2313067 nella sua risposta, la patch PaX offre questa opzione, a un costo che può o meno essere un problema su un dato sistema); su base generale, sarebbe dannoso per le prestazioni perché riempirebbe le cache con gli zeri, eliminando più dati "utili" (e questo non conta lo spazio di swap, che probabilmente manca al tuo dispositivo embedded, ma la maggior parte dei sistemi Linux là fuori ha swap) .
Puoi forzare una sorta di cancellazione dei dati semplicemente allocando ogni possibile pagina da un altro processo. Qualcosa del genere:
#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;
}
Se esegui questo programma come root
, quindi prende tutta la memoria disponibile e la riempie (per forzare l'allocazione effettiva), uscendo solo quando non c'è più memoria. In esecuzione come root
è necessario perché il kernel riserva le ultime pagine a root
.
Si noti che il riempimento della memoria attiva le condizioni OOM, a quel punto il kernel si sente autorizzato a sparare ai processi per fare spazio. Ciò accade solo quando non è rimasta alcuna pagina libera, ovvero lo stato che si desidera ottenere (nessuna pagina libera rimasta significa che tutte le vecchie pagine sono state riallocate e quindi azzerate). È una sorta di suicidio per il sistema operativo, perché il codice di gestione di OOM può terminare alcuni processi essenziali (ci prova non farlo, ma hey, queste sono solo euristiche). Tuttavia, questo sembra appropriato nel tuo caso:se viene rilevata la manomissione, il dispositivo non ha altra scelta se non l'onorevole sventramento.
Quindi devi solo avviare la tua applicazione critica in un wrapper (un semplice script) che avvia il programma di cui sopra quando l'applicazione critica viene chiusa (presumibilmente a causa di manomissioni rilevate).
Grsecurity ha PAX_MEMORY_SANITIZE per farlo. Vedi l'opzione in questa pagina.