5

AccessCheck 函数获取一个 GenericMapping 参数。这个参数是干什么用的?它不用于 DesiredAccess 参数,因为之前必须将 MapGenericMask 应用于 DesiredAccess。

它也不适用于 SecurityDescriptor 中包含的 DACL,因为我发现使用 C 程序执行此操作:

  • 打开当前线程令牌
  • 从令牌创建具有所有者和默认组的安全描述符,以及将 GENERIC_ALL 授予所有者“D:(A;;GA;;;ownerSID)”的 DACL
  • 设置 GENERIC_MAPPING,它将(除其他外)GenericAll 映射到我的 OWN_READ | OWN_WRITE(定义为 0x0001 和 0x0002)
  • 使用上面创建的安全描述符、线程令牌、OWN_READ 作为 DesiredAccess、所描述的 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而是首先应用。GenericMappingACEs

每个对象 - 都关联_OBJECT_TYPE了哪些包含_OBJECT_TYPE_INITIALIZER和此处存在,以及用于将您的通用标志转换为非通用的GENERIC_MAPPING GenericMapping;this (对于每种类型的对象都是唯一的)。GenericMappingACCESS_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的情况下。这是基于从( )中查找源代码DesiredAccessGenericMapping->GenericAllWRKaccessck.c

DACLMAXIMUM_ALLOWED这种情况很少见,但在这种情况下,系统如何计算需要授予调用者的具体访问权限?他不问具体的访问权限(如读/写/删除)——而是“全部”。所以系统并给他GenericMapping->GenericAll

于 2016-12-01T01:33:06.087 回答