Datenausführungsverhinderung
Die Verhinderung der Datenausführung (Data Execution Prevention, DEP) ist ein Feature zum Schutz des Arbeitsspeichers auf Systemebene, das ab Windows XP und Windows Server 2003 in das Betriebssystem integriert ist. Mit DEP kann das System eine oder mehrere Seiten des Arbeitsspeichers als nicht ausführbare Datei markieren. Das Markieren von Speicherbereichen als nicht ausführbare Dateien bedeutet, dass Code nicht von diesem Speicherbereich aus ausgeführt werden kann, was die Ausnutzung von Pufferüberläufen erschwert.
DEP verhindert, dass Code auf Datenseiten wie dem Standardheap, Stapeln und Speicherpools ausgeführt wird. Wenn eine Anwendung versucht, Code von einer geschützten Datenseite auszuführen, tritt eine Speicherzugriffsverletzungsausnahme auf, und wenn die Ausnahme nicht behandelt wird, wird der aufrufende Prozess beendet.
DEP ist nicht als umfassender Schutz gegen alle Exploits gedacht. Es soll ein weiteres Tool sein, mit dem Sie Ihre Anwendung schützen können.
Funktionsweise der Verhinderung der Datenausführung
Wenn eine Anwendung versucht, Code von einer geschützten Seite auszuführen, empfängt die Anwendung eine Ausnahme mit dem Statuscode STATUS _ ACCESS _ VIOLATION. Wenn Ihre Anwendung Code von einer Speicherseite ausführen muss, muss sie die richtigen Attribute für den Schutz des virtuellen Arbeitsspeichers zuordnen und festlegen. Der zugeordnete Arbeitsspeicher muss bei der Speicherzuweisung als PAGE _ EXECUTE, PAGE EXECUTE _ _ READ, PAGE EXECUTE _ _ READWRITE oder PAGE EXECUTE _ _ WRITECOPY gekennzeichnet sein. Heapzuordnungen, die durch Aufrufen der Funktionen malloc und HeapAlloc vorgenommen werden, sind nicht ausführbare Dateien.
Anwendungen können keinen Code aus dem Standardprozessheap oder Stapel ausführen.
DEP wird beim Systemstart gemäß der Einstellung der Seitenschutzrichtlinie ohne Ausführung in den Startkonfigurationsdaten konfiguriert. Eine Anwendung kann die aktuelle Richtlinieneinstellung abrufen, indem sie die GetSystemDEPPolicy-Funktion aufruft. Abhängig von der Richtlinieneinstellung kann eine Anwendung die DEP-Einstellung für den aktuellen Prozess ändern, indem sie die SetProcessDEPPolicy-Funktion aufruft.
Überlegungen zur Programmierung
Eine Anwendung kann die VirtualAlloc-Funktion verwenden, um ausführbaren Speicher mit den entsprechenden Speicherschutzoptionen zuzuordnen. Es wird empfohlen, dass eine Anwendung mindestens die Option PAGE _ EXECUTE-Speicherschutz einrichtet. Nachdem der ausführbare Code generiert wurde, wird empfohlen, dass die Anwendung Den Speicherschutz so festlegen, dass der Schreibzugriff auf den zugeordneten Arbeitsspeicher nicht mehr gewährt wird. Anwendungen können den Schreibzugriff auf zugeordneten Arbeitsspeicher mithilfe der VirtualProtect-Funktion nicht zuordnen. Wenn Der Schreibzugriff nicht zulässig ist, wird ein maximaler Schutz für ausführbare Bereiche des Prozessadressraums sichergestellt. Sie sollten versuchen, Anwendungen zu erstellen, die den kleinsten ausführbaren Adressraum verwenden, der die Arbeitsspeichermenge minimiert, die für die Speicherausnutzung verfügbar gemacht wird.
Sie sollten auch versuchen, das Layout des virtuellen Speichers Ihrer Anwendung zu steuern und ausführbare Regionen zu erstellen. Diese ausführbaren Bereiche sollten sich in einem niedrigeren Speicherplatz befinden als nicht ausführbare Regionen. Indem Sie ausführbare Regionen unterhalb von nicht ausführbaren Regionen suchen, können Sie verhindern, dass ein Pufferüberlauf in den ausführbaren Speicherbereich überläuft.
Anwendungskompatibilität
Einige Anwendungsfunktionen sind mit DEP nicht kompatibel. Anwendungen, die dynamische Codegenerierung (z. B. Just-In-Time-Codegenerierung) ausführen und generierten Code nicht explizit mit der Berechtigung "Ausführen" markieren, weisen möglicherweise Kompatibilitätsprobleme auf Computern auf, die DEP verwenden. Anwendungen, die in die Active Template Library Version 7.1 (ATL) und früher geschrieben wurden, können versuchen, Code auf Seiten auszuführen, die als nicht ausführbare Datei markiert sind, wodurch ein NX-Fehler ausgelöst und die Anwendung beendet wird. Weitere Informationen finden Sie unter SetProcessDEPPolicy. Die meisten Anwendungen, die Aktionen ausführen, die nicht mit DEP kompatibel sind, müssen aktualisiert werden, damit sie ordnungsgemäß funktionieren.
Eine kleine Anzahl ausführbarer Dateien und Bibliotheken kann ausführbaren Code im Datenabschnitt einer Bilddatei enthalten. In einigen Fällen können Anwendungen kleine Codesegmente (häufig als Thunks bezeichnet) in den Datenabschnitten platzieren. DeP markiert Jedoch Abschnitte der Imagedatei, die in den Arbeitsspeicher geladen werden, als nicht ausführbare Datei, es sei denn, auf den Abschnitt wurde das executable-Attribut angewendet.
Daher sollte ausführbarer Code in Datenabschnitten zu einem Codeabschnitt migriert werden, oder der Datenabschnitt, der den ausführbaren Code enthält, sollte explizit als ausführbare Datei markiert werden. Das ausführbare Attribut IMAGE _ SCN _ MEM _ EXECUTE sollte dem Feld Merkmale des entsprechenden Abschnittsheaders für Abschnitte hinzugefügt werden, die ausführbaren Code enthalten. Weitere Informationen zum Hinzufügen von Attributen zu einem Abschnitt finden Sie in der Dokumentation zu Ihrem Linker.