Windows原理深入学习系列-访问控制列表
字数 1841 2025-08-07 08:22:27

Windows访问控制列表(ACL)深入解析

0x00 概述

访问控制列表(Access Control List, ACL)是Windows安全体系中的核心组件,用于控制对安全对象的访问。每个ACL由多个访问控制条目(Access Control Entries, ACE)组成。安全描述符中包含两种ACL:

  • DACL(Discretionary Access Control List):自主访问控制列表,决定哪些用户/组可以访问对象及访问权限
  • SACL(System Access Control List):系统访问控制列表,用于审计对对象的访问尝试

几乎所有Windows对象都是安全对象,包括:文件、目录、进程、线程、注册表、服务、管道、打印机、网络共享等。

0x01 DACL详解

DACL的三种情况

  1. DACL为NULL:允许任何用户的完全访问权限
  2. DACL为空(无ACE):不允许任何用户的任何访问
  3. DACL包含ACE:按顺序检查ACE,直到满足以下条件之一:
    • 找到一个或多个ACE允许所有请求的访问权限
    • 任何请求的访问权限被拒绝

ACE检查顺序的重要性

ACE的排列顺序直接影响权限检查结果。Windows会按顺序检查ACE,一旦匹配到相关条目就会停止检查。因此,拒绝访问的ACE应放在允许访问的ACE之前。

ACE继承机制

  • ACE可以继承自父对象
  • 继承的ACE在子对象中不可修改
  • 继承标志位控制继承行为

0x02 创建和修改DACL

图形界面方式

使用Windows资源管理器或"安全"属性页可以:

  1. 查看和编辑DACL
  2. 启用/禁用继承
  3. 添加/删除ACE

编程方式

使用Windows API创建DACL的标准流程:

  1. 分配和初始化安全描述符
  2. 识别要分配的对象
  3. 识别要分配的用户/组
  4. 分配内存给ACL
  5. 初始化ACL
  6. 添加ACE到ACL
  7. 设置安全描述符中的DACL
  8. 将安全描述符附加到对象

关键API:

  • InitializeSecurityDescriptor
  • SetSecurityDescriptorDacl
  • AddAccessAllowedAce
  • AddAccessDeniedAce

命令行工具

  1. icacls:显示和修改文件/目录的ACL

    icacls filename /grant user:permission
    icacls filename /deny user:permission
    
  2. PowerShell

    • Get-Acl:获取对象的ACL
    • Set-Acl:设置对象的ACL

0x03 实际测试案例

文件读取测试

  1. 查看文件当前ACL:

    Get-Acl -Path "C:\path\to\file" | Format-List
    
  2. 修改ACL:

    • 禁用继承
    • 删除除SYSTEM外的所有ACE
    • 测试访问被拒绝

进程注入测试

  1. 查看进程ACL:

    Get-Process -Name notepad | Get-Acl
    
  2. 修改进程ACL删除当前用户权限

  3. 尝试进程注入失败(错误码:拒绝访问)

0x04 内核原理分析(Win10_x64_20H2)

数据结构解析

  1. EPROCESS结构:包含进程基本信息

  2. OBJECT_HEADER:对象头结构,包含SecurityDescriptor

    • SecurityDescriptor最后4位是快速引用标记
  3. _SECURITY_DESCRIPTOR_RELATIVE

    • 使用相对偏移而非绝对地址
    • DACL位于偏移0x30处
  4. ACL结构

    • AclSize:ACL总大小
    • AceCount:包含的ACE数量
  5. _ACE_HEADER

    • AceType:ACE类型(如ACCESS_ALLOWED_ACE)
    • AceFlags:标志位
    • AceSize:ACE大小
  6. ACCESS_ALLOWED_ACE

    • Mask:访问权限掩码
    • SidStart:安全标识符(SID)起始位置

关键函数分析

  1. RtlGetDaclSecurityDescriptor

    • 从安全描述符获取DACL指针
    • 处理相对偏移计算
  2. RtlGetAce

    • 遍历ACL查找指定索引的ACE
    • 通过AceSize计算下一个ACE位置

权限掩码(ACCESS_MASK)

权限掩码分为:

  • 一般权限(GENERIC_READ等)
  • 标准权限(DELETE, READ_CONTROL等)
  • 特殊权限(对象特定权限)

