强制完整性控制

强制完整性控制使用完整性级别和强制策略来评估权限,这是一种控制安全对象访问的机制

这是从 Windows Vista 新增的安全机制,是对在DACL之前检查

完整性级别

完整性级别用于对安全对象的保护,较低完整性级别的主体无法写入较高完整性级别的对象

完整性标签指定安全对象和安全主体的完整性级别(缺少完整性标签的对象被视为中等完整性),完整性标签由完整性SID表示,安全对象的完整性SID存储在SACL的SYSTEM_MANDATORY_LABEL_ACE这个ACE中,安全主体的完整性SID存储在访问令牌中(可能有多个完整性SID),该SID使用格式为S-1-16-RID,其中RID的值及完整性级别为以下内容:

RID
标识

SECURITY_MANDATORY_UNTRUSTED_RID

0x00000000

不可信

SECURITY_MANDATORY_LOW_RID

0x00001000 (十进制为4096)

完整性低

SECURITY_MANDATORY_MEDIUM_RID

0x00002000 (十进制为8192)

中等完整性

SECURITY_MANDATORY_MEDIUM_PLUS_RID

SECURITY_MANDATORY_MEDIUM_RID + 0x100 (十进制为8448)

中等高完整性

SECURITY_MANDATORY_HIGH_RID

0X00003000 (十进制为12288)

完整性高

SECURITY_MANDATORY_SYSTEM_RID

0x00004000 (十进制为16384)

系统完整性

SECURITY_MANDATORY_PROTECTED_PROCESS_RID

0x00005000 (十进制为20480)

受保护的进程

  • 受保护

    默认未被使用,仅能通过内核模式调用设置

  • 系统完整性

    这是由本地服务、网络服务和系统账户下运行的进程和服务,该级别是在管理员和系统之间提供一个安全层,即使以管理员身份运行的进程也无法与该级别进程交互

  • 高完整性

    这是分配给管理员账户的默认完整性级别,如果开启了UAC,该级别是分配给通过UAC的管理员

  • 中完整性

    这是分配给标准用户(包括未过UAC的管理员用户)的完整性级别,该完整性级别的进程只能修改 HKEY_CURRENT_USER、非受保护文件夹中的文件以及具有相同或更低完整性的进程

  • 低完整性

    该完整级别默认不分配给进程,一般通过继承或父进程设置

    该级别的进程只能在HKEY_CURRENT_USER\Software\AppDataLow 下操作,或者将文件写入 %USERPROFILE%\AppData\LocalLow 目录下

  • 不受信任

    用于Anonymous组(未经过身份验证的远程用户)启动的进程

注:

  • 进程无法更改自己的完整性等级

  • 进程运行就无法更改完整性等级,但是通过UAC的程序可以提升完整性等级

  • 进程只能创建等同或比自己更低的完整性等级的进程

  • 进程不能修改或写入更高完整性等级的进程或文件,但是有SE_DEBUG_NAME 权限的高完整性等级的进程可以修改更高完整性等级的进程

强制策略

安全对象SACL中定义了SYSTEM_MANDATORY_LABEL_ACE这个ACE,该ACE包含一个访问掩码,在这个策略中用于指定授予低于对象完整性级别的主体的访问,掩码定义值为:

  • SYSTEM_MANDATORY_LABEL_NO_WRITE_UP (0x1)

  • SYSTEM_MANDATORY_LABEL_NO_READ_UP(0x2)

  • SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP (0x4)

默认为SYSTEM_MANDATORY_LABEL_NO_WRITE_UP

一些特权与完整性级别

有些特权是可以直接赋给用户然后就可以执行,但是有些特权只能在高完整性级别下使用,这些特权极为强大,例如:

  • SeDebugPrivilege 调试程序

  • SeTakeOwnshipPrivilege 取得所有权

  • SeRestorePrivilege 还原文件和目录

  • SeLoadDriverPrivilege 加载和卸载设备驱动程序

  • SeCreateTokenPrivilege 创建令牌对象

  • SeTcbPrivilege 以操作系统方式执行

测试

中完整性对高完整性文件操作

测试如图

  • 较低完整性级别的进程为程序或文件无法设置较高的完整性级别

  • 因为强制性策略的默认设置,较低完整性级别可读或运行完整性级别高的文件或程序,但是不可修改

管理员令牌查看

使用windbg内核调试,查看令牌

这是未过UAC的管理员启动的cmd的令牌

这是过了UAC的管理员用户启动的cmd的令牌

对于这两个令牌来说,最大的区别有:

  • S-1-5-114(管理员组的本地账户和成员)和S-1-5-32-544(管理员)在未过UAC的令牌中式被ban了

  • 最后一个SID即完整性级别,未过UAC是8192对应中完整性级别,过了UAC是12288对应高完整性级别

  • 特权

赋予特权的普通用户令牌查看

这是赋予了SeDebugPrivilege特权的普通用户test1未过UAC启动的cmd令牌

这是赋予了SeDebugPrivilege特权过了UAC启动的cmd的令牌

这两个令牌最主要差距:

  • 最后一个SID即完整性级别差距

  • 特权(过了UAC多了SeDebugPrivilege特权)

查看安全描述符

这是中完整性级别进程的安全描述符,可以在SACL中看见SID对应着中完整性级别

Last updated