Freigeben über


Behandeln der Verwaltung

Eine wichtige Quelle für Sicherheitsprobleme innerhalb von Treibern ist die Verwendung von Handles, die zwischen Benutzermodus- und Kernelmoduskomponenten übergeben werden. Es gibt eine Reihe bekannter Probleme mit der Behandlung der Verwendung innerhalb der Kernelumgebung, einschließlich der folgenden:

  • Eine Anwendung, die den falschen Handletyp an einen Kerneltreiber übergibt. Möglicherweise stürzt der Kerneltreiber ab, um ein Ereignisobjekt zu verwenden, bei dem ein Dateiobjekt benötigt wird.

  • Eine Anwendung, die ein Handle an ein Objekt übergibt, für das er nicht über den erforderlichen Zugriff verfügt. Der Kerneltreiber kann einen Vorgang ausführen, der funktioniert, da der Aufruf aus dem Kernelmodus stammt, obwohl der Benutzer nicht über ausreichende Berechtigungen verfügt.

  • Eine Anwendung, die einen Wert übergibt, der kein gültiger Handle im Adressbereich ist, aber als Systemhandle gekennzeichnet ist, um einen bösartigen Vorgang gegen das System auszuführen.

  • Eine Anwendung, die einen Wert übergibt, der kein geeignetes Handle für das Geräteobjekt ist (ein Handle, das dieser Treiber nicht erstellt hat).

Um diese Probleme zu schützen, muss ein Kerneltreiber besonders vorsichtig sein, um sicherzustellen, dass die übergebenen Handles gültig sind. Die sicherste Richtlinie besteht darin, alle erforderlichen Handles im Kontext des Treibers zu erstellen. Diese Handles, die von Kerneltreibern erstellt werden, sollten die option OBJ_KERNEL_HANDLE angeben, die ein Handle erstellt, das im beliebigen Prozesskontext gültig ist und auf das nur über einen Kernelmodusaufrufer zugegriffen werden kann.

Für Treiber, die von einem Anwendungsprogramm erstellte Handles verwenden, muss die Verwendung dieser Handles mit extremer Sorgfalt erfolgen:

  • Die bewährte Methode besteht darin, das Handle in einen Objektzeiger zu konvertieren, indem Sie ObReferenceObjectByHandle aufrufen und den richtigen AccessMode -Parameter (in der Regel von Irp-RequestorMode>), DesiredAccess und ObjectType angeben, z. B. IoFileObjectType oder ExEventObjectType.

  • Wenn ein Handle direkt innerhalb eines Aufrufs verwendet werden muss, empfiehlt es sich, die Nt-Varianten von Funktionen anstelle der Zw-Varianten von Funktionen zu verwenden. Dadurch wird die Überprüfung von Parametern durch das Betriebssystem erzwungen und behandelt, da der vorherige Modus "UserMode" ist und daher nicht vertrauenswürdig ist. Beachten Sie, dass parameter, die an Nt-Funktionen übergeben werden, die Zeiger sind, möglicherweise eine Überprüfung fehlschlagen, wenn der vorherige Modus "UserMode" ist. Die Nt- und Zw-Routinen geben einen IoStatusBlock-Parameter mit Fehlerinformationen zurück, die Sie auf Fehler überprüfen sollten.

  • Fehler müssen bei Bedarf auch mit __try und __except abgefangen werden. Viele der Cache-Manager (Cc), Speicher-Manager (Mm) und Dateisystem-Laufzeitbibliotheksroutinen (FsRtl) lösen eine Ausnahme aus, wenn ein Fehler auftritt.

Kein Treiber sollte sich jemals auf Handles oder Parameter verlassen, die von einer Benutzermodusanwendung übergeben werden, ohne geeignete Vorkehrungen zu treffen.

Beachten Sie, dass bei Verwendung der Nt-Variante zum Öffnen einer Datei auch die Nt-Variante zum Schließen der Datei verwendet werden muss.