全部博文(478)
分类: Android平台
2017-10-31 13:39:24
1. SELINUX是可以理解为一种android上面的安全机制,是有美国国家安全局和一些公司设计的一个针对linux的安全加强
我们可以通过配置SELINUX的相关policy,来定制自己的手机的一些权限,比如,我们可以完全让root用户没有任何的权限和user一样
2. 在android里面,有两个类型,一种是文件,一种是进程。
针对这两种类型,我们可以先来看看他们的不同。
在android上面,adb shell之后进入手机,ps -Z可以查看当前进程所拥有的selinux的权限。
举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
LABEL USER PID PPID NAME
u:r:init:s0 root 1 0 /init
u:r:kernel:s0 root 2 0 kthreadd
...
u:r:kernel:s0 root 258 2 irq/322-HPH_R O
u:r:logd:s0 logd 259 1 /system/bin/logd
u:r:healthd:s0 root 260 1 /sbin/healthd
u:r:lmkd:s0 root 261 1 /system/bin/lmkd
u:r:servicemanager:s0 system 262 1 /system/bin/servicemanager
u:r:vold:s0 root 263 1 /system/bin/vold
u:r:surfaceflinger:s0 system 264 1 /system/bin/surfaceflinger
u:r:tctd:s0 root 265 1 /system/bin/tctd
u:r:rfs_access:s0 system 268 1 /system/bin/rfs_access
u:r:tee:s0 system 271 1 /system/bin/qseecomd
u:r:kernel:s0 root 280 2 kworker/3:1H
u:r:kernel:s0 root 290 2 kauditd
u:r:rmt_storage:s0 nobody 291 1 /system/bin/rmt_storage
u:r:shell:s0 shell 292 1 /system/bin/sh
u:r:netd:s0 root 295 1 /system/bin/netd
u:r:debuggerd:s0 root 296 1 /system/bin/debuggerd
u:r:tee:s0 system 297 271 /system/bin/qseecomd
|
1
2
3
4
5
6
7
8
|
drwxr-x--x root sdcard_r u:object_r:rootfs:s0 storage
drwx--x--x root root u:object_r:tmpfs:s0 synthesis
dr-xr-xr-x root root u:object_r:sysfs:s0 sys
drwxr-xr-x root root u:object_r:system_file:s0 system
drwxrwxr-x system tctpersist u:object_r:tct_persist_file:s0 tctpersist
lrwxrwxrwx root root u:object_r:rootfs:s0 tombstones -> /data/tombstones
-rw-r--r-- root root u:object_r:rootfs:s0 ueventd.qcom.rc
-rw-r--r-- root root u:object_r:rootfs:s0 ueventd.rc
|
4. selinux的配置规则:
首先要了解sepolicy的结构:
a. App进程 -> mac_permissions.xml
b. App数据文件 -> seapp_contexts
c. 系统文件 -> file_contexts
d. 系统属性 -> property_contexts
在te文件中,我们一般遇到的语法是这样的:
rule_name source_type target_type:class perm_set
解读为: 为source_type设置一个rule_name的规则,规则是对target_type的class 进行 perm_set的操作。
然后是一些特殊的配置文件:
a. external/sepolicy/attributes -> 所有定义的attributes都在这个文件
b. external/sepolicy/access_vectors -> 对应了每一个class可以被允许执行的命令
c. external/sepolicy/roles -> 中只定义了一个role,名字就是r,将r和attribute domain关联起来
d. external/sepolicy/users -> 其实是将user与roles进行了关联,设置了user的安全级别,s0为最低级是默认的级别,mls_systemHigh是最高的级别
e. external/sepolicy/security_classes -> 指的是上文命令中的class,个人认为这个class的内容是指在android运行过程中,程序或者系统可能用到的操作的模块
f. external/sepolicy/te_macros -> 系统定义的宏全在te_macros文件
g. external/sepolicy/***.te -> 一些配置的文件,包含了各种运行的规则
另外,selinux有两种工作模式:
“permissive”:所有操作都被允许(即没有MAC),但是如果有违反权限的话,会记录日志
“enforcing”:所有操作都会进行权限检查
最后,type的命令如下:
type type_id [alias alias_id,] [attribute_id] # 将type_id(别名为alias)关联到attribute. 这样的话,方便用attribute来管理不同的type中包含相同的属性的部分。
class命令的格式为:
class class_name [ inherits common_name ] { permission_name ... }
inherits表示继承了common定义的权限,然后自己额外实现了permission_name的权限
在te文件中常见的四种命名的规则:
allow:赋予某项权限。
allowaudit:audit含义就是记录某项操作。默认情况下是SE只记录那些权限检查失败的操作。allowaudit则使得权限检查成功的操作也被记录。注意,allowaudit只是允许记录,它和赋予权限没关系。赋予权限必须且只能使
用allow语句。
dontaudit:对那些权限检查失败的操作不做记录。
neverallow:前面讲过,用来检查安全策略文件中是否有违反该项规则的allow语句。如例子5所示:
举例:
1
|
type init, domain;
|
1
|
allow init unlabeled:filesystem mount;
|
1
|
allow init fotad:unix_stream_socket { bind create };
|
1
2
|
allow appdomain anr_data_file:dir search;
allow appdomain anr_data_file:file { open append };
|
1
|
neverallow { appdomain -unconfineddomain } kmem_device:chr_file { read write };
|
绝对不允许app(除了有unconfineddomain属性的app)对kmem_device类型的字符设备进行读写的操作
1
|
neverallow { appdomain -unconfineddomain } self:capability2 *;
|
1
|
type httpd_user_content_t, file_type, httpdcontent;
|
1
2
|
type httpd_user_content_t;
typeattribute httpd_user_content_t file_type, httpdcontent;
|
1
|
allow appdomain self:rawip_socket create_socket_perms;
|
1
|
allow {user_t domain} {bin_t file_type sbin_t}:file execute ;
|
1
2
|
allow user_t user_t:process signal;
allow user_t self:process signal;
|
1
|
allow user_t bin_t:file ~{ write setattr ioctl };
|
1
|
type_transition system wifi_data_file:sock_file system_wpa_socket;
|