0x05 参考资源

  1. Microsoft官方文档 - 访问控制列表
  2. Microsoft官方文档 - 安全描述符结构
  3. Microsoft官方文档 - 可保护对象
  4. Microsoft官方文档 - DACL和ACE
  5. Microsoft官方文档 - 访问掩码
  6. ACL、DACL、SACL和ACE详解
  7. Windows权限提升中的ACL利用
Windows访问控制列表(ACL)深入解析 0x00 概述 访问控制列表(Access Control List, ACL)是Windows安全体系中的核心组件,用于控制对安全对象的访问。每个ACL由多个访问控制条目(Access Control Entries, ACE)组成。安全描述符中包含两种ACL: DACL (Discretionary Access Control List):自主访问控制列表,决定哪些用户/组可以访问对象及访问权限 SACL (System Access Control List):系统访问控制列表,用于审计对对象的访问尝试 几乎所有Windows对象都是安全对象,包括:文件、目录、进程、线程、注册表、服务、管道、打印机、网络共享等。 0x01 DACL详解 DACL的三种情况 DACL为NULL :允许任何用户的完全访问权限 DACL为空(无ACE) :不允许任何用户的任何访问 DACL包含ACE :按顺序检查ACE,直到满足以下条件之一: 找到一个或多个ACE允许所有请求的访问权限 任何请求的访问权限被拒绝 ACE检查顺序的重要性 ACE的排列顺序直接影响权限检查结果。Windows会按顺序检查ACE,一旦匹配到相关条目就会停止检查。因此,拒绝访问的ACE应放在允许访问的ACE之前。 ACE继承机制 ACE可以继承自父对象 继承的ACE在子对象中不可修改 继承标志位控制继承行为 0x02 创建和修改DACL 图形界面方式 使用Windows资源管理器或"安全"属性页可以: 查看和编辑DACL 启用/禁用继承 添加/删除ACE 编程方式 使用Windows API创建DACL的标准流程: 分配和初始化安全描述符 识别要分配的对象 识别要分配的用户/组 分配内存给ACL 初始化ACL 添加ACE到ACL 设置安全描述符中的DACL 将安全描述符附加到对象 关键API: InitializeSecurityDescriptor SetSecurityDescriptorDacl AddAccessAllowedAce AddAccessDeniedAce 命令行工具 icacls :显示和修改文件/目录的ACL PowerShell : Get-Acl :获取对象的ACL Set-Acl :设置对象的ACL 0x03 实际测试案例 文件读取测试 查看文件当前ACL: 修改ACL: 禁用继承 删除除SYSTEM外的所有ACE 测试访问被拒绝 进程注入测试 查看进程ACL: 修改进程ACL删除当前用户权限 尝试进程注入失败(错误码:拒绝访问) 0x04 内核原理分析(Win10_ x64_ 20H2) 数据结构解析 EPROCESS结构 :包含进程基本信息 OBJECT_ HEADER :对象头结构,包含SecurityDescriptor SecurityDescriptor最后4位是快速引用标记 _ SECURITY_ DESCRIPTOR_ RELATIVE : 使用相对偏移而非绝对地址 DACL位于偏移0x30处 ACL结构 : AclSize:ACL总大小 AceCount:包含的ACE数量 _ ACE_ HEADER : AceType:ACE类型(如ACCESS_ ALLOWED_ ACE) AceFlags:标志位 AceSize:ACE大小 ACCESS_ ALLOWED_ ACE : Mask:访问权限掩码 SidStart:安全标识符(SID)起始位置 关键函数分析 RtlGetDaclSecurityDescriptor : 从安全描述符获取DACL指针 处理相对偏移计算 RtlGetAce : 遍历ACL查找指定索引的ACE 通过AceSize计算下一个ACE位置 权限掩码(ACCESS_ MASK) 权限掩码分为: 一般权限(GENERIC_ READ等) 标准权限(DELETE, READ_ CONTROL等) 特殊权限(对象特定权限) 0x05 参考资源 Microsoft官方文档 - 访问控制列表 Microsoft官方文档 - 安全描述符结构 Microsoft官方文档 - 可保护对象 Microsoft官方文档 - DACL和ACE Microsoft官方文档 - 访问掩码 ACL、DACL、SACL和ACE详解 Windows权限提升中的ACL利用