Datenausführungsverhinderung

Data Execution Prevention (DEP) ist ein Speicherschutzfeature auf Systemebene, das ab Windows XP und Windows Server 2003 in das Betriebssystem integriert ist. DEP ermöglicht es dem System, eine oder mehrere Speicherseiten als nicht ausführbar zu kennzeichnen. Das Markieren von Speicherbereichen als nicht ausführbar bedeutet, dass Code nicht aus dieser Speicherregion ausgeführt werden kann, was die Ausnutzung von Pufferüberläufen erschwert.

DEP verhindert, dass Code von Datenseiten wie dem Standardheap, Stapeln und Speicherpools ausgeführt wird. Wenn eine Anwendung versucht, Code von einer geschützten Datenseite auszuführen, tritt eine Speicherzugriffsverletzungs-Ausnahme auf, und wenn die Ausnahme nicht behandelt wird, wird der aufrufende Prozess beendet.

DEP soll keine umfassende Verteidigung gegen alle Exploits sein; Es soll ein weiteres Tool sein, mit dem Sie Ihre Anwendung schützen können.

Funktionsweise der Datenausführungsprävention

Wenn eine Anwendung versucht, Code von einer geschützten Seite auszuführen, erhält die Anwendung eine Ausnahme mit dem status Code STATUS_ACCESS_VIOLATION. Wenn Ihre Anwendung Code über eine Speicherseite ausführen muss, müssen sie die richtigen Attribute für den Schutz virtueller Speicher zuordnen und festlegen. Der zugewiesene Arbeitsspeicher muss beim Zuweisen von Arbeitsspeicher PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE oder PAGE_EXECUTE_WRITECOPY gekennzeichnet werden. Heapzuordnungen, die durch aufrufen der Malloc - und HeapAlloc-Funktionen vorgenommen werden, sind nicht ausführbar.

Anwendungen können keinen Code aus dem Standardprozessheap oder dem Stapel ausführen.

DEP wird beim Systemstart gemäß der Richtlinieneinstellung "Seitenschutz 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 Arbeitsspeicher mit den entsprechenden Speicherschutzoptionen zuzuweisen. Es wird empfohlen, dass eine Anwendung mindestens die Option PAGE_EXECUTE Speicherschutz festgelegt. Nachdem der ausführbare Code generiert wurde, wird empfohlen, dass die Anwendung speicherschutzt, um den Schreibzugriff auf den zugewiesenen Arbeitsspeicher zu verweigern. Anwendungen können den Schreibzugriff auf den zugeordneten Arbeitsspeicher mithilfe der VirtualProtect-Funktion verweigern. Das Aufheben des Schreibzugriffs gewährleistet maximalen Schutz für ausführbare Bereiche des Prozessadressraums. Sie sollten versuchen, Anwendungen zu erstellen, die den kleinsten möglichen ausführbaren Adressraum verwenden, wodurch die Arbeitsspeicherauslastung minimiert wird.

Sie sollten auch versuchen, das Layout des virtuellen Arbeitsspeichers Ihrer Anwendung zu steuern und ausführbare Regionen zu erstellen. Diese ausführbaren Regionen sollten sich in einem niedrigeren Speicherplatz befinden als nicht ausführbare Regionen. Indem Sie ausführbare Regionen unterhalb nicht ausführbarer 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 eine dynamische Codegenerierung (z. B. just-In-Time-Codegenerierung) ausführen und generierten Code nicht explizit mit der Ausführungsberechtigung markieren, weisen möglicherweise Kompatibilitätsprobleme auf Computern auf, die DEP verwenden. Anwendungen, die auf die Active Template Library (ATL) Version 7.1 und früher geschrieben wurden, können versuchen, Code auf Seiten auszuführen, die als nicht ausführbare Dateien gekennzeichnet sind, wodurch ein NX-Fehler ausgelöst und die Anwendung beendet wird. Weitere Informationen finden Sie unter SetProcessDEPPolicy. Die meisten Anwendungen, die mit DEP nicht kompatible Aktionen ausführen, müssen aktualisiert werden, damit sie ordnungsgemäß funktionieren.

Eine kleine Anzahl ausführbarer Dateien und Bibliotheken kann ausführbaren Code im Datenabschnitt einer Imagedatei enthalten. In einigen Fällen können Anwendungen kleine Codesegmente (allgemein als Thunks bezeichnet) in den Datenabschnitten platzieren. DeP markiert jedoch Abschnitte der Imagedatei, die in den Arbeitsspeicher geladen werden, als nicht ausführbar, es sei denn, im Abschnitt wird das ausführbare Attribut angewendet.

Daher sollte ausführbarer Code in Datenabschnitten in einen 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 ihres Linkers.

Datenausführungsverhinderung

Konfigurieren des Speicherschutzes in Windows XP SP2