iOS 安全模型浅析(二) ---- 沙盒机制
苹果的沙盒机制想必大家都听过,并且都会称赞这是iOS做的比安卓系统好的一个重要因素,沙盒机制让iOS更为安全。
沙盒机制历史上被称作安全带,是一种基于FreeBSD系统(是一种类UNIX操作系统,是由经过BSD、386BSD和4.4BSD发展而来的Unix的一个重要分支)TrustedBSD框架的强制访问控制(MAC)机制,他的主要推动者是罗伯特沃森。这里我只是简单介绍一下,详细的信息以及介绍可以看这里TrustedBSD MAC框架介绍(http://shouce.jb51.net/freebsd-arch-handbook/mac.html),这份文档写得十分详尽,感兴趣的读者可以看看。
言归正题,沙盒机制采用一种类似于Lisp的配置语言来描述那些资源系统可以访问,哪些禁止访问。这些资源包括文件、系统服务、网络连接、内存资源等。MAC机制不同于传统的访问控制机制(比如自主访问控制DAC),他不允许主体(比如用户进程)操作对象(文件、套接字等)。DAC最常见的形式就是Unix系统上的用户、组和其它权限,所有这些都可以被授予读、写或执行的权限。在DAC系统中,用户如果拥有了一个对象的所有权,也就拥有了该对象的修改权限。例如,你有一个文件,你可以将其设置为全局可读或可写,这显然是破坏了访问机制。
MAC是一个广义的术语,在沙盒中意味着应用程序被关进了一个虚拟的容器。该容器遵循一系列的特定规则,即哪些系统资源可以被访问,比如网络资源、文件读写、进程克隆等。在OS X中你可以部分控制应用程序的沙盒功能,但是在iOS中,所有的第三方应用都要遵循唯一的限制策略。
在文件访问方面,一般只能访问应用程序的包目录。应用程序可以读写存储在该位置的文件。不过这一基本规则存在少许的例外。例如,在某些iOS版本中,图片一般存储在目录/private/var/mobile/Media/Photos/ 中。尽管它在应用程序的包目录之外,但第三方应用还是可以直接访问,这样应用程序就无需获得用户许可就能访问系统相册,在之前的iOS版本中,如果想要阻止应用程序滥用权力,就只能将希望寄托在苹果审核的身上。但是在最新的iOS10系统里,所有访问操作都必须经过授权,而且在应用开发时必须将要使用到的权限(如相册、相机、麦克风)写入plist文件中,不然应用程序在使用到这些API时会崩溃,而且审核应用时一定会被拒绝。
安卓的访问控制机制与MAC不同。安卓实现了一个更加传统的DAC模型,应用程序都有自己的用户ID和属于该ID的文件夹,其权限管理严格按照传统的Unix文件权限管理运作。虽然两种机制工作起来都没有问题,但是MAC的扩展性总体来说还是要更强一些。例如,除了应用目录隔离,MAC机制还可以限制网络访问或守护系统进程的操作。
术语解析(详情请点文中链接查看):
FreeBSD: 以一个内核安全扩展性框架(TrustedBSD MAC 框架)的方式,为若干强制访问控制策略(也称“集权式访问控制策略”) 提供试验性支持。MAC 框架是一个插入式的访问控制框架,允许新的安全策略更方便地融入内核:安全策略可以静态链入内核,也可以 在引导时加载,甚至在运行时动态加载。该框架所提供的标准化接口,使得运行在其上的安全策略模块能对系统对象的安全属性进行诸如标记等一系列操作。 MAC 框架的存在,简化了这些操作在策略模块中的实现,从而显著降低了新安全策略模块的开发难度。
TrustedBSD:MAC 框架提供的机制,允许在其上运行的内核模块在内核编译或者运行时,对内核的访问控制模型进行扩展。 新的系统安全策略作为一个内核模块实现,并被链接到内核中;如果系统中同时存在多个安全策略模块,则它们的决策结果将以某种确定的方式组合。 为了给简化新安全策略的开发,MAC 向上提供了大量用于访问控制的基础设施,特别是对临时的或者持久的、策略无关的对象安全标记的支持。