2016-11-30 49 views
3

AccessCheck函數獲取GenericMapping參數。這個參數用於什麼?它不用於DesiredAccess參數,因爲之前必須將MapGenericMask應用於DesiredAccess。AccessCheck爲什麼不將GenericMapping應用於DACL?

包含在SecurityDescriptor因爲我發現用一個C程序這樣它也並不適用於DACL:

  • 打開當前線程標記
  • 創建所有者和默認組安全描述符從令牌和一個DACL授予GENERIC_ALL給所有者「D:(A ;; GA ;;; ownerSID)​​」
  • 設置GENERIC_MAPPING,它將(除其他之外)GenericAll映射到我的OWN_READ | OWN_WRITE(定義爲0×0001 0×0002和)
  • AccessCheck的呼叫用上面創建的安全描述符,線程令牌,OWN_READ作爲DesiredAccess,所描述的GENERIC_MAPPING

然而,這種失敗,拒絕訪問錯誤。當我將安全描述符更改爲「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沒有給出如何設置安全描述符的提示。

回答

0

你做幾乎所有正確的,但你的帳戶不採取,當你嘗試分配安全描述符(SD)內核對象 - 系統不完全「原樣」分配你的SD但適用於GenericMapping第一ACEs

每一個對象 - 已產生密切相關,其含有_OBJECT_TYPE_INITIALIZER_OBJECT_TYPE這裏存在GENERIC_MAPPING GenericMapping;和使用該GenericMapping(唯一爲每種類型的對象)的轉換你的通用標誌在ACCESS_MASK到非通用。

測試我創建文件與下一個SD - "D:P(A;;GA;;;WD)" (10000000 - GenericAll for S-1-1-0 EveryOne)。然後我從創建的文件中查詢DACL - 並確實看到001F01FFS-1-1-0,但不是10000000

當我使用"D:P(A;;GX;;;WD)" (GenericExecute - 20000000 for S-1-1-0) - 在最終文件我查看001200A0S-1-1-0

如此的真實內核對象在ACCESS_MASK並沒有通用的位在DACL正好形成,不能分配給任何對象。

爲什麼AccessCheck不會將GenericMapping應用於DACL?

AccessCheck假設ACCESS_MASKDACL已經轉換(沒有通用位)

我覺得這是性能優化 - 更好的轉換一次普通位(對對象創建或分配SD它 - 不是每時間做這個轉換時,有人試圖打開對象)

關於如何GenericMapping參數使用?

真的非常薄弱 - 僅在情況下,當物體沒有DACL(或如果PreviousMode == KernelMode)和您請求MAXIMUM_ALLOWED作爲DesiredAccess - 系統授予你GenericMapping->GenericAll。這是基於目光從WRKaccessck.c)源代碼

沒有DACLMAXIMUM_ALLOWED這是罕見的情況,但在這種情況下,系統如何計算什麼具體的訪問需要授予訪問者?他不問具體的訪問權限(如讀/寫/刪除) - 但是「全部」。所以系統並給他GenericMapping->GenericAll

+0

這並不能解釋爲什麼'GenericMapping'參數存在,如果AccessCheck()函數不使用它。也許早期版本的Windows的行爲有所不同? –

+0

@HarryJohnston - 我如何寫在最後 - 它用於'MAXIMUM_ALLOWED'請求的情況下,對象沒有DACL(或以前的模式是內核)。是非常弱的用法。但是 – RbMm

+0

沒有DACL和'MAXIMUM_ALLOWED'這是罕​​見的情況,但是在這種情況下系統如何計算具體訪問需要授權給調用者?他不問具體的訪問權限(如讀/寫/刪除) - 但是「全部」。所以系統並給他'GenericMapping-> GenericAll'。另一種用法我沒有找到 – RbMm

相關問題