Win8开始,Windows引入了新的进程隔离机制AppContainer,MetroAPP以及开启EPM的IE Tab进程都运行在AppContainer隔离环境,在最新的Win10Pre(9926)上,仍然如此。腾讯反病毒实验室对AppContainer的工作机制做一深入解读。
Vista以前的系统,如XP,用安全描述符(简称SD,下同)里的DACL(discretionaryaccess control list)来控制用户和用户组的访问权限。
Vista以后,增加了IntegrityMechanism,在SD的SACL(system access control list)里增加一个mandatory label的ACE,扩展了Windows安全体系。默认的控制策略是No-Write-Up,允许较低完整性级别的进程读访问较高完整性级别的对象;禁止较低完整性级别的进程写访问较高完整性级别的对象。
Win8引入了AppContainer隔离机制,提供了更细粒度的权限控制,能够阻止对未授权对象的读写访问。
以Win10PreX64(9926)开启EPM的IE Tab进程为例,看看有哪些变化。
从ProcessExplorer里可以看到,IE Tab进程的完整性级别不再是Low,而是变成了AppContainer:
图1
在进程属性的Security标签可以看到,增加了标志为AppContainer以及Capability的SID:
图2
一个AppContainer进程可以访问的对象,在SD的DACL里增加了额外的ACE。以IE Tab进程的进程对象为例:
图3
这里我们不讨论MetroAPP,主要看看DesktopAPP如何使用AppContainer隔离机制。
仍然以Win10PreX64(9926)开启EPM的IE Tab进程为例:在IE选项里开启EPM,下断点nt!NtCreateLowBoxToken,然后新建IE Tab,命中断点,截取最上面的几层调用栈:
图4
可见,通过CreateProcess这个API就可以创建出AppContainer进程。
看看CreateAppContainerProcessStrW的逻辑片段,把PackageSIDString(图2里标记为AppContainer的SID)和CapabilitySID(图2里标记为Capability的SID) string转为SID后,传给了CreateAppContainerProcessW: