次の方法で共有


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

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

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

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

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

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

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

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

  • ドライバー内のビューへのすべてのメモリ アクセスは、 try-except ブロックで保護する必要があります。 悪意のあるユーザーモード アプリケーションには、ビューのマップが解除されるおそれや、ビューの保護状態が変更されるおそれがあります。 いずれの場合も、 try-except ブロックで保護されていない限り、システムクラッシュが発生します。 詳細については、「 Handling SMO Exceptions」を参照してください。

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

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

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

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

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

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