5

AccessCheck 関数は、GenericMapping パラメーターを取得します。このパラメーターは何に使用されますか? 以前に MapGenericMask を DesiredAccess に適用する必要があるため、DesiredAccess パラメーターには使用されません。

これを行うCプログラムを使用して発見したため、SecurityDescriptorに含まれるDACLにも適用されません。

  • 現在のスレッド トークンを開く
  • トークンから所有者とデフォルト グループを使用してセキュリティ記述子を作成し、所有者に GENERIC_ALL を付与する DACL を作成する "D:(A;;GA;;;ownerSID)"
  • GENERIC_MAPPING をセットアップします。これは、(とりわけ) GenericAll を私の OWN_READ | にマップします。OWN_WRITE (0x0001 および 0x0002 として定義)
  • 上記で作成したセキュリティ記述子、スレッド トークン、DesiredAccess としての OWN_READ、記述された GENERIC_MAPPING を使用して AccessCheck を呼び出します。

ただし、これはアクセス拒否エラーで失敗します。セキュリティ記述子を「D:(A;;0x0001;;;ownerSID)」に変更すると、アクセスが許可されます。これは、AccessCheck が GenericMapping パラメーターを使用して、DACL の汎用アクセス フラグ (GA/GW/GR/GX) を特定のアクセス権に変換していないことを示しています。なんで?私は何か間違ったことをしていますか?

https://msdn.microsoft.com/de-de/library/windows/desktop/aa374815(v=vs.85).aspxは、セキュリティ記述子の設定方法に関するヒントを提供しません。

4

1 に答える 1

1

SDあなたはほとんどすべて正しいことをしますが、セキュリティ記述子( )をカーネルオブジェクトに割り当てようとすると、システムが正確に「そのまま」割り当てられるのではなく、最初にSD適用さGenericMappingれることを考慮していませんACEs

すべてのオブジェクト -ジェネリックフラグを非ジェネリックに変換するために使用される、_OBJECT_TYPE含まれているもの_OBJECT_TYPE_INITIALIZERとここに存在するものGENERIC_MAPPING GenericMapping;、およびこれGenericMapping(オブジェクトのタイプごとに一意) を関連付けました。ACCESS_MASK

テスト用に、 next SD-でファイルを作成します"D:P(A;;GA;;;WD)" (10000000 - GenericAll for S-1-1-0 EveryOne)。そして、作成されたファイルからクエリを実行DACLします-そして、実際には表示され001F01FFませS-1-1-010000000

使用するとき"D:P(A;;GX;;;WD)" (GenericExecute - 20000000 for S-1-1-0)- 最終ファイルで表示001200A0するS-1-1-0

そのため、実際のカーネル オブジェクトには一般的なビットがなくACCESS_MASKDACL正確な形式でオブジェクトに割り当てることはできません。

AccessCheck が GenericMapping を DACL に適用しないのはなぜですか?

AccessCheckすでにACCESS_MASK変換されていると仮定します(汎用ビットなし)DACL

これはパフォーマンスの最適化だと思います-ジェネリックビットを1回変換する方が良いです(オブジェクトの作成または割り当てSD時に-誰かがオブジェクトを開こうとするたびにこの変換を行うよりも)

GenericMappingパラメータの使用方法について

本当に非常に弱い - オブジェクトが存在しない場合DACL(または if PreviousMode == KernelMode) で、システムがあなたを許可するMAXIMUM_ALLOWEDように要求する場合のみ。これは( )からのソース コードの検索に基づいています。DesiredAccessGenericMapping->GenericAllWRKaccessck.c

いいえDACLMAXIMUM_ALLOWEDこれはまれなケースですが、この場合、システムはどの具体的なアクセス権を呼び出し元に付与する必要があるかをどのように計算できますか? 彼は具体的なアクセス(読み取り/書き込み/削除など)を要求するのではなく、「すべて」を要求します。だからシステムと彼に与えるGenericMapping->GenericAll

于 2016-12-01T01:33:06.087 に答える