Wir haben eine PCI PA-DSS-Zertifizierung und eine der Anforderungen besteht darin, das Schreiben sauberer PAN (Kartennummer) auf die Festplatte zu vermeiden. Die Anwendung schreibt solche Informationen nicht auf die Festplatte, aber wenn das Betriebssystem (in diesem Fall Windows) ausgetauscht werden muss, wird der Speicherinhalt in die Auslagerungsdatei geschrieben. Daher muss die Anwendung den Speicher aufräumen, um zu verhindern, dass RAM-Capturer-Dienste sensible Daten lesen.
Es gibt drei Situationen zu behandeln:
memset
bereinigt werden.
memset
bereinigt werden
Zum Beispiel:
%Vor%Nachdem der Test ausgeführt wurde, enthält der Speicher immer noch die Kartennummer.
Eine Anweisung könnte die Variable card_number am Ende des Tests auf Null setzen, aber dies sollte für alle Funktionen im Programm gelten.
%Vor%Gibt es eine Möglichkeit, den Stack irgendwann zu bereinigen, etwa direkt vor dem Programmende?
Das Reinigen des Stapels nach Programmende ist möglicherweise zu spät, er könnte bereits während der Laufzeit des Programms ausgetauscht worden sein. Sie sollten Ihre vertraulichen Daten nur im Speicher mit VirtualLock gesperrt halten, damit es funktioniert nicht ausgelagert werden. Dies muss geschehen, bevor sensible Daten gelesen werden.
Es gibt eine kleine Begrenzung für die Speicherkapazität, die Sie sperren können, so dass Sie den gesamten Stack wahrscheinlich nicht sperren können und es vermeiden sollte, sensible Daten auf dem Stack zu speichern.
Ich nehme an, dass Sie diese Situation unten loswerden wollen:
%Vor%Ausgabe:
%Vor%Sie können so etwas tun:
%Vor%Ausgabe:
%Vor%Sie können etwas Ähnliches tun, um Speicher auf dem Heap oder statischen Variablen zu bereinigen. Offensichtlich gehen wir davon aus, dass die Kartennummer von einer dynamischen Quelle anstelle der fest codierten Sache kommt ...
UND JA: Um den Titel Ihrer Frage explizit zu beantworten: Der Stapel wird nicht automatisch gereinigt ... Sie müssen ihn selbst reinigen.
Ich glaube, es ist notwendig, aber das ist nur die Hälfte des Problems.
Hier gibt es zwei Probleme:
Im Prinzip verhindert nichts, dass das Betriebssystem Ihre Daten austauscht, solange Sie sie noch verwenden. Wie in der anderen Antwort erwähnt, möchten Sie VirtualLock
für Windows und mlock
für Linux.
Sie müssen verhindern, dass das Optimierungsprogramm memset
optimiert. Dies gilt auch für global und dynamisch zugewiesenen Speicher. Ich empfehle dringend, sich Kryptopie SecureWipeBuffer
anzuschauen.
Im Allgemeinen sollten Sie es vermeiden, es manuell zu tun, da es ein fehleranfälliges Verfahren ist. Erwägen Sie stattdessen, einen benutzerdefinierten Zuordner oder eine benutzerdefinierte Klassenvorlage für sichere Daten zu verwenden, die im Destruktor freigegeben werden können.
Der Stapel wird bereinigt, indem der Stapelzeiger verschoben wird, nicht indem Werte aus ihm herausgeholt werden. Die einzige Mechanik besteht darin, den Return in die entsprechenden Register zu setzen. Sie müssen alles manuell tun. Auch - volatil kann Ihnen helfen, Optimierungen pro Variable zu vermeiden. Sie können den Stack manuell aufräumen, aber - dafür brauchen Sie Assembler - und es ist nicht so einfach, den Stack zu manipulieren - er ist nicht Ihre Ressource - der Compiler besitzt sie, soweit es Sie betrifft .