次の方法で共有


セクション オブジェクトとビューのセキュリティに関する問題

ユーザー モードと共有しないセクションとビューを作成するドライバーは、セクションとビューを操作するときに次のプロトコルを使用する必要があります。

  • ドライバーは、セクション オブジェクトへのハンドルを開くときにカーネル ハンドルを使用する必要があります。 ドライバーは、システム プロセスでハンドルを作成するか、ハンドルのOBJ_KERNEL_HANDLE属性を指定することによって、ハンドルがカーネル ハンドルであることを確認できます。 詳細については、「オブジェクト ハンドル」を参照してください。

  • ビューは、システム スレッドからのみマップする必要があります。 (それ以外の場合、ビューはコンテキストが作成されたプロセスからアクセスできます)。ドライバーは、マッピング操作を実行するシステム ワーカー スレッドを使用して、ビューがシステム プロセスからマップされていることを確認できます。 詳細については、「 システム ワーカー スレッドドライバー スレッド コンテキスト」を参照してください。

ビューをユーザー モード プロセスと共有するドライバーは、セクションとビューを操作するときに次のプロトコルを使用する必要があります。

  • ドライバーは、ユーザー モード プロセスではなく、セクション オブジェクトを作成し、ビューをマップする必要があります。

  • 前述のように、ドライバーは、セクション オブジェクトへのハンドルを開くときにカーネル ハンドルを使用する必要があります。 ドライバーは、システム プロセスでハンドルを作成するか、ハンドルのOBJ_KERNEL_HANDLE属性を指定することによって、ハンドルがカーネル ハンドルであることを確認できます。 詳細については、「オブジェクト ハンドル」を参照してください。

  • ビューは、ビューを共有するプロセスのスレッド コンテキストでマップされます。 最上位レベルのドライバーは、ディスパッチ ルーチン ( DispatchDeviceControl など) でマッピング操作を実行することで、ビューが現在のプロセス コンテキストでマップされていることを保証できます。 下位レベルのドライバーのディスパッチ ルーチンは任意のスレッド コンテキストで実行されるため、ディスパッチ ルーチンでビューを安全にマップすることはできません。 詳細については、「 ドライバー スレッド コンテキスト」を参照してください。

  • ドライバー内のビューへのすべてのメモリ アクセスは、 try-except ブロックで保護する必要があります。 悪意のあるユーザー モード アプリケーションは、ビューのマップを解除したり、ビューの保護状態を変更したりする可能性があります。 保護されていない限り、どちらの場合も try-except ブロックによってシステムはクラッシュします。 詳細については、「例外の処理」を参照してください。

ドライバーは、必要に応じてビューの内容も検証する必要があります。 ドライバー ライターは、信頼されたユーザー モード コンポーネントのみがビューにアクセスできることを想定できません。

ユーザー モード アプリケーションとセクション オブジェクトを共有する必要があるドライバー (独自のビューを作成できる必要があります) は、次のプロトコルを使用する必要があります。

  • ドライバーは、ユーザー モード プロセスではなく、セクション オブジェクトを作成する必要があります。 ドライバーは、ユーザー モードから渡されたハンドルを使用しないでください。

  • ハンドルをユーザー モードに渡す前に、ドライバーは ObReferenceObjectByHandle を呼び出してセクション オブジェクトへの参照を取得する必要があります。 これにより、悪意のあるアプリケーションがハンドルを閉じてセクション オブジェクトを削除できなくなります。 オブジェクト参照は、ドライバーのデバイス拡張機能に格納する必要があります。

  • ドライバーは、セクション オブジェクトを使用しなくなった後、オブジェクト参照を解放する ObDereferenceObject を呼び出す必要があります。

Microsoft Windows Server 2003 Service Pack 1 (SP1) 以降のバージョンを実行するシステムでは、カーネル モード ドライバーのみが \Device\PhysicalMemory を開くことができます。 ただし、ドライバーは、ユーザー アプリケーションにハンドルを渡すことができます。 セキュリティの問題を回避するには、ドライバーが信頼するユーザー アプリケーションにのみ、\Device\PhysicalMemory へのアクセス権を付与する必要があります。