访问控制列表

访问控制列表 (ACL) 是操作系统创建的访问控制项 (ACE) 列表,用于控制与某种给定(受保护)对象相关的安全行为。 Windows 中有两种类型的 ACL:

  • 自由选择的 ACL 是由零个或多个 ACE 组成的列表,用于描述受保护对象的访问权限。 之所以说是自由选择的,是因为权限的授予是由所有者或任何拥有适当权限的用户来决定的。

  • 系统 ACL 是由零个或多个 ACE 组成的列表,用于描述受保护对象的审计和警报策略。

“自由选择”一词指的是强制性控制和自由选择的控制之间的区别。 在使用强制性控制的环境中,对象的所有者可能无法授予对对象的访问权限。 在 Windows 等自由选择的环境中,允许对象的所有者授予此类访问权限。 强制性控制通常与严密的安全环境有关,如使用分隔式安全的环境,在这种环境下,系统必须防止同一系统的用户之间泄露敏感信息。

构造 ACL 的驱动程序应遵循几个关键步骤:

  1. 为 ACL 分配存储。

  2. 初始化 ACL。

  3. 在 ACL 中添加零个(或多个)ACE。

以下代码示例演示了如何构造 ACL:

    dacl = ExAllocatePool(PagedPool, PAGE_SIZE);
    if (!dacl) {
        return;
    }
    status = RtlCreateAcl(dacl, PAGE_SIZE, ACL_REVISION);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

前面的代码片段会创建一个空 ACL。 代码示例分配了大量内存,因为我们不知道 ACL 所需的大小。

此时,ACL 是空的,因为它还没有 ACE 条目。 空 ACL 会拒绝任何人员访问该对象,因为没有授予此类访问权限的条目。 以下代码片段会为 ACL 添加一个 ACE:

    status = RtlAddAccessAllowedAce(dacl, ACL_REVISION,  FILE_ALL_ACCESS, SeExports->SeWorldSid);
    if (!NT_SUCCESS(status)) {
        ExFreePool(dacl);
        return;
    }

添加的 ACE 允许访问该对象的任何实体进行访问,这就是世界访问 SID (SeWorldSid) 的目的。 在其他 Windows 系统实用程序中,该 SID 通常表示为“每个人”访问权限。

在构造 ACL 时,重要的是将拒绝访问的 ACE 条目放在 ACL 的开头,而将允许访问的 ACE 条目放在 ACL 的结尾。 该顺序很重要。 否则,安全引用监控程序在评估 ACL 时,如果发现允许访问的 ACE 在拒绝访问的 ACE 之前,就会授予访问权限。 此行为在 Microsoft Windows SDK 中有详细记录,但它与安全引用监视程序用于确定应允许还是拒绝访问的特定机制有关。