建议阅读
文章完成后,有天偶然翻到google文档才发现关于SEAndroid安全机制非常详细的资料,建议阅读https://source.android.com/security/selinux/device-policy
引言
近一年的工作,经常遇到要处理一些内核节点的权限问题,这就涉及到SEAndroid安全机制。学会如何这类处理问题,同时也需要了解下SEAndroid安全机制究竟是何方神圣,框架和用途又是怎样。
1. 安全机制
- 在Selinux之前,Linux使用的安全机制称为DAC(自主访问控制),主要根据文件所属的分组来限制对资源的访问。分为:拥有者,同组用户和其他用户,一般在终端通过ls -Z命令可以查看各资源文件的DAC权限设置。这是一种非常粗略的权限管理方法,只能控制对资源文件的读写和执行,不能进行更精确的控制。
- DAC机制的问题在于它区别用户和程序,它将所有用户运行的程序赋予和用户相同的权限。一旦病毒和木马程序获取了系统的root权限,将没有任何手段阻止他们对系统的破坏和窃取信息。
- MAC(强制访问控制),它将系统中的资源分密级和类别进行管理,保证每个用户只能访问那些明确授权可以访问的资源。MAC有2个重要的概念:Subject和Object。主体通常指用户或用户运行的进程,而客体包括文件,目录,socket等系统资源。另外,如果进程作为一种被访问的资源时,它也是一种客体。
- 在MAC机制中,主体和客体都被设置了安全上下文(Security Context),同时系统中还存在一个安全规则库。每次主体访问客体时,系统通过检查安全上下文来确定主体是否有权限访问。
- DAC和MAC并存,在一次访问过程中,系统先进行DAC检查,通过后再进行MAC检查。
2.SEAndroid基本框架
以SELinux文件系统接口为边界,SEAndroid安全机制包含有内核空间和用户空间两部分支持。在内核空间,主要涉及到一个称为SELinux LSM的模块。而在用户空间中,涉及到Security Context、Security Server和SEAndroid Policy等模块。这些内核空间模块和用户空间模块的作用以及交互如下所示:
1. 内核空间的SELinux LSM模块负责内核资源的安全访问控制。
2. 用户空间的SEAndroid Policy描述的是资源安全访问策略。系统在启动的时候,用户空间的Security Server需要将这些安全访问策略加载内核空间的SELinux LSM模块中去。这是通过SELinux文件系统接口实现的。
3. 用户空间的Security Context描述的是资源安全上下文。SEAndroid的安全访问策略就是在资源的安全上下文基础上实现的。
4. 用户空间的Security Server一方面需要到用户空间的Security Context去检索对象的安全上下文,另一方面也需要到内核空间去操作对象的安全上下文。
5. 用户空间的selinux库封装了对SELinux文件系统接口的读写操作。用户空间的Security Server访问内核空间的SELinux LSM模块时,都是间接地通过selinux进行的。这样可以将对SELinux文件系统接口的读写操作封装成更有意义的函数调用。
6. 用户空间的Security Server到用户空间的Security Context去检索对象的安全上下文时,同样也是通过selinux库来进行的。
3. 安全上下文
-
ls -lZ查看文件的安全上下文
-
ps -Z查看进程的安全上下文
安全上下文的格式是:User:Role:Type[Level] (指定用户:指定角色:客体和主体所属的类型【定义安全等级】)
对此我们唯一需要关注的是Type,后面我们会说到。
- type语句
type init ,domain;
type cgroup ,fs_type;
type 类型名称, 属性;
type语句中的属性值都是预定好的,例如domain就代表域,通常主体的type具体domain属性。fs_type表示文件,通常用于客体的类型。
4. 访问规则语句
allow init unlabeled:filesystem mount;
allow init kernel:security load_policy;
以上两条规则的含义:
- 允许init域加载没有安全上下文的文件系统
- 允许init域为kernel装载policy
以上定义访问规则使用的allow语句,语法如下:
allow source_type target_type : class Permission
- Source type 源类型:通常是某种属性为domain的类型,代表主体。
- Target type 目标类型:允许访问的客体的类型(type),目标类型可以指定多个。
- Object class 客体类别:允许访问的客体类别,是对目标类型的限制。
- Permission 许可:指定主体可以对客体进行操作的种类。可参见access_vectors。
5.访问控制规则
- allow : 允许主体对客体进行操作
- neverallow :拒绝主体对客体进行操作
- dontaudit : 表示不记录某条违反规则的决策信息
- auditallow :记录某项决策信息,通常SElinux只记录失败的信息,应用这条规则后会记录成功的决策信息。
6.策略文件位置
Android 6.0 位置在external/sepolicy, 7.0变动到system/sepolicy
6.1角色定义文件roles
角色定义文件用来定义Selinux系统的角色,内容如下:
role r;
role r types domain;
SeAndroid只定义了一种角色r。
6.2 用户定义文件users
user u roles { r } level s0 range s0 - mls_systemhigh;
同样之定义了一种u,这就是我们在安全上下文一节说只要关注type的原因。
6.3 属性定义文件attributes
该文件定义了所以type定义中用到的属性值,如下所示:
attribute dev_type;
attribute domain;
attribute fs_type;
.....
具体释义可以查看源码中的注释
6.4 Class定义文件security_classes
在规则定义语句中会用客体限制类别(Object Class),该文件定义了所有系统中用到的class,如下所示:
class filesystem
class file
class dir
class fd
class lnk_file
class chr_file
class blk_file
class sock_file
class fifo_file
.....
代表着一个对系统资源细化的一个类别。
6.5 操作定义文件access_vectors
allow语句的最后一项为允许的操作,都在该文件中定义,以下举一个对file文件可以进行操作类型的。
common file{
ioctl
read
write
create
getattr
setattr
lock
relabelfrom
relabelto
append
link
rename
execute
swapon
quotaon
mounton
}
......
6.6 宏定义操作文件 global_macros
allow允许的操作可以用宏包裹起来,定义在文件global_macros。
define(
r_dir_perms',
{ open getattr read search ioctl }')
define(w_dir_perms',
{ open search write add_name remove_name }')
define(ra_dir_perms',
{ r_dir_perms add_name write }')
define(rw_dir_perms',
{ r_dir_perms w_dir_perms }')
......
6.7 file_contexts 文件
file_contexts 文件保存的是所有文件的安全上先问定义,部分内容如下:
/dev(/.)? u:object_r:device:s0
/dev/akm8973. u:object_r:sensors_device:s0
/dev/accelerometer u:object_r:sensors_device:s0
/dev/adf[0-9]* u:object_r:graphics_device:s0
/dev/adf-interface[0-9].[0-9] u:object_r:graphics_device:s0
/dev/adf-overlay-engine[0-9].[0-9] u:object_r:graphics_device:s0
/dev/alarm u:object_r:alarm_device:s0
/dev/android_adb.* u:object_r:adb_device:s0
/dev/ashmem u:object_r:ashmem_device:s0
/dev/audio.* u:object_r:audio_device:s0
......
前半部分是文件的路径,后面是安全上下文的定义。
6.8 property_contexts文件
该文件保存了系统中所有Android属性的安全上下文定义:
net. u:object_r:system_prop:s0
dev. u:object_r:system_prop:s0
runtime. u:object_r:system_prop:s0
hw. u:object_r:system_prop:s0
sys. u:object_r:system_prop:s0
sys.powerctl u:object_r:powerctl_prop:s0
sys.usb.ffs. u:object_r:ffs_prop:s0
service. u:object_r:system_prop:s0
wlan. u:object_r:system_prop:s0
......
6.9 .te文件(规则文件)
Sepolicy目录里最多的文件类型,大多以domain的名字命令,包含类型定义和规则定义语句。举一个platform_app.te文件的例子,代表着对platform_app域操作文件规则的定义,如下:
allow platform_app { apk_tmp_file apk_private_tmp_file }:dir rw_dir_perms;
allow platform_app { apk_tmp_file apk_private_tmp_file }:file rw_file_perms;
allow platform_app apk_private_data_file:dir search;
allow platform_app asec_apk_file:dir create_dir_perms;
allow platform_app asec_apk_file:file create_file_perms;
......