Perface
SEAndroid(Security-Enhanced Android,安全增强型Android)是在AOSP(Android的源码版)的基础上添加了一系列SELinux安全策略的功能加强版,其在架构和机制上与SELinux完全相同。
1 SEAndroid加强功能
SEAndroid主要的加强功能包括以下几项内容。
(1)加强MAC策略
保证所有进程的domain都被定义,且SELinux的默认模式是enforcing。
(2)加强Install MMAC策略
Install MMAC策略中的package和signature标签支持通过标签,来指定应用的context,但仅对预装应用有效。
所有第三方应用均无法通过该策略指定,只能由标签匹配,而且seinfo的值为“default”。
Install MMAC策略还可通过检查应用所申请的权限列表是否被允许,决定是否安装该应用;并且当应用已经安装在手机上之后,如果策略更新并与其产生冲突,那么该应用便不能继续运行。
Install MMAC检查流程如下。
1)安装或升级第三方应用时,检查其权限列表。如果在标签里有任一不允许的权限,那么该应用将不能安装或升级失败。
2)预装应用的升级过程,系统做权限检查。如果在package或者signature标签有任一不允许的权限,则升级失败;如果某一权限在package或者signature标签中没有显式声明为allow,而在default标签中声明为deny,升级同样失败。
(3)增加Intent MMAC的支持
Intent MMAC策略决定Intent是否可被分发到其他几种组件。 Intent MMAC策略会自动屏蔽所有没有被定义为允许的Intent分发。
(4)增加Content Provider MMAC的支持
Content Provider MMAC策略决定是否允许content provider的访问请求。Content Provider MMAC策略会自动屏蔽所有没有被定义为允许的访问请求。目前,支持use、read、read/write 3种权限。
(5)增加Revoke permission MMAC的支持
Revoke permissions MMAC策略决定权限在运行过程中是否会被检查。如果权限被撤消就会变成denied状态。
当然,除了指定的权限会被变成denied,其他权限都是允许的。
SEAndroid在为Android内核增加了SELinux加强功能支持的同时,在用户空间也实现了如下几方面的目标。
(1)提供一种集中的可分析的策略; (2)使应用在安装和运行过程中权限可控; (3)构造沙箱,使应用与应用、应用与系统相互隔离; (4)防止应用提权; (5)定义所有特权守护进程以防止权限滥用,并把它们的破坏降到最低。
主要实现方式包括如下几方面。
(1)针对Android重新编写TE策略; (2)为所有系统服务和应用定义domain; (3)利用MLS类别隔离应用; (4)为应用和应用数据文件夹提供灵活可配置的标注功能; (5)最小化SELinux用户空间的可用端口; (6)为Zygote socket commands的使用提供用户空间级别的权限检查; (7)为Android properties的使用提供用户空间级别的权限检查; (8)提供JNI方式的SELinux接口; (9)实现yaffs2文件系统的安全标注,文件系统镜像文件(yaffs2和ext4)编译时标注; (10)为recovery console和程序更新器提供标注功能; (11)基于内核的Binder IPC权限检测; (12)实现对由init进程所产生的服务端套接字(service sockets)和本地套接字文件(socket files)的标注功能; (13)实现对由ueventd进程所产生的设备节点(device nodes)的标注功能。
2 SEAndroid安全规则
SEAndroid主要采用TE和MLS两种强制访问方法,这两种方法都在其安全规则Policy中实现,Policy是整个SEAndroid安全机制的核心。
在SEAndroid中,除MLS检测被强制执行外,其他安全上下文与SELinux基本一致,由user、role、type、security level 4部分组成。
- user:SEAndroid中user仅有一个,即u;
- role:SEAndroid中role有两个,分别是r和object_r;
- type:SEAndroid中共有139种不同的type;
- security level:为MLS访问机制专门添加的安全上下文的扩展部分。
SEAndroid中安全上下文标记有4种方式,分别是基于策略语句标记、程序请求标记、初始SID标记以及默认标记。
(1)基于策略语句标记
SEAndroid的策略语句type_transition规则可指定新创建的文件或目录安全上下文。通常,新创建文件或目录的安全上下文和其父文件或父目录的安全上下文一致,type_transition规则也可为其指定特定的安全上下文。
(2)程序请求标记
SEAndroid提供API允许程序明确的请求标记。对于存储在支持标记文件系统上的与文件有关的客体,SEAndroid可通过调用相应的API即能在创建文件时设置其安全上下文,并且,在适当的relabelfrom和relabelto许可下,SEAndroid还可对与文件有关的客体进行重新标记。
(3)默认标记
默认标记方式在相关的策略标记规则不存在或没有关联策略标记规则的客体类别时使用。大部分客体类别的默认标记都继承创建它的进程或包括客体的容器的安全上下文。
(4)初始SID标记
初始SID(Security Identifiers,安全标识符)标记提供了一种特殊的默认标记行为。初始SID标记适用于两种环境:在系统初始化策略还未载入前对一部分内核相关的客体进行标记,以及当客体的安全上下文无效或安全上下文丢失时使用。初始SID的内容在initial_sids文件中定义,并在contexts文件中同时声明初始SID相应的安全上下文。
3 TE强制访问方式
**TE(Type Enforcement)强制访问方式是SEAndroid中最主要的安全手段,**所有关于TE的强制访问规则都被定义在后缀为te的文件中,SEAndroid为系统定义了33个te策略文件,这33个策略文件根据其针对的对象可以分为3类,如图4-6所示。
4 MLS强制访问方式
MLS(Multi-Level Security)称为多级别安全,是一种强制访问控制方法,MLS建立在TE安全基础之上。
MLS在SELinux为一个可选的访问控制方式,但在SEAndroid中,MLS是必选的安全访问控制方式之一。
(1)MLS相关参量
在SEAndroid中MLS的相关参量为安全上下文的第4列security level。在安全上下文第4列中有一个或两个security level,第一个表示低安全级别,第二个表示高安全级别。
每个security level都由两个字段:sensitivity和category组成。sensitivity有严格的分级,反映了一个有序的数据灵敏度模型。category是无序的,它反映的是数据划分的需要。对于要访问的数据必须同时有足够的sensivity和正确的category。
SEAndroid中,sensitivity只有一个级别即s0,category共有1024个,因此最低安全级别就是s0,最高安全级别就是s0:c0.c1023。
(2)MLS对进程的约束
MLS对于进程domain转换的原则是两个domain的高级别security level和低级别security level必须同时相等。当然,待转换的domain属于对MLS无限权限的type除外。
MLS对进程的操作原则是不上读、不下写。只有当主体domain的低级别security level对客体domain的低级别security level具有dom关系时,或者主体的domain属于对MLS有无限权限的type时,主体才能对客体进行读操作;只有当主体domain的低级别security level对客体domain的低级别security level具有domby关系时,或者主体的domain是属于对MLS有无限权限的type时,主体才能对客体进行写操作。
(3)MLS对socket的约束
只有当主体domain的高级别security level和低级别security level分别与客体local socket的type的security level相同,或者主体和客体任何一个的domain是属于对MLS无限权限的type时,主体才对客体的local socket拥有读、写、新建等访问权限。
只有当发送方的低级别security level与接受方的低级别security level满足domby关系时,或者主体和客体任何一个的domain是属于对MLS有无限权限的type时,发送方才对接受方拥有发送权限。
只有当客户端的低级别security level与服务端的低级别security level满足eq关系时,或者主体和客体任何一个的domain是属于对MLS有无限权限的type时,客户端才能获得连接服务端的权限。
(4)MLS对文件和目录的约束
对文件操作时,MLS要求客体的文件只有一个security level,即文件没有低级别和高级别的security level或者两个级别相同,并且当主体domain的低级别security level与客体文件的security level相同时,或者主体的domain属于对MLS有无限权限的type时,主体对客体文件拥有创建和重新标记安全上下文的权限。
MLS对目录的访问原则是不上读、不下写。只有当主体的低级别security level对客体目录的低级别security level满足dom关系时,或者主体和客体任何一个的domain属于对MLS有无限权限的type时,主体才能对客体的目录拥有读操作、获取目录属性、search权限等权限;
只有当主体的低级别security level对客体目录的低级别security level满足domby关系,或者主体和客体任何一个的domain属于对MLS有无限权限的type时,主体才能对客体目录拥有写操作、设置目录属性,重命名目录,添加或删除目录中的文件等权限。
MLS对文件的访问原则是不上读、不下写。只有当主体的低级别security level对客体文件的低级别security level满足dom关系,或者主体和客体任何一个的domain属于对MLS有无限权限的type时,主体才能对客体文件拥有读操作、获取属性信息、执行操作等权限;
只有当主体的低级别security level对客体文件的低级别security level满足domby关系,或者主体和客体任何一个的domain属于对MLS有无限权限的type时,主体能对客体文件拥有写操作、设置文件属性、重命名文件、创建及删除文件链接等权限。
(5)MLS对IPC的约束
对IPC操作时,MLS要求客体的IPC对象只有一个security level,并且当主体的低级别security level与客体的低级别security level满足eq关系,或者主体的domain属于对MLS有无限权限的type时,主体对客体的IPC有创建和销毁的权限。
MLS对IPC的访问原则是不上读、不下写。只有当主体的低级别security level对客体IPC的低级别security level满足dom关系,或者主体的domain是属于对MLS有无限权限的type时,主体对客体的IPC拥有读操作、获取文件属性信息、关联key等权限;只有当主体的低级别security level对客体IPC的低级别security level满足domby关系,或者主体的domain是属于对MLS有无限权限的type时,主体能对客体IPC拥有写操作、append操作等权限。
小结
SELinux作为Linux系统一个增强安全的补丁集,作为可加载的安全模块为Linux系统提供增强的安全功能。
- 1-SELinux的内核架构及其策略文件的生成、编译及载入内核的全过程
- 2-SELinux的4个关键技术——强制访问控制MAC的特点、类型强制TE规则、domain迁移实现及基于角色的访问控制RBAC规则
- 3-SELinux的最重要应用,SEAndroid的加强功能及安全机制。
**目前,SELinux安全机制在Android最新系统和多个自主OS系统中已经被广泛使用。**所以非常具有学习研究的价值。
由衷感谢前辈们的书和博客资料。
SELinux这个part涉及到了很多的东西,对很多的知识没有深入理解,后面会继续深入学习这部分,继续补充这两个板块的内容。
有时候真的感慨这个互联网给我们带了这么多的学习资源,当然自身也需要有筛选与甄别资料的能力。
参考资料
- 移动互联网时代的智能终端安全