75 views

软件沙箱技术4 – Windows AppContainer

image

前面无论chroot和LXC技术都是虚拟化相关的隔离技术,虚拟的是Server或Host。沙箱中的应用根本无法看到沙箱外的世界。Windows AppContainer是另一种沙箱,它并不是基于虚拟化技术,也不是OS级别的,而是针对一个引用的访问控制进行限制。不同AppContainer的namespace可以是一个,但是访问沙箱外对象要经过访问控制。

 

对于Windows来说,实现类似LXC这样的OS级别沙箱代价大。因系统相关文件庞大,复制出来一份开销也大。不像是LXC,拷贝几个目录后chroot即可。目前Window现在还不支持原生的Docker。但是Windows支持内核级别的namespace,不知道是否跟进Linux。

 

Windows AppContainer是为Metro风格App引入的隔离技术(Metro风格就是Win Phone上的方块界面风格)。AppContainer和Andorid以及IOS应用的沙箱技术类似,在一个级别上。它是默认不允许访问操作系统的多数部分,对外设访问要申请权限等。一些访问权限参照这里。除了Metro风格应用,普通应用也可以运行于AppContainer中。

 

1.文件和外设访问的限制

 

参照【1】,有如下限定:

1.缺省只能访问AppData目录,包括local,roaming和temp子目录,应用删除uninstall后目录也被删除。

2.访问其它任何目录,例如media libraries、document,应用必须在manifest中显示声明权限要求,需要用户赋予权限(类似Android应用)

3.对于外设和传感器(摄像头、麦克风、地理传感器)访问也要声明。

 

2.Integrity Level

 

AppContainer的实现是通过在Win8中增加了一种新的完整性级别(integrity level)。完整性级别的概念参照MSDN(https://msdn.microsoft.com/en-us/library/bb625957.aspx)。

 

Level其实就是五个级别之一:(From 【2】)

System         — 系统进程Level

High             — Administrator进程Level

Medium       —  默认的用户进程Level

Low               — IE的Level

Untrusted    — Chrome的Level,微软看起来不太厚道

它是Vista引入的,被附加在进程和对象(例如应用创建的文件)上。低Level的进程不能访问高Level的对象和进程。

 

基于Integrity Level机制,Windows增强了对user和group的访问控制。它的过程如下:

1.user login到系统,windows安全子系统会为它生成Security Access Token,Token中其中包括user的SID和它所属的groups的SID。

2.token会被附加在user运行的所有的进程上。

3.当进程打开一个对象(例如文件或注册表项),负责这个对象的资源管理器会调用安全子系统的功能判断是否可以进行访问。

4.安全子系统比较user和groups的SID和对象的security descriptor中的访问权限(SID可以赋予的访问权限就是简单的读、写和执行)。

为了比较操作可以进行,在对象的security descriptor中引入了一类新的ACE(Access Control Entity)用于表示它的integrity level。只有当前进程的Level高于对象的Level,才可以通过。

5.后继的检查(DACL等)继续。

 

Win8中,这一概念被扩充到AppContainer上,容器内的进程访问容器外的object需要经过Level的检测。这时没有AppContainer而不是User被赋予一个SID,来模拟User的检测行为。App可以属于一个组,访问特定资源,这些组被称为“Capabilities”,这些组包括几个类别:

Library Capabilities

Device Capabilities

Network Capabilities

Identify Capabilities

System Capabilities

这样就和前面提到的App manifest配置打通了。

 

 

3.Namespace

类似Linux,Windows对知名内核对象也使用namespace进行了隔离。

例如,以下是进程3的名为‘Foo’的知名内核对象:

“\Sessions\3\AppContainerNamedObjects\S-1-15-2-wwwwwwww-xxxxxxxx-yyyyyyyy-zzzzzzzz\Foo

枚举内核对象的时候也可以通过Container专有API了:GetAppContainerNamedObjectPath。

 

4.Network Isolation

通过将应用归为如下几类来实现

Internet client

Internet Server

Private network client

 

报文过滤框架WFP(Window Filter Platform)支持AppContainer级别的Window Filter

 

5.其它

需要提到的是Windows对AppContainer的官方支持是限定于所谓Moden UI(也就是Metro Style)。它是为Win Phone定做的。IE10也会运行在容器中(参照【3】)。其实Windows普通应用也可以在容器中运行,但是需要折腾,参照【4】. IOS和Android想必也有类似AppContainer概念,不研究了。

 

【参考】

1.Windows 8 App Container Security Notes – Part 1,http://recxltd.blogspot.com/2012/03/windows-8-app-container-security-notes.html

2.Demystifying AppContainers in Windows 8 (Part I),http://blog.nextxpert.com/2013/01/31/demystifying-appcontainers-in-windows-8-part-i/

3.Demystifying AppContainers (Part II),http://blog.nextxpert.com/2013/02/18/internet-explorers-special-way-handling-appcontainers/

4.Securing Microsoft Windows 8: AppContainers,http://news.saferbytes.it/analisi/2013/07/securing-microsoft-windows-8-appcontainers/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">