图5
看看CreateAppContainerProcessW的逻辑片段,把传入的CapabilitySIDs和PackageSID加入到ProcThreadAttributes,然后通过STARTUPINFOEX结构把ProcThreadAttributes传给了CreateProcessW。
图6
图7
图8
搞清楚IE Tab进程的创建逻辑,我们就可以创建自己的AppContainer进程了。
直接复用IE的PackageSID和CapabilitySIDs来创建AppContainer进程。如果需要定义自己的PackageSID,可以参考MSDN上的CreateAppContainerProfile等API,这里就不讨论了。
成功的创建出了具有AppContainer隔离机制的记事本进程。32位和64位进程都可以。可以自由组合Capability,这里我选择了IE Tab6个Capability里的3个。
图9
图10
如果程序在设计时没有考虑使用AppContainer隔离机制,依赖没有授权给AppContainer的系统资源,比如系统根目录,用户根目录等,使用AppContainer隔离机制启动程序会失败。
为描述方便,AppContainer进程的AccessToken我们简称为LowBoxToken(下同)。
下面是一个LowBoxToken的部分信息,可以看到TokenFlags的掩码位0×4000是置位的,这表示该Token是一个LowBoxToken。我们还可以看到PackageSid、Capabilities等信息(图2里标志为AppContainer和Capability的SID)。
图11
DACL的遍历是在SepNormalAccessCheck/SepMaximumAccessCheck里进行的。这里我们以SepNormalAccessCheck为例,来看一看如何处理AppContianer相关的ACE。
一般来说,在遍历DACL时,如果满足以下3个条件中的任意一个,检查停止。
1.有一个access-denied ACE明确拒绝了请求访问权限中的任意一个;
2.有一个或者多个access-allowed ACEs明确给予了所有的请求访问权限;