4

私が協力しているチームは、最近、私たちのソフトウェアをサードパーティの仮想化ソフトウェアと互換性を持たせるという課題に直面しています。ZwCreateKeyこのソフトウェアは、カーネルドライバーを使用して、WindowsネイティブレジストリAPI(など)のフックを実行します。Ntdllで呼び出しをフックすることで機能します。私たちのソフトウェアもかなり低レベルであり、状況によっては、フックされることなく実際のレジストリにアクセスする必要があります。

私たちは、独自のカーネルドライバーを使用してZwCreateKey、フックを回避するために、などを呼び出す可能性を模索しています。これは基本的に、NTレガシードライバーと、独自のネイティブレジストリ機能を提供するユーザーモードライブラリを作成することを意味します。ライブラリとドライバーは非常に単純です。IOCTLを使用してZwCreateKey、などのすべてのパラメーターをドライバーに渡し、カーネルバージョンの呼び出しを呼び出して結果を返します。

このアプローチはうまく機能しており、仮想化すると実際のレジストリに対して読み取り/書き込みのシステムができたように見えます。唯一の問題は、新しいシステムがレジストリオブジェクトのWindowsセキュリティを循環させているように見えることです。

ZwCreateKey次のようなアクセスマスクを取ります。

NTSTATUS ZwCreateKey(
  __out       PHANDLE KeyHandle,
  __in        ACCESS_MASK DesiredAccess,
  __in        POBJECT_ATTRIBUTES ObjectAttributes,
  __reserved  ULONG TitleIndex,
  __in_opt    PUNICODE_STRING Class,
  __in        ULONG CreateOptions,
  __out_opt   PULONG Disposition
);

私の理解では、現在カーネルモードで実行していますが、ユーザーのトークンのコンテキストはまだあります。これは、アクセスマスクテストが失敗した場合のユーザーと同じように、のカーネルバージョンZwCreateKeyが失敗することを意味するはずです。実際に起こっていることは、制限されたトークンを使用しても、ドライバーが呼び出されたときに、制限されたユーザーによって呼び出されたときに、制限された部分HKLMにキーを作成できることです。何が得られますか?ACLチェックを自分で実行する必要がありますか?カーネルモードで自分の特権を制限するために何かをする必要がありますか?どんな助けでも大歓迎です。

4

1 に答える 1

7

説明のためにこれをチェックしてください。基本的に、ユーザーモード(ntdll)のNt / Zwは同じものです。実際にアクションを実行する前に、最初に広範なチェックを実行します。カーネルモードからZw関数を呼び出す場合(デバイスドライバーの場合のように)、カーネルモードコンポーネント(ドライバーなど)からの情報はデフォルトで信頼されると想定されるため、これらのチェックは省略されます。

于 2011-10-25T08:08:54.940 に答える