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-0
的001F01FF
,但没有10000000
。
当我使用"D:P(A;;GX;;;WD)" (GenericExecute - 20000000 for S-1-1-0)
-在最终文件中,我查看001200A0
的S-1-1-0
因此,真正的内核对象在ACCESS_MASK
中没有通用位,并且您的DACL
完全无法分配给任何对象。
为什么AccessCheck不将通用图应用于DACL?
AccessCheck
假设ACCESS_MASK
在DACL
中已经转换(无通用位)
我认为这是性能优化 - 更好地转换通用位(在对象创建或分配 SD
上),比每次转换在某人尝试打开对象时进行转换)
关于GenericMapping
参数如何使用?
真的很虚弱 - 仅在对象没有DACL
(或PreviousMode == KernelMode
)时,您请求MAXIMUM_ALLOWED
作为DesiredAccess
-系统授予您GenericMapping->GenericAll
。这是基于WRK
(accessck.c
)的外观源代码
否DACL
和MAXIMUM_ALLOWED
这是极少数情况,但是在这种情况下,系统如何计算哪种具体访问需要给呼叫者?他不要求具体访问(例如读/写入/删除) - 而是"全部"。因此,系统并给他GenericMapping->GenericAll