Muss der Inhalt des Stapels aufgeräumt werden?

8

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:

  • Heap-Zuweisung (malloc): Vor dem Freigeben des Speichers kann der Bereich mit memset bereinigt werden.
  • statische oder globale Daten: Nach der Verwendung kann der Bereich mit memset bereinigt werden
  • lokale Daten (Funktionsmember): Die Daten werden auf den Stapel gelegt und sind nicht zugänglich, nachdem die Funktion beendet wurde

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?

    
Juliano 01.06.2017, 18:43
quelle

4 Antworten

4

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.

    
Grollicus 01.06.2017, 19:59
quelle
2

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.

    
Wagner Patriota 01.06.2017 19:45
quelle
2

Ich glaube, es ist notwendig, aber das ist nur die Hälfte des Problems.

Hier gibt es zwei Probleme:

  1. 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.

  2. 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.

    
sbabbi 01.06.2017 21:59
quelle
1

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 .

    
jinzai 28.12.2017 20:32
quelle

Tags und Links