首页 > 代码库 > 从错误0x80070522,谈强制完整性控制(MIC)。

从错误0x80070522,谈强制完整性控制(MIC)。

在Windows 7碰到一个奇怪的问题,DE二个盘,NTFS的权限(属性--安全页)一模一样,没有任何区别,但在E盘根目录可以创建文件或文件夹,而在D盘根目录下报错:0x80070522,如果使用应用程序将文件保存到D盘根目录,则直接报拒绝访问。

先说解决办法,以管理员身份运行 CMD并执行以下命令:

icacls d:\ /setintegritylevel M

为了解决在之前Windows版本的因用户权限带来的安全问题,从Vista开始引入了UAC(User Account Control,用户帐户控制/接口权限隔离),即使使用Administrators的帐号也默认以普通用户权限运行,只有通过UAC提升特权后,才能真正使用管理员级别的特权限。

PS:UAC也导致在User环境下,通过runas来运行Administrator的失败。Vista之后的权限提升只能通过UAC,杜绝了无人参与的权限提升可能。

同时,为了解决在管理权限下与一般用户权限的应用程序共享同一个桌面环境的安全性威胁,对process(程序进程)与资源(具备 ACL,能够设权限)都实施了Mandatory Integrity Level (IL),确保低权限的处理程序不可以影响高权限的处理程序 (这个就需要 Mandatory Integrity Control 的支持)。

IL 总共有四级:
• Low (100):保护模式下的 IE
• Medium (200):一般正常的处理程序
• High (300):提升特权后的处理程序
• System (400):系统处理程序 (包含 Automatic Update)

在某一个处理程序尝试要修改某一个资源时,会在检查权限之前,先检查两者的 IL 等级,只有在处理程序的 IL 等级大于等于所要修改的资源的 IL 等级时,才会去检查资源的权限(如DACL、NTFS权限),否则就直接拒绝修改。

举个例子,进程只能访问小于等于它们完整性级别的文件。所以让我们设想,我在我的本地帐户(非管理员帐户)上运行了记事本。默认情况下,记事本拥有中完整性级别。只要我尝试写入一个有中等或更低完整性级别的文件,操作就会成功。然而,如果存在一个文件,他的完整性级别是高等,那么记事本的写入操作就会失败,因为记事本没有合适的完整性权限来访问和写入那个资源。

通过提升特权来执处理程序式IL等,通过icacls /setintegritylevel <L|M|H>来调整资源的 IL 等级。

D:\>echo a>a.txtD:\>icacls a.txta.txt BUILTIN\Administrators:(I)(F)      NT AUTHORITY\SYSTEM:(I)(F)      NT AUTHORITY\Authenticated Users:(I)(M)      BUILTIN\Users:(I)(RX) 已成功处理 1 个文件; 处理 0 个文件时失败D:\>icacls a.txt /setintegritylevel H已处理的文件: a.txt已成功处理 1 个文件; 处理 0 个文件时失败D:\>icacls a.txta.txt BUILTIN\Administrators:(I)(F)      NT AUTHORITY\SYSTEM:(I)(F)      NT AUTHORITY\Authenticated Users:(I)(M)      BUILTIN\Users:(I)(RX)      Mandatory Label\High Mandatory Level:(NW)已成功处理 1 个文件; 处理 0 个文件时失败D:\>icacls a.txt /setintegritylevel M已处理的文件: a.txt已成功处理 1 个文件; 处理 0 个文件时失败D:\>icacls a.txta.txt BUILTIN\Administrators:(I)(F)      NT AUTHORITY\SYSTEM:(I)(F)      NT AUTHORITY\Authenticated Users:(I)(M)      BUILTIN\Users:(I)(RX)      Mandatory Label\Medium Mandatory Level:(NW)已成功处理 1 个文件; 处理 0 个文件时失败D:\>

特别提醒的是,IL 的检查只会出现在针对资源的变动 (修改、删除、建立) 时才会进行,也就是如果只是读取资源,是不会检查 IL 的。

Internet Explorer 的 “保护模式” 事实上是使用了完整性级别来完成它的目标。因为 IE 保护模式运行于低完整性级别,而文件系统中所有文件(和运行的进程)默认拥有中完整性级别,那么试图写入这些文件或进程都会失败。

如果用户在保护模式执行下的 IE 中去使用网银,就无法存取Key了,这时候可以将该网站的网址加入「信任的网站」区域,这样以后浏览该网站时,就会另外开一个 IL=Medium 的 IE 来显示网站内容与执行网站上的客户端程序。

 

