Linux vynuluje (tj. vyplní nulami) všechny stránky paměti, ne když jsou uvolněny, ale když jsou předány jinému procesu. Žádný proces tedy nemůže získat výňatky dat z jiného procesu. Stránky si však zachovají svůj starý obsah, dokud nebudou znovu použity. Nejsem si vědom žádné opravy, která by provedla nulování po vydání stránky (Edit: jak ve své odpovědi poukazuje @user2313067, patch PaX tuto možnost nabízí za cenu, která může, ale nemusí být problém na jakémkoli daném systému); obecně by to poškodilo výkon, protože by to zaplnilo mezipaměti nulami a odstranilo by více „užitečných“ dat (a to nepočítám odkládací prostor, který vaše vestavěné zařízení pravděpodobně postrádá, ale většina linuxových systémů má swap) .
Můžete si vynutit určité vymazání dat jednoduchým přidělením každé možné stránky z jiného procesu. Něco takového:
#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;
}
Pokud tento program spustíte jako root
, pak zachytí veškerou dostupnou paměť a zaplní ji (aby si vynutila skutečnou alokaci), ukončí se pouze tehdy, když už žádná paměť nezbývá. Běží jako root
je potřeba, protože jádro rezervuje posledních několik stránek pro root
.
Všimněte si, že zaplnění paměti spouští podmínky OOM, kdy se jádro cítí dovoleno střílet procesy, aby si udělalo místo. K tomu dochází pouze tehdy, když nezbývá žádná volná stránka, tedy stav, kterého chcete dosáhnout (nezbývá žádná volná stránka znamená, že všechny staré stránky byly přemístěny, a tedy vynulovány). Pro OS je to určitá sebevražda, protože kód pro zpracování OOM může zabít některé zásadní procesy (zkouší ne, ale hej, to jsou jen heuristiky). Ve vašem případě se to však zdá vhodné:pokud je detekována manipulace, zařízení nemá jinou možnost než čestné vykuchání.
Stačí tedy spustit vaši kritickou aplikaci v obalu (jednoduchý skript), který spustí výše uvedený program při ukončení kritické aplikace (pravděpodobně kvůli zjištěné manipulaci).
Grsecurity má k tomu PAX_MEMORY_SANITIZE. Viz možnost na této stránce.