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为间隔

完整性等级分类

  1. System(系统)

    • 最高完整性级别(0x4000)
    • 本地服务、网络服务和系统账户使用的级别
    • 提供管理员和系统间的安全层
    • 例外:拥有SE_DEBUG_NAME权限的管理员可交互
  2. High(高)

    • 管理员账户下运行的进程默认级别(0x3000)
    • 启用UAC时仅提供给提升权限的用户
  3. Medium(中)

    • 非管理员用户或启用UAC的管理员账户进程(0x2000)
    • 只能修改:
      • HKEY_CURRENT_USER
      • 非受保护文件夹中的文件
      • 相同或更低完整性的进程
  4. Low(低)

    • 最低常规级别(0x1000)
    • 默认不分配,需继承或由父进程设置
    • 限制:
      • 只能操作HKEY_CURRENT_USER\Software\AppDataLow
      • 只能写入%USERPROFILE%\AppData\LocalLow
      • 可读取大部分数据
  5. Untrusted(不受信任)

    • 最低级别(0x0000)
    • 默认不使用
  6. Protected(受保护)

    • 高于System的级别
    • 默认未使用
    • 只能由内核层设置

完整性等级规则

  1. 进程无法更改自身完整性等级
  2. 运行中的进程完整性等级不可修改(即使由更高完整性进程)
  3. 进程只能创建相同或更低完整性等级的进程
  4. 进程不能修改或写入更高完整性等级的进程或文件

例外情况

  1. 拥有SE_DEBUG_NAME权限的高完整性进程可修改更高完整性进程
  2. 中等完整性进程可通过Bypass UAC操作提升至高完整性
  3. 进程可请求从中等提升至高完整性(需UAC用户确认)

0x03 完整性控制实践

工具使用

  1. icacls

    • 微软提供的命令行工具
    • 可修改文件和对象的完整性等级
  2. Chml

    • 更强大的替代方案
    • 可查看详细完整性等级和权限
    • 下载地址:http://www.minasi.com/apps/

文件保护方案

将敏感文件的完整性等级设为高完整性:

  1. 低/中等完整性进程无法读取
  2. 只有管理员权限可访问

操作示例:

icacls 文件名 /setintegritylevel High

进程注入测试

  1. 相同完整性等级进程间注入成功
  2. 低完整性进程无法注入中等/高完整性进程(访问被拒绝)

0x04 内核原理分析

完整性等级存储

在Windows内核中,强制完整性等级存储在_TOKEN结构体中:

  1. 通过EPROCESS结构找到Token地址(通常位于0x4b8偏移)
  2. Token中完整性等级相关信息位于0xd0偏移(仅为索引)

完整性等级查找流程

  1. 调用SepCopyTokenIntegrity函数

  2. 内部调用SepLocateTokenIntegrity

    • 从Token获取IntegrityLevelIndex
    • 索引为-1时返回0(使用SeUntrustedMandatorySid)
    • 否则:索引×16后在UserAndGroups中查找
  3. 返回SID_AND_ATTRIBUTES结构:

    • 第一个字段:指向SID结构的指针
    • 偏移8:Attributes

SID结构解析

示例中等完整性等级SID:

  • 格式:S-1-16-8192 (0x2000)
  • 16表示强制完整性标识
  • 0x2000对应中等完整性等级

0x05 参考资源

  1. Microsoft官方文档-MIC
  2. Windows完整性级别与恶意软件防护
  3. DLL注入与完整性级别
  4. IE保护模式与低完整性环境
  5. TOKEN_GROUPS结构
  6. SID_AND_ATTRIBUTES结构
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/ 文件保护方案 将敏感文件的完整性等级设为高完整性: 低/中等完整性进程无法读取 只有管理员权限可访问 操作示例: 进程注入测试 相同完整性等级进程间注入成功 低完整性进程无法注入中等/高完整性进程(访问被拒绝) 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对应中等完整性等级 0x05 参考资源 Microsoft官方文档-MIC Windows完整性级别与恶意软件防护 DLL注入与完整性级别 IE保护模式与低完整性环境 TOKEN_ GROUPS结构 SID_ AND_ ATTRIBUTES结构