Freigeben über


Sicherheitsprobleme für Abschnittsobjekte und -ansichten

Treiber, die Abschnitte und Ansichten erstellen, die nicht für den Benutzermodus freigegeben werden sollen, müssen das folgende Protokoll verwenden, wenn sie mit Abschnitten und Ansichten arbeiten:

  • Der Treiber muss ein Kernelhandle verwenden, wenn er ein Handle für das Section-Objekt öffnet. Treiber können sicherstellen, dass ein Handle ein Kernelhandle ist, indem sie es entweder im Systemprozess erstellen oder das OBJ_KERNEL_HANDLE-Attribut für das Handle angeben. Weitere Informationen finden Sie unter Objekthandles.

  • Die Ansicht darf nur aus einem Systemthread zugeordnet werden. (Andernfalls ist der Zugriff auf die Ansicht von dem Prozess aus möglich, in dessen Kontext sie erstellt wird.) Ein Treiber kann sicherstellen, dass die Ansicht aus dem Systemprozess zugeordnet wird, indem er einen System workerthread verwendet, um den Zuordnungsvorgang auszuführen. Weitere Informationen finden Sie unter System Worker-Threads und Treiberthreadkontext.

Treiber, die eine Ansicht mit einem Benutzermodusprozess teilen, müssen das folgende Protokoll verwenden, wenn sie mit Abschnitten und Ansichten arbeiten:

  • Der Treiber, nicht der Benutzermodusprozess, muss das Abschnittsobjekt erstellen und die Ansichten zuordnen.

  • Wie bereits erwähnt, muss der Treiber ein Kernelhandle verwenden, wenn er ein Handle für das Section-Objekt öffnet. Treiber können sicherstellen, dass ein Handle ein Kernelhandle ist, indem sie es entweder im Systemprozess erstellen oder das OBJ_KERNEL_HANDLE-Attribut für das Handle angeben. Weitere Informationen finden Sie unter Objekthandles.

  • Die Ansicht wird im Threadkontext des Prozesses zugeordnet, der die Ansicht gemeinsam verwendet. Ein Treiber der höchsten Ebene kann garantieren, dass die Ansicht im aktuellen Prozesskontext zugeordnet wird, indem er den Zuordnungsvorgang in einer Dispatch-Routine wie DispatchDeviceControl ausführt. Verteilungsroutinen von Treibern niedrigerer Ebene werden in einem beliebigen Threadkontext ausgeführt und können daher keine Ansicht in einer Dispatchroutine sicher zuordnen. Weitere Informationen finden Sie unter Treiberthreadkontext.

  • Alle Speicherzugriffe auf die Ansicht innerhalb des Treibers müssen mitAusnahme von Try-Blöcken- geschützt werden. Eine böswillige Anwendung im Benutzermodus kann die Zuordnung der Ansicht aufheben oder den Schutzstatus der Ansicht ändern. Beides würde zu einem Systemabsturz führen, es sei denn,es wird durch einenTry-Ausnahmeblock- geschützt. Weitere Informationen finden Sie unter Behandeln von Ausnahmen.

Der Treiber muss auch den Inhalt der Ansicht nach Bedarf überprüfen. Der Treiberschreiber kann nicht davon ausgehen, dass nur eine vertrauenswürdige Benutzermoduskomponente Zugriff auf die Ansicht hat.

Ein Treiber, der ein Abschnittsobjekt für eine Anwendung im Benutzermodus freigeben muss (die eigene Ansichten erstellen können muss), muss das folgende Protokoll verwenden:

  • Der Treiber, nicht der Benutzermodusprozess, muss das Abschnittsobjekt erstellen. Treiber dürfen niemals ein Handle verwenden, das aus dem Benutzermodus übergeben wurde.

  • Bevor das Handle an den Benutzermodus übergeben wird, muss der Treiber ObReferenceObjectByHandle aufrufen, um einen Verweis auf das Abschnittsobjekt abzurufen. Dadurch wird verhindert, dass eine böswillige Anwendung das Abschnittsobjekt durch Schließen des Handles löscht. Der Objektverweis sollte in der Geräteerweiterung des Treibers gespeichert werden.

  • Nachdem der Treiber das section-Objekt nicht mehr verwendet, muss er ObDereferenceObject aufrufen, um den Objektverweis freizugeben.

Auf Systemen, auf denen Microsoft Windows Server 2003 mit Service Pack 1 (SP1) und höheren Versionen ausgeführt wird, können nur Kernelmodustreiber \Device\PhysicalMemory öffnen. Treiber können jedoch entscheiden, einer Benutzeranwendung ein Handle zu geben. Um Sicherheitsprobleme zu vermeiden, sollten nur Benutzeranwendungen, denen der Treiber vertraut, Zugriff auf \Device\PhysicalMemory erhalten.