KMDF ドライバーでのデバイス アクセスの制御

ドライバーは、ユーザーがコンピューターのデバイスやファイルに不適切にアクセスするのを防ぐのに役立つ必要があります。 デバイスとファイルへの不正アクセスを防ぐには、次の手順を実行する必要があります。

  • 必要な場合にのみ、デバイス オブジェクトに名前を付けます。

  • デバイス オブジェクトとインターフェイスのセキュリティ記述子を提供します。

必要な場合にのみ、デバイス オブジェクトに名前を付ける

ほとんどの Windows ドライバー モデル (WDM) ドライバーと同様に、フレームワークベースのドライバーでは通常、デバイス オブジェクトの名前は付けられません。 アプリケーションはデバイス オブジェクト名を指定することでデバイスにアクセスできるため、追加の各デバイス オブジェクト名は、アプリケーションがデバイスへのアクセスに使用できる追加のパスを表します。

デバイスへの不正アクセスを防ぐために、各ドライバーは、デバイス オブジェクトに名前を付けるときにセキュリティ記述子を指定できます。 ただし、オペレーティング システムがドライバーに提供するファイル名 (「WdfFileObjectGetFileName」 を参照) には、アプリケーションが使用したデバイス オブジェクト名は含まれません。 そのため、ドライバーのスタック内の複数のドライバーがデバイス オブジェクトの名前を提供する場合、ドライバーは、アプリケーションがデバイスを開くためにどのオブジェクト名を使用したかを判断できません。 その結果、アプリケーションは、ドライバーが期待するよりも制限の緩いセキュリティ記述子でデバイスを開く可能性があります。

物理デバイス オブジェクト (PDO) には名前が必要です。 通常、フレームワークベースのバス ドライバーは PDO の名前を指定しません。これは、フレームワークが (既定で) オペレーティング システムに名前を生成するように指示するためです。

一方、フレームワークベースのドライバーは、WdfDeviceInitAssignName を呼び出すことによって、デバイス オブジェクトにデバイス名を割り当てることができます。 ドライバーは、ドライバーが特定のデバイス名を必要とする古いアプリケーションをサポートする必要がある場合、またはドライバーがオブジェクト名を必要とするアーキテクチャの古いドライバー スタックに属している場合にのみ、機能デバイス オブジェクト (FDO)、フィルター デバイス オブジェクト (フィルター DO)、または PDO に名前を付ける必要があります。

WDM ドライバーとフレームワークベースのドライバーは、FDO とフィルター DO に名前を付けるのではなく、アプリケーションがアクセスできるデバイス インターフェイスを提供する必要があります。 オペレーティング システムは、デバイスの PDO とドライバー パッケージの INF ファイルが指定するレジストリ エントリから、デバイス インターフェイスのセキュリティ記述子を取得します。 バス ドライバーは、ドライバーのデバイスが raw モードで動作する場合、ファンクション ドライバーなしで PDO のデバイス インターフェイスを提供できます。

一部のドライバーは、デバイスのシンボリック リンク名を作成するために WdfDeviceCreateSymbolicLink を呼び出す必要があります。 たとえば、アプリケーションでデバイスの MS-DOS デバイス名が表示される場合、ドライバーが MS-DOS 名を作成する場合があります。 名前のない FDO またはフィルター DO のシンボリック リンク名をドライバーが作成する場合、フレームワークはシンボリック リンク名を PDO の名前に関連付けます。 (制御デバイスは PDO に関連付けられていないため、ドライバーは名前のない制御デバイスのシンボリック リンク名を作成できません)。

デバイス オブジェクトとインターフェイスのセキュリティ記述子の提供

すべての名前付きデバイス オブジェクトには、セキュリティ記述子が必要です。 オペレーティング システムは、デバイス オブジェクトのセキュリティ記述子を使用して、デバイスとそのデバイス インターフェイスへのアクセスを許可されているユーザーの種類を決定します。 セキュリティ記述子は、次の方法でデバイス オブジェクトに割り当てることができます。

  • デバイス オブジェクトの既定のセキュリティ記述子を提供するオペレーティング システム (「デバイス アクセスの制御」を参照)。

  • フレームワーク。ドライバーが WdfDeviceInitAssignName を呼び出してデバイス オブジェクトに名前を割り当てる場合 (SDDL_DEVOBJ_SYS_ALL_ADM_ALL値を使用して) 既定のセキュリティ記述子を提供します (「デバイス オブジェクトの SDDL」 を参照)。

  • ドライバー。WdfDeviceInitAssignSDDLString を呼び出すことによって、フレームワークの既定のセキュリティ記述子をオーバーライドできます。

既定では、オペレーティング システムはデバイス PDO のセキュリティ記述子も使用して、ドライバーが提供するデバイス インターフェイスへのアクセス権を決定します。

ドライバー パッケージは、INF DDInstall.HW セクション内の INF AddReg ディレクティブを使用してデバイスのセキュリティ記述子を指定する INF ファイルを提供できます。

INF ファイルでのセキュリティ記述子の指定の詳細については、「セキュリティで保護されたデバイスのインストールの作成」を参照してください。

raw モードで動作するデバイスの PDO をドライバーが作成する場合、ドライバーは WdfPdoInitAssignRawDevice を呼び出すときにデバイス セットアップ クラスを指定する必要があります。 さらに、ドライバーが制御デバイスを作成する場合は、WdfDeviceInitSetDeviceClass を呼び出してデバイス セットアップ クラスを指定できます。 どちらの場合も、システム管理者は、指定されたセットアップ クラスのレジストリ キーを使用して、デバイスのセキュリティ記述子を格納できます。

オペレーティング システムがデバイスに使用するセキュリティ記述子を決定する方法については、「デバイス アクセスの制御」を参照してください。

フレームワークは、デバイス オブジェクトを作成するときに、常に FILE_DEVICE_SECURE_OPEN フラグを設定して、オペレーティング システムがデバイスのセキュリティ記述子をチェックしてから、アプリケーションがデバイスの名前空間内の任意の名前にアクセスできるようにします。 FILE_DEVICE_SECURE_OPEN フラグとデバイスの名前空間の詳細については、「デバイスの名前空間アクセスの制御」を参照してください。