Freigeben über


Datenausführungsverhinderung

Die 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ührbare Datei zu markieren. Das Markieren von Speicherbereichen als nicht ausführbare Datei bedeutet, dass Code nicht aus diesem Speicherbereich ausgeführt werden kann, was die Ausnutzung von Pufferüberläufen erschwert.

DEP verhindert, dass Code von Datenseiten wie dem Standard-Heap, Stapeln und Speicherpool ausgeführt wird. Wenn eine Anwendung versucht, Code von einer geschützten Datenseite auszuführen, tritt eine Ausnahme für den Speicherzugriff auf, und wenn die Ausnahme nicht behandelt wird, wird der Aufrufvorgang beendet.

DEP soll keine umfassende Verteidigung gegen alle Exploits sein; es ist ein weiteres Tool, das Sie verwenden können, um Ihre Anwendung zu sichern.

Funktionsweise der Datenausführungsverhinderung

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 virtuellen Speicherschutz Attribute zuweisen und festlegen. Der zugewiesene Speicher muss beim Zuweisen des Speichers PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITEoder PAGE_EXECUTE_WRITECOPY markiert werden. Heap-Zuordnungen durch Aufrufen der malloc- und HeapAlloc--Funktionen sind nicht ausführbar.

Anwendungen können keinen Code aus dem Standardprozess-Heap oder dem Stapel ausführen.

DEP wird beim Systemstart entsprechend der Richtlinieneinstellung zum Schutz von Seiten 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 zuzuweisen. Es wird empfohlen, dass eine Anwendung mindestens die Option PAGE_EXECUTE Speicherschutz festgelegt ist. Nachdem der ausführbare Code generiert wurde, empfiehlt es sich, den Speicherschutz der Anwendung festzulegen, um schreibgeschützten Zugriff auf den zugewiesenen Speicher zu verbieten. Anwendungen können schreibgeschützten Zugriff auf den zugewiesenen Arbeitsspeicher mithilfe der funktion VirtualProtect nicht zulassen. Die Verwendung des Schreibzugriffs stellt einen maximalen Schutz für ausführbare Bereiche des Prozessadressraums sicher. Sie sollten versuchen, Anwendungen zu erstellen, die den kleinsten ausführbaren Adressraum verwenden, der die Speicherauslastung minimiert.

Sie sollten auch versuchen, das Layout des virtuellen Speichers Ihrer Anwendung zu steuern und ausführbare Bereiche zu erstellen. Diese ausführbaren Bereiche sollten sich in einem niedrigeren Speicherplatz befinden als nicht ausführbare Regionen. Durch die Suche nach ausführbaren Regionen unter nicht ausführbaren Regionen können Sie verhindern, dass ein Pufferüberlauf in den ausführbaren Speicherbereich übergeht.

Anwendungskompatibilität

Einige Anwendungsfunktionen sind nicht mit DEP kompatibel. Anwendungen, die dynamische Codegenerierung (z. B. Just-In-Time Codegenerierung) ausführen und nicht explizit generierten Code mit Ausführungsberechtigung markieren, können Kompatibilitätsprobleme auf Computern aufweisen, die DEP verwenden. Anwendungen, die in 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 Datei gekennzeichnet 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 (allgemein als Thunks bezeichnet) in den Datenabschnitten platzieren. DEP markiert jedoch Abschnitte der Bilddatei, die im Arbeitsspeicher geladen wird, als nicht ausführbare Datei, es sei denn, der Abschnitt hat das ausführbare Attribut angewendet.

Aus diesem Grund sollten 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 gekennzeichnet werden. Das ausführbare Attribut IMAGE_SCN_MEM_EXECUTEsollte dem Feld Merkmale Feld der entsprechenden Abschnittsüberschrift 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, die in Ihrem Linker enthalten ist.

Datenausführungsverhinderung

Konfigurieren von Speicherschutz in Windows XP SP2-