3.已经检查完了所有的ACE,但是仍然至少有一个请求访问权限没有被明确给予,这种情况下,访问被拒绝。
从Windows Server 2003开始,DACL里ACE的顺序为:
Explicit ACE:AccessDenied Explicit ACE:AccessAllowed Inherited ACE:Access Denied Inherited ACE:Access Allowed
这个遍历规则和顺序保证了明确拒绝优先于明确允许;明确指定的访问控制优先于继承的访问控制。
以下的内容基于Win10PreX86(9926)。
在遍历类型为ACCESS_ALLOWED_ACE_TYPE的ACE时,如果ACE的SID前缀为SePackagePrefixSid(S-1-15-2)或者SeCapabilityPrefixSid(S-1-15-3),则跳转到处理AppContainer访问权限控制的逻辑:
图12
如果ACE的SID前缀为SePackagePrefixSid(S-1-15-2),会先看这个SID是否为ALLAPPLICATION PACKAGES,这是一个Well known SID
图13
如果是这个SID,认为匹配成功,不需要再精确比较SID了;否则和Token的PackageSID做精确匹配:
图14
如果ACE的SID前缀为SeCapabilityPrefixSid(S-1-15-3),会尝试匹配Token的Capabilities:
图15
PackageSID或者Capabilities匹配成功后,会通过a13记录获取到的权限以及还剩下未获取到的权限。a13是上层调用传进来的结构指针,上一层函数会根据这个结构的值,判断AppContainer进程是否获取到了请求的访问权限。
看看上一层函数SepAccessCheck的逻辑片段,var_AccessLowbox就是图14/15里的a13。如果PackageSID或者CapabilitieSID给予的权限不能完全覆盖用户请求的权限(var_Remaining != 0),则访问失败: