セクション オブジェクトとビューに関するセキュリティの問題
ユーザー モードと共有しないセクションとビューを作成するドライバーは、セクションとビューを操作するときに次のプロトコルを使用する必要があります。
そのドライバーは、セクション オブジェクトへのハンドルを開くときにカーネル ハンドルを使用する必要があります。 ドライバーは、システム プロセスでハンドルを作成するか、そのハンドルに 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 へのアクセス権を付与する必要があります。