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的三种情况
- 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:
InitializeSecurityDescriptorSetSecurityDescriptorDaclAddAccessAllowedAceAddAccessDeniedAce
命令行工具
-
icacls:显示和修改文件/目录的ACL
icacls filename /grant user:permission icacls filename /deny user:permission -
PowerShell:
Get-Acl:获取对象的ACLSet-Acl:设置对象的ACL
0x03 实际测试案例
文件读取测试
-
查看文件当前ACL:
Get-Acl -Path "C:\path\to\file" | Format-List -
修改ACL:
- 禁用继承
- 删除除SYSTEM外的所有ACE
- 测试访问被拒绝
进程注入测试
-
查看进程ACL:
Get-Process -Name notepad | Get-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等)
- 特殊权限(对象特定权限)