Winapi 为什么AccessCheck不将GenericMapping应用于DACL?
AccessCheck函数获取一个GenericMapping参数。此参数用于什么?它不用于DesiredAccess参数,因为之前必须将MapGenericMask应用于DesiredAccess 它也不适用于SecurityDescriptor中包含的DACL,因为我使用C程序执行以下操作时发现:Winapi 为什么AccessCheck不将GenericMapping应用于DACL?,winapi,permissions,dacl,Winapi,Permissions,Dacl,AccessCheck函数获取一个GenericMapping参数。此参数用于什么?它不用于DesiredAccess参数,因为之前必须将MapGenericMask应用于DesiredAccess 它也不适用于SecurityDescriptor中包含的DACL,因为我使用C程序执行以下操作时发现: 打开当前线程令牌 从令牌和DACL中创建一个具有所有者和默认组的安全描述符,并向所有者“D:(a;;GA;;;ownerId)”授予GENERIC_ALL 设置GENERIC_映射,它将Gene
- 打开当前线程令牌
- 从令牌和DACL中创建一个具有所有者和默认组的安全描述符,并向所有者“D:(a;;GA;;;ownerId)”授予GENERIC_ALL
- 设置GENERIC_映射,它将GenericAll映射到我自己的_READ | OWN_WRITE(定义为0x0001和0x0002)
- 使用上面创建的安全描述符、线程令牌、OWN_READ as DesiredAccess、所述的通用_映射调用AccessCheck
没有给出关于如何设置安全描述符的任何提示。您几乎做得都是正确的,但您没有考虑到,当您尝试将安全描述符(
SD
)分配给内核对象时,系统并没有完全“按原样”分配您的SD
,而是首先将GenericMapping
应用到ACEs
每个对象-都关联了包含和存在的对象GENERIC\u映射GenericMapping代码>和此通用映射
(对于每种类型的对象都是唯一的),用于将访问\u掩码
中的通用标志转换为非通用标志
对于测试,我使用nextSD
-创建文件“D:p(A;;GA;;;WD)”(10000000-通用调用S-1-1-0所有人)
。然后我从创建的文件中查询DACL
,并查看S-1-1-0
的001F01FF
,而不是10000000
当我使用“D:p(A;;GX;;;WD)”(GenericExecute-20000000用于S-1-1-0)
-在最终文件中,我查看001200A0
用于S-1-1-0
因此,真正的内核对象在ACCESS\u MASK
中没有通用位,而您的DACL
的格式完全不能指定给任何对象
为什么AccessCheck不将GenericMapping应用于DACL
AccessCheck
假设DACL
中的ACCESS\u MASK
已转换(无通用位)
我认为这是一种性能优化——最好将通用位转换一次(在创建对象或将SD
分配给它时),而不是每次有人尝试打开对象时进行转换)
关于如何使用GenericMapping
参数
真的很弱-仅当对象没有DACL
(或者PreviousMode==KernelMode
)并且您请求允许的最大访问次数作为所需访问次数
-系统授予您GenericMapping->GenericAll
。这是基于从WRK
(accessck.c
)中查找源代码
没有DACL
和允许的最大\u
这是罕见的情况,但在这种情况下,系统如何计算需要授予调用方的具体访问权限?他要求的不是具体的访问(比如读/写/删除),而是“全部”。因此,如果AccessCheck()函数不使用,GenericMapping->GenericAll
这并不能真正解释为什么GenericMapping
参数存在。也许早期版本的Windows表现有所不同?@HarryJohnston—我最后的写作方式—它用于请求的MAXIMUM_ALLOWED
,并且对象没有DACL(或者以前的模式是内核)。是的,非常弱的用法。但由于没有DACL和允许的最大值
这是罕见的情况,但在这种情况下,系统如何计算需要授予调用方的具体访问权限?他要求的不是具体的访问(比如读/写/删除),而是“全部”。因此,系统会给他GenericMapping->GenericAll
。另一个我没有发现的用法非常感谢你给我指出这个!事实上,设置SD最终会导致调用RtlpSetSecurityObject(base/ntos/rtl/sertl.c),其中GenericMapping使用RtlpApplyAclToObject/RTLMapGenericTask应用于DACL和SACL。然而,它并没有解决我的问题,我现在在另一个问题中描述了这个问题。请检查@dannyM-好的,我看看这个,什么时候有空。谢谢你提出有趣的问题