Sicherheitsüberprüfungen der Treiberüberprüfung

Die Option Sicherheitsüberprüfungen der Treiberüberprüfung überwacht den Treiber auf häufige Fehler, die zu Sicherheitsrisiken führen können. Diese Option ist ab Windows Vista verfügbar.

Insbesondere sucht die Option Sicherheitsüberprüfungen nach dem folgenden fehlerhaften Treiberverhalten:

  • Aufruf von Kernel-ZwXxx-Routinen mit Benutzermodusadressen als Parameter. Wenn der Treiber ZwXxx-Routinen aufruft, überprüft driver verifier, ob keiner der Parameter Benutzermodusadressen ist. Beim Aufrufen einer ZwXxx-Routine wird der aktuelle KPROCESSOR_MODE zu KernelMode, und alle an diese Routine übergebenen Parameter werden so behandelt, als wären sie Kernelmodusadressen. Daher muss der Treiber alle Benutzermoduspuffer testen, die von Anwendungen empfangen werden, und sie im Kernelmodusspeicher platzieren (z. B. in einem Poolblock oder einer Datenstruktur, die auf dem Kernelstapel zugeordnet ist), bevor die Kernel-ZwXxx-Routine aufgerufen wird. Der Treiber muss den erfassten Puffer anstelle des Benutzermoduspuffers als Parameter der ZwXxx-Routine verwenden.

  • Aufruf von Kernel-ZwXxx-Routinen mit falsch formatierten UNICODE_STRINGs als Parameter. Wenn der Treiber eine ZwXxx-Routine aufruft, überprüft Driver Verifier alle Parameter, die UNICODE_STRING Werte sind. Häufige Fehler, die von der Treiberüberprüfung in solchen Zeichenfolgen erkannt werden, sind:

    • Das Pufferfeld verweist auf den Arbeitsspeicher im Benutzermodus.
    • Die Parameter Length oder MaximumLength sind falsch. Beispiel: Maximale Länge der Länge.< Oder einer oder beide dieser Werte ist eine ungerade Zahl. Beide Werte müssen immer gerade sein, da sie die Anzahl von Bytes darstellen, die für die Darstellung einer Unicode-Zeichenfolge verwendet werden.
  • Das Aufrufen von Kernel-ZwXxx-Routinen mit einer falschen OBJECT_ATTRIBUTES-Struktur als Parameter. Wenn der Treiber eine ZwXxx-Routine aufruft, überprüft Driver Verifier alle Parameter, die OBJECT_ATTRIBUTE Strukturen sind. Die Member jedes OBJECT_ATTRIBUTE Strukturparameters unterliegen den gleichen Überprüfungen für Benutzermodusadressen und UNICODE_STRING Werte, die oben beschrieben werden.

  • Inkonsistente Parameter für Irp-RequestorMode> und E/A-Anforderung. Wenn Irp -> RequestorMode auf KernelMode festgelegt ist, überprüft driver verifier, ob keine E/A-Anforderungsparameter , Irp-AssociatedIrp.SystemBuffer> oder Irp-UserBuffer>, Benutzermodusadressen sind.

Ab Windows 7 überprüft Driver Verifier beim Aktivieren einer Treiberüberprüfungsoption das folgende Treiberverhalten:

Der Objektverweisindikator ändert sich von 0 auf 1. Wenn der Windows-Kernelobjekt-Manager ein Objekt erstellt, z. B. ein File-Objekt oder ein Thread-Objekt, wird der Verweisindikator des neuen Objekts auf 1 festgelegt. Aufrufe von Systemfunktionen wie ObReferenceObjectByPointer oder ObReferenceObjectByHandle erhöhen den Verweisindikator. Jeder Aufruf von ObDereferenceObject für dasselbe Objekt dekrementiert den Verweisindikator.

Nachdem der Verweisindikator den Wert 0 erreicht hat, kann das Objekt freigegeben werden. Der Objekt-Manager kann es sofort freigeben oder später freigeben. Driver Verifier prüft auf nachfolgende Aufrufe von ObReferenceObjectByPointer und ObReferenceObject für dasselbe Objekt. Durch diese Aufrufe wird der Verweisindikator von 0 in 1 geändert, was bedeutet, dass der Treiber den Verweiszähler eines bereits freigegebenen Objekts erhöht hat. Dies ist immer falsch, da andere Speicherbelegungen beschädigt werden können.

Aktivieren dieser Option

Sie können die Option Sicherheitsüberprüfungen für einen oder mehrere Treiber aktivieren, indem Sie den Treiberüberprüfungs-Manager oder die Verifier.exe Befehlszeile verwenden. Ausführliche Informationen finden Sie unter Auswählen von Treiberüberprüfungsoptionen.

  • Verwenden der Befehlszeile

    In der Befehlszeile wird die Option Sicherheitsüberprüfungen durch Bit 8 (0x100) dargestellt. Verwenden Sie zum Aktivieren von Sicherheitsüberprüfungen den Flagwert 0x100, oder fügen Sie dem Flagwert 0x100 hinzu. Beispiel:

    verifier /flags 0x100 /driver MyDriver.sys
    

    Die Option ist aktiv, nachdem Sie den Computer neu gestartet haben.

    Ab Windows Vista können Sie Sicherheitsüberprüfungen auch aktivieren und deaktivieren, ohne den Computer neu zu starten, indem Sie dem Befehl den Parameter /volatile hinzufügen. Beispiel:

    verifier /volatile /flags 0x100 /adddriver MyDriver.sys
    

    Diese Einstellung ist sofort wirksam, geht aber verloren, wenn Sie den Computer herunterfahren oder neu starten. Ausführliche Informationen finden Sie unter Verwenden flüchtiger Einstellungen.

    Die Option Sicherheitsüberprüfungen ist auch in den Standardeinstellungen enthalten. Beispiel:

    verifier /standard /driver MyDriver.sys
    
  • Verwenden des Treiberüberprüfungs-Managers

    1. Starten Sie den Treiberüberprüfungs-Manager. Geben Sie Verifier in ein Eingabeaufforderungsfenster ein.
    2. Wählen Sie Benutzerdefinierte Einstellungen erstellen (für Codeentwickler) aus, und klicken Sie dann auf Weiter.
    3. Wählen Sie Einzelne Einstellungen aus einer vollständigen Liste auswählen aus.
    4. Wählen Sie Sicherheitsüberprüfungen aus.

    Die Sicherheitsüberprüfungsfunktion ist auch in den Standardeinstellungen enthalten. Um dieses Feature im Treiberüberprüfungs-Manager zu verwenden, klicken Sie auf Standardeinstellungen erstellen.