winapi - 为什么 AccessCheck 不将 GenericMapping 应用于 DACL?

标签 winapi permissions dacl

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

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

  • 打开当前线程 token
  • 使用 token 创建一个安全描述符,其中包含所有者和默认组以及向所有者“D:(A;;GA;;;ownerSID)”授予 GENERIC_ALL 的 DACL
  • 设置 GENERIC_MAPPING,它将(以及其他)GenericAll 映射到我的 OWN_READ | OWN_WRITE(定义为0x0001和0x0002)
  • 使用上面创建的安全描述符、线程 token 、作为 DesiredAccess 的 OWN_READ、所描述的 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没有给出有关如何设置安全描述符的任何提示。

最佳答案

您几乎全部正确,但您没有考虑到当您尝试将安全描述符(SD)分配给内核对象时 - 系统不完全“按原样”分配您的 SD,但首先将 GenericMapping 应用于 ACE

每个对象 - 都关联 _OBJECT_TYPE其中包含 _OBJECT_TYPE_INITIALIZER这里存在 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) - 在最终文件中我查看 001200A0 代表 S-1-1-0

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

Why is AccessCheck NOT applying GenericMapping to the DACL?

AccessCheck 假定 DACL 中的 ACCESS_MASK 已转换(无通用位)

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

关于GenericMapping参数如何使用?

确实非常弱 - 仅当对象没有 DACL (或者 PreviousMode == KernelMode)并且您请求 MAXIMUM_ALLOWED 作为 DesiredAccess - 系统授予您GenericMapping->GenericAll。这是基于从 WRK (accessck.c)

查看源代码

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

关于winapi - 为什么 AccessCheck 不将 GenericMapping 应用于 DACL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900143/

相关文章:

c - 错误 C2065 : 'Test_Proc' : undeclared identifier which 'Test_Proc' already exists

ios - 在ios 6中我可以通过请求权限来获取用户的电话号码吗?

c# - 有没有办法在 C# 中修改进程 DACL

python - 尽管是文件的所有者,但 READ_CONTROL 的 CreateFileW 失败并显示 "Access is denied"

c++ - 执行时动态库链接

c++ - 哪种方式返回HHOOK消息给系统更好?

windows - 在 Go 中检测 windows 版本以找出启动文件夹

git - 更改已添加到 git 的文件的权限

java - 向 Linux 大师们致敬。权限异常