Ausführungsschutz

Veröffentlicht: 22. Jul 2004 | Aktualisiert: 14. Nov 2004

Ausführungsschutz (auch bekannt als NX oder No eXecute) verhindert die Codeausführung in Datenseiten, wie etwa dem Standardheap, verschiedenen Stacks und Speicherpools. Der Schutz kann im Benutzer- und im Kernelmodus angewendet werden.

Der Entwickler wird außerdem dazu gezwungen, die Ausführung von Code in Datenseiten zu vermeiden, ohne die Seiten explizit als ausführbar zu markieren. Dies führt zu einem guten Softwareengineering und zur Verwendung praxisbewährter Vorgehensweisen bei der Entwicklung von Anwendungen und Treibern.

Der Ausführungsschutz ist eine Betriebssystemfunktion, die darauf basiert, dass Prozessorhardware den Speicher mit einem Attribut markiert, das darauf hinweist, dass in diesem Speicherbereich kein Code ausgeführt werden darf. Der Ausführungsschutz funktioniert auf der Basis einzelner virtueller Speicherseiten. Dabei wird zum Markieren der Speicherseite meist ein Bit in der PTE-Tabelle (Page Table Entry) verwendet.

Die tatsächliche Hardwareimplementierung des Ausführungsschutzes und die Markierung der virtuellen Speicherseite ist von der jeweiligen Prozessorarchitektur abhängig. Prozessoren, die den Ausführungsschutz unterstützen, können eine Ausnahmebedingung auslösen, wenn Code in einer Seite ausgeführt wird, für die das betreffende Attribut gesetzt wurde. Die 32-Bit-Version von Windows nutzt derzeit das Prozessorfeature NX-Seitenschutz, das von Advanced Micro Devices (AMD) definiert wurde. Dieses Prozessorfeature setzt voraus, dass der Prozessor im PAE-Modus (Physical Address Extension) ausgeführt wird.

Wenngleich die einzigen zurzeit verfügbaren Prozessorfamilien mit Windows-kompatibler Hardwareunterstützung für den Ausführungsschutz die Prozessorfamilien AMD K8 und Intel Itanium sind, wird davon ausgegangen, dass die zukünftigen 32-Bit- und 64-Bit-Prozessoren einen Ausführungsschutz bereitstellen. Microsoft ist auf diesen Trend vorbereitet und fördert ihn durch die Unterstützung des Ausführungsschutzes in den Windows-Betriebssystemen.

Anwendungs- und Treiberentwickler sollten mit dem Ausführungsschutz und den Anforderungen an die Software auf einer unterstützenden Plattform vertraut sein. Anwendungen, die Code Just-In-Time (JIT) generieren oder Speicher aus dem Standardprozessstack oder -heap ausführen, sollten die Anforderungen des Ausführungsschutzes genau beachten.

Treiberentwickler sollten sich über den PAE-Modus auf Plattformen informieren, die den Ausführungsschutz unterstützen. Das Verhalten des PAE-Modus auf Windows-Systemen mit weniger als 4 GB physischem Speicher wurde geändert, um die Treiberinkompatibilitäten zu verringern.

Microsoft unterstützt neue Prozessoren mit integriertem Ausführungsschutz, indem Windows, beginnend mit Microsoft Windows XP Service Pack 2, erweitert wird. Der Ausführungsschutz bietet offensichtliche Vorteile im Hinblick auf Angriffe durch Pufferüberläufe und unterstützt die Anwendung von optimalen Programmiertechniken durch die Entwickler von Microsoft und Drittanbietern.

Dieses Service Pack hat zwei neue Funktionen eingeführt.

  • Ausführungsschutz in 64-Bit-Versionen von Windows
    64-Bit-Versionen von Windows für 64-Bit-fähige Prozessoren können Anwendungsprogramme im 64-Bit-Modus ausführen, der auch als nativer Modus bezeichnet wird.

    Unabhängig von der Prozessorarchitektur wird der Ausführungsschutz im Kernelmodus für 64-Bit-Versionen von Windows für den Stack, den ausgelagerten Pool und den Sitzungspool angewendet. Der Ausführungsschutz wird in Windows XP Service Pack 2 standardmäßig aktiviert und es gibt keine Möglichkeit, ihn zu deaktivieren.

    64-Bit-Anwendungen sollten keinen Code aus dem Stack oder dem Standardprozessheap ausführen. Anwendungen, die ausführbaren Speicher zuweisen wollen, können dazu VirtualAlloc() eines der PAGE_EXECUTE-Speicherattribute verwenden.

  • Ausführungsschutz in 32-Bit-Versionen von Windows und Anwendungen
    Für diese Funktion gibt es zwei Modi.

    • Ausführungsschutz im Benutzermodus
      Es wird davon ausgegangen, dass viele Computer unter Windows und mit Windows-kompatiblen Anwendungen in absehbarer Zukunft 32-Bit-Prozessoren zusammen mit 32-Bit-Versionen von Windows verwenden werden. Neue Prozessoren, wie etwa der AMD Opteron und Athlon-64, unterstützen jedoch sowohl den 32-Bit- als auch den 64-Bit-Betriebsmodus (legacy bzw. nativ). Diese kombinierten 32-Bit- und 64-Bit-Prozessoren können in einer reinen Legacyumgebung (32-Bit-Betriebssystem mit 32-Bit-Anwendungen) und bei aktiviertem PAE-Modus mit Ausführungsschutz ausgeführt werden.

      Microsoft überprüft Methoden zur Deaktivierung bzw. Aktivierung des Ausführungsschutzes für einzelne 32-Bit-Anwendungen. Es wird davon ausgegangen, dass 64-Bit-Anwendungen mit standardmäßig aktiviertem Ausführungsschutz arbeiten.

      Eine durch den Ausführungsschutz ausgelöste Ausnahmebedingung führt auf Windows-Systemen zum Statuscode STATUS_ACCESS_VIOLATION (0xc0000005). In den meisten Prozessen handelt sich dabei um eine unbehandelte Ausnahmebedingung, sodass der Prozess beendet wird.

    • Ausführungsschutz im Kernelmodus
      Der Ausführungsschutz funktioniert im Benutzer- und im Kernelmodus. Der Ausführungsschutz für Speicherbereiche im Kernelmodus kann nicht für einzelne Treiber aktiviert bzw. deaktiviert werden. Bei 32-Bit-Versionen von Windows wird der Ausführungsschutz standardmäßig nur auf den Stack angewendet. Dies unterscheidet sie von den 64-Bit-Versionen von Windows, wo der Ausführungsschutz für Stack, ausgelagerten Pool und Sitzungspool verwendet wird.

      Eine Zugriffsverletzung des Ausführungsschutzes im Kernelmodus führt zu einer Fehlerüberprüfung 0xFC:
      ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY.

Implikationen für den Entwickler

pfeilrechts.gif Einführung
pfeilrechts.gif Erhöhter Netzwerkschutz
pfeilrechts.gif Neuer Speicherschutz
pfeilrechts.gif Verbesserte E-Mail-Sicherheit
pfeilrechts.gif Erweiterte Sicherheit beim Browsen
pfeilrechts.gif Zusammenfassung