为什么AccessCheck不将通用图应用于DACL



accessCheck函数获取一个通用图表参数。此参数是用什么?它不用于DesiredAccess参数,因为MapGenericMask必须在DesiredAccess之前应用。

当我使用C程序发现这样做时,它也不适用于SecurityDeScriptor中包含的DACL:

  • 打开当前的线程令牌
  • 与所有者和默认组创建一个安全描述符,并从代币和DACL授予所有者" D:(a ;; ga ;; ga;; ;;所有人)"
  • setup generic_mapping,映射(除其他)genericall to My自己_Read |own_write(定义为0x0001和0x0002)
  • 使用上面创建的安全描述符,the Token,hold_read AsiredAccess,所述generic_mapping

但是,这将失败,访问拒绝错误。当我将安全性描述符更改为" D:(A ;; 0x0001 ;;;所有人)"访问权限。这表明AccessCheck没有使用通用图参数将DACL中的通用访问标志(GA/GW/GR/GX)转换为特定访问权限。为什么?我做错了吗?

https://msdn.microsoft.com/de-de/library/windows/desktop/aa374815(v = vs.85).aspx没有给出任何应如何设置安全描述者的提示。

您几乎要做所有正确的事情,但是当您尝试将安全描述符(SD)分配给内核对象时 - 系统不完全">分配您的SD,但首先将GenericMapping应用于ACEs

每个对象 - 具有包含_OBJECT_TYPE_INITIALIZER_OBJECT_TYPE,此处存在GENERIC_MAPPING GenericMapping;和此CC_7(对于每种类型的对象唯一),用于将ACCESS_MASK中的通用标志转换为非生物。

对于测试,我使用下一个SD -"D:P(A;;GA;;;WD)" (10000000 - GenericAll for S-1-1-0 EveryOne)创建文件。然后,我从创建的文件中查询DACL-并查看S-1-1-0001F01FF,但没有10000000

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

因此,真正的内核对象在ACCESS_MASK中没有通用位,并且您的DACL完全无法分配给任何对象。

为什么AccessCheck不将通用图应用于DACL?

AccessCheck假设ACCESS_MASKDACL 中已经转换(无通用位)

我认为这是性能优化 - 更好地转换通用位(在对象创建或分配 SD上),比每次转换在某人尝试打开对象时进行转换)

关于GenericMapping参数如何使用?

真的很虚弱 - 仅在对象没有DACL(或PreviousMode == KernelMode)时,您请求MAXIMUM_ALLOWED作为DesiredAccess-系统授予您GenericMapping->GenericAll。这是基于WRKaccessck.c)的外观源代码

DACLMAXIMUM_ALLOWED这是极少数情况,但是在这种情况下,系统如何计算哪种具体访问需要给呼叫者?他不要求具体访问(例如读/写入/删除) - 而是"全部"。因此,系统并给他GenericMapping->GenericAll

相关内容

  • 没有找到相关文章

最新更新