Linux löscht (d.h. füllt mit Nullen) alle Speicherseiten nicht, wenn sie freigegeben werden, sondern wenn sie an einen anderen Prozess übergeben werden. Somit darf kein Prozess Datenauszüge von einem anderen Prozess erhalten. Die Seiten behalten jedoch ihre alten Inhalte, bis sie wiederverwendet werden. Mir ist kein Patch bekannt, der die Nullung bei der Seitenfreigabe durchführt (Edit: wie @user2313067 in seiner Antwort betont, bietet der PaX-Patch diese Option zu einem Preis, der auf einem bestimmten System ein Problem darstellen kann oder auch nicht); Im Allgemeinen wäre dies nachteilig für die Leistung, da Caches mit Nullen gefüllt und mehr "nützliche" Daten entfernt würden (und das zählt nicht den Swap-Speicher, der Ihrem eingebetteten Gerät wahrscheinlich fehlt, aber die meisten Linux-Systeme da draußen haben Swap) .
Sie können eine Art Datenlöschung erzwingen, indem Sie einfach jede mögliche Seite aus einem anderen Prozess zuweisen. Etwa so:
#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;
}
Wenn Sie dieses Programm als root
ausführen , dann greift es den gesamten verfügbaren Speicher und füllt ihn (um die tatsächliche Zuweisung zu erzwingen) und wird nur beendet, wenn kein Speicher mehr vorhanden ist. Läuft als root
wird benötigt, da der Kernel die letzten paar Seiten für root
reserviert .
Beachten Sie, dass das Auffüllen des Speichers OOM-Bedingungen auslöst, an denen sich der Kernel erlaubt fühlt, Prozesse abzuschießen, um etwas Platz zu schaffen. Dies geschieht nur, wenn keine freie Seite mehr vorhanden ist, d. h. der Zustand, den Sie erreichen möchten (keine freie Seite mehr übrig bedeutet, dass alle alten Seiten neu zugewiesen und daher auf Null gesetzt wurden). Es ist eine Art Selbstmord für das Betriebssystem, weil der OOM-Behandlungscode einige wesentliche Prozesse beenden kann (es versucht nicht, aber hey, das sind nur Heuristiken). In Ihrem Fall scheint dies jedoch angemessen:Wenn eine Manipulation erkannt wird, hat das Gerät keine andere Wahl als eine ehrenhafte Ausweidung.
Sie müssen also nur Ihre kritische Anwendung in einem Wrapper (einem einfachen Skript) starten, der das obige Programm startet, wenn die kritische Anwendung beendet wird (vermutlich aufgrund einer erkannten Manipulation).
Grsecurity hat dafür PAX_MEMORY_SANITIZE. Siehe Option auf dieser Seite.