强制完整性控制(英语:Mandatory Integrity Control)是一个在微软Windows操作系统中从Windows Vista开始引入,并沿用到后续版本系统的核心安全功能。强制完整性控制通过完整性级别标签来为运行于同一登录会话的进程提供隔离。此机制的目的是在一个潜在不可信的上下文(与同一账户下运行的其他较为可信的上下文相比)中选择性地限制特定进程和软件组件的访问权限。
强制完整性控制在对象的安全描述符中使用了一个新的访问控制项(ACE)类型来代表对象的完整性级别。在Windows中,访问控制列表(ACL)被限制为授予访问权限(读取、写入、执行权限)和特权给用户和组。在安全引用监视器执行授权授予对象的访问权限前,会将访问令牌中的完整性级别与安全描述符中的完整性级别比较。Windows 根据主体的完整性级别是高于还是低于所请求的对象,以及访问控制项中的完整性策略标志来决定是否授予访问权限。安全子系统以强制标签的形式实现完整性级别,以便和访问控制列表提供的自由访问控制区别开来。
Windows Vista定义了四个完整性级别: (SID: S-1-16-4096)、 (SID: S-1-16-8192)、 (SID: S-1-16-12288)、 (SID: S-1-16-16384)。默认情况下,普通用户启动的进程将获得中完整性级别,而提升的进程则获得高完整性级别。通过引入完整性级别,强制完整性控制可以分类隔离程序,使得沙箱化潜在危险程序(如进行网络通信的程序)成为可能。低完整性进程所拥有的访问权限少于那些拥有更高完整性级别的进程。
带有访问控制列表的对象(如命名对象,包括文件、注册表项,甚至进程和线程)有一个访问控制项,定义着最低需要哪个完整性级别才能访问此对象。Windows确保只有当进程的完整性级别等于或高于所请求的对象的完整性级别时,它才能写入或删除此对象。此外,拥有更高完整性级别的进程对象甚至不允许读取访问。
于是,一个进程就不能与另一个更高完整性级别的进程交互了。所以,进程不能通过 CreateRemoteThread()
API执行DLL注入到更高完整性级别的进程之类的功能,也不能使用 WriteProcessMemory()
函数发送数据到另一个进程。