1.概述
SElinux是Google在android4.3版本上引入的,只不过是默认关闭的状态,在Android5.0上默认强制打开,它采用了一种新的安全模型——MAC(Mandatory Access Control),强制访问控制。SELinux策略规定,进程想做的事情,都必须在特定文件(xx.te)中赋予权限,凡是没有授权的操作都会被拒绝,xx.te文件规定了进程可以做那些操作,不可以做那些操作。
1.基本定义
2.1 用type关键字定义类型
定义type格式: type 类型名称 [alias 别名集] [,属性集]; []表示可省略;属性集也叫做域。 比如: type aa; #定义aa类型 type aa alias{ bb, cc }; #定义aa类型,并声明别名 type aa, XX; #定义aa类型,并赋予aa给XX域 type aa alias{ bb, cc }, XX; #定义aa类型,声明别名,并赋予aa给XX域
type tcpdump_file, fs_type;
2.2 用typealias声明别名
此关键字单独对某个已存在的type声明别名
比如相同的效果用两种不同的写法如下
#写法一 type aa, XX; typealias aa alisa bb; #给aa声明bb别名 #写法二 type aa alias bb, XX;
2.3 attribute关键字声明属性/域
语法: attribute XX; #声明XX域 比如: attribute domain; #声明domain域
域的定义文件叫做 attributes,一般在/system/sepolicy/目录
system\sepolicy\public\attributes
2.4 在声明类型时也指定对应的域
方法一:使用type关键字,具体使用如前文type处的示例 方法二:使用typeattribute关键字 相同的效果用两种方法实现如下: #方法一 type aa, XX, YY; #声明aa,并赋予XX域和YY域 #方法二 type aa; typeattribute aa XX, YY; #把aa赋予XX域和YY域 #两种方法可以混用 type aa, XX; typeattribute aa, YY; #此时aa同属于两域
3.基本语法
rule_name:规则名,分别有allow,dontaudit,neverallow等 source_type:主要作用是用来填写一个域(domain) target_type:类型 class:类别,主要有File,Dir,Socket,SEAndroid还有Binder等 perm_set:动作集 基本格式规范: rule_name source_type target_type:class perm_set
实例:
allow system_app tcpdump_file:dir { rw_dir_perms };
允许system_app 域的进程或服务对tcpdump_file类型的dir进行rw_dir_perms 的操作
rw_dir_perms 的操作定义在 system\sepolicy\prebuilts\api\26.0\public\global_macros里
3.1 rule_name
1.allow:允许某个进程执行某个动作
2.auditallow:audit含义就是记录某项操作。默认
SELinux只记录那些权限检查失败的操作。 audi
tallow则使得权限检查成功的操作也被记录。注意,
allowaudit只是允许记录,它和赋予权限没关系。
赋予权限必须且只能使用allow语句。
3.dontaudit:对那些权限检查失败的操作不做记录。
4.neverallow:没有被allow到的动作默认就不允许执
行的。neverallow只是显式地写出某个动作不被允
许,如果添加了该动作的allow,则会编译错误
3.2 source_type
指定一个域,用于描述进程,此域内的进程会被该语句的修饰。
3.3 target_type
指定进程需要操作的目标的类型,同样是一个类型或域
3.4 class
目标的具体类别,用class关键提来定义类别,不过系统定义的类别已经很丰富,一般用不到此关键字
# file-related classes
class filesystem
class file #代表普通文件
class dir #代表目录
class fd #代表文件描述符
class lnk_file #代表链接文件
class chr_file #代表字符设备文件
3.5 perm_set
具体的操作,用common关键字定义,定义文件叫做 access_vectors,一般在/system/sepolicy/目录下
比如某项目的system/sepolicy/private/下有的access_vectors文件,打开查看其内容