Steuern des Gerätezugriffs in KMDF-Treibern

Treiber müssen dazu beitragen, benutzer daran zu hindern, unangemessen auf die Geräte und Dateien eines Computers zuzugreifen. Um nicht autorisierten Zugriff auf Geräte und Dateien zu verhindern, müssen Sie:

  • Benennen Sie Geräteobjekte nur bei Bedarf.

  • Stellen Sie Sicherheitsbeschreibungen für Geräteobjekte und Schnittstellen bereit.

Benennen von Geräteobjekten nur bei Bedarf

Wie die meisten WDM-Treiber (Windows Driver Model) benennen Framework-basierte Treiber ihre Geräteobjekte in der Regel nicht. Anwendungen können auf ein Gerät zugreifen, indem sie einen Geräteobjektnamen angeben, sodass jeder zusätzliche Geräteobjektname einen zusätzlichen Pfad darstellt, den eine Anwendung für den Zugriff auf das Gerät verwenden kann.

Um nicht autorisierten Zugriff auf ein Gerät zu verhindern, kann jeder Treiber beim Benennen eines Geräteobjekts einen Sicherheitsdeskriptor angeben. Der Dateiname, den das Betriebssystem für einen Treiber bereitstellt (siehe WdfFileObjectGetFileName), enthält jedoch nicht den Von der Anwendung verwendeten Geräteobjektnamen. Wenn mehrere Treiber im Treiberstapel Namen für ihre Geräteobjekte angeben, kann Ihr Treiber daher nicht ermitteln, welchen Objektnamen die Anwendung zum Öffnen des Geräts verwendet hat. Daher kann eine Anwendung das Gerät mit einem weniger restriktiven Sicherheitsdeskriptor öffnen, als ihr Treiber erwartet.

Physische Geräteobjekte (PDOs) müssen Namen aufweisen. In der Regel geben frameworkbasierte Bustreiber keinen Namen für eine PDO an, da das Framework (standardmäßig) das Betriebssystem anweist, einen Namen zu generieren.

Andererseits kann ein frameworkbasierter Treiber einem Geräteobjekt einen Gerätenamen zuweisen, indem er WdfDeviceInitAssignName aufruft. Ein Treiber sollte nur dann ein funktionales Geräteobjekt (FDO) benennen, geräteobjekt (Filter DO) oder PDO filtern, wenn der Treiber eine ältere Anwendung unterstützen muss, die einen bestimmten Gerätenamen erwartet, oder wenn der Treiber zu einem älteren Treiberstapel gehört, dessen Architektur Objektnamen erfordert.

Anstatt FDOs zu benennen und DOs zu filtern, sollten WDM-Treiber und frameworkbasierte Treiber Geräteschnittstellen bereitstellen, auf die Anwendungen zugreifen können. Das Betriebssystem ruft den Sicherheitsdeskriptor einer Geräteschnittstelle aus der PDO des Geräts und aus Registrierungseinträgen ab, die in der INF-Datei eines Treiberpakets angegeben sind. Ein Bustreiber kann Geräteschnittstellen für eine PDO bereitstellen, wenn die Geräte des Treibers im Rohmodus ohne Funktionstreiber betrieben werden.

Einige Treiber müssen WdfDeviceCreateSymbolicLink aufrufen, um symbolische Linknamen für ihre Geräte zu erstellen. Beispielsweise kann ein Treiber einen MS-DOS-Gerätenamen erstellen, wenn Anwendungen einen MS-DOS-Namen für das Gerät erwarten. Wenn Ihr Treiber einen symbolischen Linknamen für eine unbenannte FDO oder einen Filter DO erstellt, ordnet das Framework den symbolischen Linknamen dem Namen der PDO zu. (Steuerelementgeräte sind keinem PDO zugeordnet, sodass Ihr Treiber keinen symbolischen Linknamen für ein unbenannte Steuerelementgerät erstellen kann.)

Bereitstellen von Sicherheitsbeschreibungen für Geräteobjekte und Schnittstellen

Jedes benannte Geräteobjekt muss über einen Sicherheitsdeskriptor verfügen. Das Betriebssystem verwendet den Sicherheitsdeskriptor des Geräteobjekts, um die Benutzertypen zu bestimmen, die auf ein Gerät und dessen Geräteschnittstellen zugreifen dürfen. Sicherheitsbeschreibungen können Geräteobjekten wie folgt zugewiesen werden:

  • Das Betriebssystem, das einen Standardsicherheitsdeskriptor für Geräteobjekte bereitstellt (siehe Steuern des Gerätezugriffs).

  • Das Framework, das einen Standardsicherheitsdeskriptor (mithilfe des SDDL_DEVOBJ_SYS_ALL_ADM_ALL-Werts) bereitstellt, wenn Ihr Treiber WdfDeviceInitAssignName aufruft, um einem Geräteobjekt einen Namen zuzuweisen (siehe SDDL für Geräteobjekte).

  • Ihr Treiber, der den Standardsicherheitsdeskriptor des Frameworks überschreiben kann, indem WdfDeviceInitAssignSDDLString aufgerufen wird.

Standardmäßig verwendet das Betriebssystem auch den Sicherheitsdeskriptor des Geräte-PDO, um Zugriffsrechte für die Geräteschnittstellen zu bestimmen, die ein Treiber bereitstellt.

Ein Treiberpaket kann eine INF-Datei bereitstellen, die die Sicherheitsbeschreibungen eines Geräts mit einer INF-AddReg-Direktive innerhalb eines INF DDInstall.HW-Abschnitts angibt.

Weitere Informationen zum Angeben von Sicherheitsbeschreibungen in INF-Dateien finden Sie unter Erstellen sicherer Geräteinstallationen.

Wenn Ihr Treiber PDOs für Geräte erstellt, die im Unformatierten Modus arbeiten, muss der Treiber eine Gerätesetupklasse angeben, wenn er WdfPdoInitAssignRawDevice aufruft. Wenn Ihr Treiber Steuergeräte erstellt, kann er außerdem WdfDeviceInitSetDeviceClass aufrufen, um eine Gerätesetupklasse anzugeben. In beiden Fällen können Systemadministratoren den Registrierungsschlüssel der angegebenen Setupklasse verwenden, um Sicherheitsbeschreibungen für das Gerät zu speichern.

Informationen dazu, wie das Betriebssystem bestimmt, welcher Sicherheitsdeskriptor für ein Gerät verwendet werden soll, finden Sie unter Steuern des Gerätezugriffs.

Wenn das Framework ein Geräteobjekt erstellt, wird immer das flag FILE_DEVICE_SECURE_OPEN festgelegt, damit das Betriebssystem den Sicherheitsdeskriptor eines Geräts überprüft, bevor es einer Anwendung den Zugriff auf Namen innerhalb des Namespaces des Geräts zulässt. Weitere Informationen zum FILE_DEVICE_SECURE_OPEN-Flags und Gerätenamespace finden Sie unter Steuern des Gerätenamespacezugriffs.