图16
另外,对于No DACL的情况,也有额外的处理逻辑。AppContainer进程访问No DACL的对象时,是无法获得访问权限的:
图17
所以在Win8及以上系统中,我们如果想要创建一个所有进程(包括开启EPM的IE Tab )都能访问的对象,对于该对象的SD,除了在SACL里指定为低完整性级别外,还要考虑在DACL中显示的给予everyone以及ALL APPLICATIONS PACKAGE对应的访问权限控制。
在遍历类型为ACCESS_DENIED_ACE_TYPE的ACE时,处理逻辑里并没有区分ACE的SID是否为PackageSID或者CapabilitiesSID。而是简单使用SepSidInTokenSidHash函数在Token的SidHash/RestrictedSidHash里匹配。如果是PackageSID或者CapabilitiesSID,匹配会失败,因此该ACE描述的拒绝访问权限控制不会生效:
图18
做一个实验验证上面的结论,首先我们用AppContainer隔离机制启动一个记事本,复用IE EPM的PackageSID以及部分Capabilities:
图19
把C:Users{当前用户}AppDataLocalPackageswindows_ie_ac_001ACTemptest1.txt设置为下面的权限控制:
图20
图21
ACE[0]Mask为0x001F01FF,包含要请求的权限0×00100080
虽然ACE[0]明确的拒绝了
S-1-15-2-1430448594-2639229838-973813799-439329657-1197984847-4069167804-1277922394(图19里标志为AppContainer的SID),记事本仍然能成功打开1.txt(ACE[1]明确给予了ALL APPLICATION PACKAGES 0x001F01FF的访问权限)。
AppContainer提供了更细粒度的隔离机制,不仅能用于MetroAPP和 IE EPM,当应用程序需要访问未知第三方内容时,也可以考虑使用AppContainer隔离机制,把对系统的潜在影响降到最低。