【问题标题】:CreateSemaphoreEx Security Attribute vs Access MaskCreateSemaphoreEx 安全属性与访问掩码
【发布时间】:2015-04-23 02:14:51
【问题描述】:

Windows平台上的CreateSemaphoreEx API有以下参数:

LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,以及 DWORD dwDesiredAccess

我知道它们都用于控制访问,但是,我不确定它们的关系以及它们之间的区别。例如,如果我将 dwDesiredAccess 设置为 SYNCHRONIZE,但我创建了一个带有空 DACL 的安全属性(即根本没有访问权限),那么它如何协同工作?如果任何人都可以分享有关这些参数的用途以及它们如何相互作用的信息,那就太好了。

谢谢。

【问题讨论】:

    标签: c++ windows security


    【解决方案1】:

    如果对象已经存在:

    • lpSemaphoreAttributes.lpSecurityDescriptor 参数被忽略。

    • dwDesiredAccess 参数确定赋予从函数返回的新句柄的访问权限。如果这些访问权限与对象的安全权限不兼容,则调用将失败并显示ERROR_ACCESS_DENIED

    如果对象不存在:

    • lpSemaphoreAttributes.lpSecurityDescriptor 参数确定分配给新创建对象的安全权限。如果未提供安全描述符,则使用默认权限。

    • dwDesiredAccess 参数确定赋予函数返回的新句柄的访问权限。这些权限不受新创建对象的安全权限限制。从概念上讲,对象的句柄在应用新权限之前打开。

    因此,如果您使用空 ACL 指定 DACL(从而隐式拒绝所有人访问),那么访问该对象的唯一方法是通过使用该对象创建的句柄或该句柄的副本。除非您首先更改权限以允许您这样做,否则即使从同一进程也无法再次打开该对象。

    请注意,其他安全规则在创建对象时仍然适用。例如,您无法获得ACCESS_SYSTEM_SECURITY 访问权限,即使是对新创建的对象,除非您拥有SE_SECURITY_NAME 权限。

    还应该强调的是,当您使用现有的打开句柄访问对象时,只检查句柄的访问权限,而不检查对象的当前安全权限。如果您在打开句柄时获得了特定的访问权限,那么对象的安全权限是否已更改为拒绝您的访问权限并不重要。

    相反,如果未使用执行给定操作所需的访问权限打开句柄,则无法使用该句柄执行该操作,即使对象的安全权限授予您这样做的权利。

    这就是dwDesiredAccess 参数如此重要的原因;如果您遗漏了特定操作所需的权限,则该操作将失败,但如果您要求的权限集太广,您可能会被拒绝访问。幸运的是,在大多数情况下,文档很简单,所以只需要注意细节。

    【讨论】:

    • 针对“这些权限不受新创建对象的安全权限限制”的响应,我注意到如果我创建一个具有 SYNCHRONIZE 访问权限的新信号量并使用 SYNCHRONIZE|SEMAPHORE_MODIFY_STATE 调用 DuplicateHandle 来选择如果我为初始信号量创建设置了一个空的 DACL 安全权限,则 DuplicateHandle 会失败,但如果使用了默认安全权限,则会成功。这不是意味着权限可以通过新创建的对象的安全权限来限制吗?
    • 我必须仔细检查,但我相信如果您使用DUPLICATE_SAME_ACCESS 选项,复制句柄将获得与原始句柄相同的访问权限,而对象的安全性不重新检查。在任何情况下,original 句柄仍然不会受到权限的影响。
    • (显然,如果您请求额外的访问权限,则必须根据安全权限对其进行验证。否则这将是一个微不足道的特权提升漏洞。)
    • 如果我使用 DuplicateHandle 而不使用 DUPLICATE_SAME_ACCESS 并且原始信号量创建有一个空的 DACL,则复制成功。所以这看起来不会触发安全权限检查。也许他们意识到这与原始和特殊情况相同的权限?
    • 在这种情况下,我怀疑您会发现您也可以在不触发权限检查的情况下删除访问权限,即只添加额外的权限需要一个。无论如何,这听起来很合理!请注意,通常您不需要为重复的句柄添加权限,通常的做法是让原始句柄拥有您需要的所有访问权限。如果您出于某种原因需要多个句柄,并且具有不同的访问权限,那么最好从一个具有所有权限的句柄开始,并通过重复而不是相反来减少这些权限。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2010-11-23
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多