访问控制列表

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 拒绝尝试访问对象的任何人的访问,因为没有授予此类访问权限的条目。 以下代码片段将 ACE 添加到此 ACL:

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

现在,此条目将授予对访问对象的任何实体的访问权限。 这是 SID (SeWorldSid) 的用途,在其他 Windows 系统实用工具中通常表示为“每个人”访问。

请注意,构造 ACL 时,请务必在 ACL 开头对拒绝访问的 ACE 条目进行排序,然后在 ACL 末尾对允许的 ACE 条目进行排序。 这是因为,当安全参考监视器对 ACL 进行评估时,如果找到 ACE 授予访问权限,则会授予访问权限,然后再找到被拒绝的 ACE。 此行为在Microsoft Windows SDK中得到了很好的记录,但它与安全引用监视器用于确定应授予还是拒绝访问权限的特定机制相关。