ICACLS HELP

ICACLS name /save aclfile [/T] [/C] [/L] [/Q]    将匹配名称的文件和文件夹的 DACL 存储到 aclfile 中    以便将来与 /restore 一起使用。请注意,未保存 SACL、    所有者或完整性标签。ICACLS directory [/substitute SidOld SidNew [...]] /restore aclfile                 [/C] [/L] [/Q]    将存储的 DACL 应用于目录中的文件。ICACLS name /setowner user [/T] [/C] [/L] [/Q]    更改所有匹配名称的所有者。该选项不会强制更改所有    身份;使用 takeown.exe 实用程序可实现    该目的。ICACLS name /findsid Sid [/T] [/C] [/L] [/Q]    查找包含显式提及 SID 的 ACL 的    所有匹配名称。ICACLS name /verify [/T] [/C] [/L] [/Q]    查找其 ACL 不规范或长度与 ACE    计数不一致的所有文件。ICACLS name /reset [/T] [/C] [/L] [/Q]    为所有匹配文件使用默认继承的 ACL 替换 ACL。ICACLS name [/grant[:r] Sid:perm[...]]       [/deny Sid:perm [...]]       [/remove[:g|:d]] Sid[...]] [/T] [/C] [/L] [/Q]       [/setintegritylevel Level:policy[...]]    /grant[:r] Sid:perm 授予指定的用户访问权限。如果使用 :r,        这些权限将替换以前授予的所有显式权限。        如果不使用 :r,这些权限将添加到以前授予的        所有显式权限。    /deny Sid:perm 显式拒绝指定的用户访问权限。        将为列出的权限添加显式拒绝 ACE,        并删除所有显式授予的权限中的相同权限。    /remove[:[g|d]] Sid 删除 ACL 中所有出现的 SID。使用        :g,将删除授予该 SID 的所有权限。使用        :d,将删除拒绝该 SID 的所有权限。    /setintegritylevel [(CI)(OI)]级别将完整性 ACE 显式        添加到所有匹配文件。要指定的级别为以下级别        之一:             L[ow]             M[edium]             H[igh]        完整性 ACE 的继承选项可以优先于级别,但只应用于        目录。    /inheritance:e|d|r        e - 启用继承        d - 禁用继承并复制 ACE        r - 删除所有继承的 ACE注意:    Sid 可以采用数字格式或友好的名称格式。如果给定数字格式,    那么请在 SID 的开头添加一个 *。    /T 指示在以该名称指定的目录下的所有匹配文件/目录上        执行此操作。    /C 指示此操作将在所有文件错误上继续进行。        仍将显示错误消息。    /L 指示此操作在符号      链接本身而不是其目标上执行。    /Q 指示 icacls 应该禁止显示成功消息。    ICACLS 保留 ACE 项的规范顺序:            显式拒绝            显式授予            继承的拒绝            继承的授予    perm 是权限掩码,可以指定两种格式之一:        简单权限序列:                N - 无访问权限                F - 完全访问权限                M - 修改权限                RX - 读取和执行权限                R - 只读权限                W - 只写权限                D - 删除权限        在括号中以逗号分隔的特定权限列表:                DE - 删除                RC - 读取控制                WDAC - 写入 DAC                WO - 写入所有者                S - 同步                AS - 访问系统安全性                MA - 允许的最大值                GR - 一般性读取                GW - 一般性写入                GE - 一般性执行                GA - 全为一般性                RD - 读取数据/列出目录                WD - 写入数据/添加文件                AD - 附加数据/添加子目录                REA - 读取扩展属性                WEA - 写入扩展属性                X - 执行/遍历                DC - 删除子项                RA - 读取属性                WA - 写入属性        继承权限可以优先于每种格式,但只应用于        目录:                (OI) - 对象继承                (CI) - 容器继承                (IO) - 仅继承                (NP) - 不传播继承                (I) - 从父容器继承的权限示例:        icacls c:\windows\* /save AclFile /T        - 将 c:\windows 及其子目录下所有文件的          ACL 保存到 AclFile。        icacls c:\windows\ /restore AclFile        - 将还原 c:\windows 及其子目录下存在的 AclFile 内          所有文件的 ACL。        icacls file /grant Administrator:(D,WDAC)        - 将授予用户对文件删除和写入 DAC 的管理员          权限。        icacls file /grant *S-1-1-0:(D,WDAC)        - 将授予由 sid S-1-1-0 定义的用户对文件删除和          写入 DAC 的权限。

 

从错误0x80070522,谈强制完整性控制(MIC)。