Windows原理深入学习系列-强制完整性控制
字数 1762 2025-08-07 08:22:27
Windows强制完整性控制(MIC)深入解析
0x01 强制完整性控制概述
强制完整性控制(Mandatory Integrity Control, MIC)是Windows Vista引入的安全机制,作为自主访问控制列表(DACL)的补充,并在DACL检查之前执行。
核心特性
- 完整性级别检查先于DACL检查
- 低完整性主体无法写入中等完整性对象
- 限制不同进程间的交互,特别是防止低完整性进程注入高完整性进程
- 同一用户下根据可信程度限制资源访问
通信例外
以下通信方式不受完整性级别限制:
- 共享内存
- Sockets
- RPC
- Windows消息机制
- 命名管道
0x02 完整性等级体系
Windows使用SID格式定义完整性等级,格式为:S-1-16-xxxx,其中:
16表示强制完整性标识xxxx是表示完整性等级的RID值,以0x1000为间隔
完整性等级分类
-
System(系统)
- 最高完整性级别(0x4000)
- 本地服务、网络服务和系统账户使用的级别
- 提供管理员和系统间的安全层
- 例外:拥有SE_DEBUG_NAME权限的管理员可交互
-
High(高)
- 管理员账户下运行的进程默认级别(0x3000)
- 启用UAC时仅提供给提升权限的用户
-
Medium(中)
- 非管理员用户或启用UAC的管理员账户进程(0x2000)
- 只能修改:
- HKEY_CURRENT_USER
- 非受保护文件夹中的文件
- 相同或更低完整性的进程
-
Low(低)
- 最低常规级别(0x1000)
- 默认不分配,需继承或由父进程设置
- 限制:
- 只能操作HKEY_CURRENT_USER\Software\AppDataLow
- 只能写入%USERPROFILE%\AppData\LocalLow
- 可读取大部分数据
-
Untrusted(不受信任)
- 最低级别(0x0000)
- 默认不使用
-
Protected(受保护)
- 高于System的级别
- 默认未使用
- 只能由内核层设置
完整性等级规则
- 进程无法更改自身完整性等级
- 运行中的进程完整性等级不可修改(即使由更高完整性进程)
- 进程只能创建相同或更低完整性等级的进程
- 进程不能修改或写入更高完整性等级的进程或文件
例外情况
- 拥有SE_DEBUG_NAME权限的高完整性进程可修改更高完整性进程
- 中等完整性进程可通过Bypass UAC操作提升至高完整性
- 进程可请求从中等提升至高完整性(需UAC用户确认)
0x03 完整性控制实践
工具使用
-
icacls
- 微软提供的命令行工具
- 可修改文件和对象的完整性等级
-
Chml
- 更强大的替代方案
- 可查看详细完整性等级和权限
- 下载地址:http://www.minasi.com/apps/
文件保护方案
将敏感文件的完整性等级设为高完整性:
- 低/中等完整性进程无法读取
- 只有管理员权限可访问
操作示例:
icacls 文件名 /setintegritylevel High
进程注入测试
- 相同完整性等级进程间注入成功
- 低完整性进程无法注入中等/高完整性进程(访问被拒绝)
0x04 内核原理分析
完整性等级存储
在Windows内核中,强制完整性等级存储在_TOKEN结构体中:
- 通过EPROCESS结构找到Token地址(通常位于0x4b8偏移)
- Token中完整性等级相关信息位于0xd0偏移(仅为索引)
完整性等级查找流程
-
调用
SepCopyTokenIntegrity函数 -
内部调用
SepLocateTokenIntegrity:- 从Token获取IntegrityLevelIndex
- 索引为-1时返回0(使用SeUntrustedMandatorySid)
- 否则:索引×16后在UserAndGroups中查找
-
返回
SID_AND_ATTRIBUTES结构:- 第一个字段:指向SID结构的指针
- 偏移8:Attributes
SID结构解析
示例中等完整性等级SID:
- 格式:S-1-16-8192 (0x2000)
- 16表示强制完整性标识
- 0x2000对应中等完整性等级