一. 基本语法
很多te文件集中在\external\sepolicy文件夹下,MTK也有很多自定义的在\device\mediatek\common\sepolicy。它的最基本样式是
allow factory powerctl_prop:property_service set;
allow factory ttyGS_device:chr_file { read write open ioctl};
allow factory ttyMT_device:chr_file { read write open ioctl};
allow factory irtx_device:chr_file { read write ioctl open };
allow factory devpts:chr_file { read write getattr ioctl };
这些allow语句就是最基本的te语句了,相似的te语句的会被归类在一个的te文件下面。如上面的语句是作用于factory,则会在
factory
.te文件里。
\external\sepolicy集中了很多系统定义的te文件
最基本的语法为:
/*
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
我们
从上面拿一个实例下来分析一下:
/*
用中文来表述是:允许factory域里的进程或服务
对类型为ttyMT_device的类别为文件(file)
执行open,read,write,ioctl权限
*/
allow factory ttyMT_device:chr_file { read write open ioctl};
te表达式基本上就是这样:
rule_name:规则名称,除了有allow还有dontaudit,auditallow和neverallow
source_type:源类型,对应一个很重要的概念--------域(domain)
tartget_type:目标的类型,即安全上下文,SELinux一个重要的判断对象
class:类别,目标(客体)是哪种类别,主要有File,Dir,Socket,SEAndroid还有Binder等,在这些基础上又细分出设备字符类型(chr_file),链接文件(lnk_file)等。可以通过ls -l查看文件类型
perm_set:动作集
从上到下按顺序介绍一下:
rule_name:
allow:允许某个进程执行某个动作
auditallow:audit含义就是记录某项操作。默认SELinux只记录那些权限检查失败的操作。 auditallow则使得权限检查成功的操作也被记录。注意,allowaudit只是允许记录,它和赋予权限没关系。赋予权限必须且只能使用allow语句。
dontaudit:对那些权限检查失败的操作不做记录。
neverallow:没有被allow到的动作默认就不允许执行的。neverallow只是显式地写出某个动作不被允许,如果添加了该动作的allow,则会编译错误
source_type:
指定一个“域”(domain),一般用于描述进程,该域内的的进程,受该条TE语句的限制。用type关键字,把一个自定义的域与原有的域相关联
最简单地定义一个新域的方式为:
type shell, domain
上面这句话的意思是,赋予shell给domain属性,同时,shell与属于domain这个集合里。如果有一个allow domain xxxxx 的语句,同样地也给了shell xxxxx的属性
target_type:
指定进程需要操作的客体(文件,文件夹等)类型(安全上下文),同样是用type与一些已有的类型,属性相关联
以上面的
ttyMT_device为例:
//定义一个类型,属于dev_type属性
type ttyMT_device, dev_type;
//属性dev_type在external/sepolicyattributes的定义如下
attribute dev_type;
attribute关键字定义一个属性,type可以与一个或多个属性关联,如
type usb_device, dev_type, mlstrustedobject;
另外,还有一个关键字typeattribute,type有两个作用,定义(声明)并关联某个属性。可以把这两个作用分开,type定义,typeattribute进行关联
#定义httpd_user_content_t,并关联两个属性
type httpd_user_content_t, file_type, httpdcontent;
分成两条语句进行表述:
#定义httpd_user_content_t
type httpd_user_content_t;
#关联属性
typeattribute httpd_user_content_t file_type, httpdcontent;
这些类型(安全上下文)会显示地与一个“文件”想关联,如:
file_contexts里面显式定义了哪些文件属于ttyMT_device类型,即用ls -Z显示出来文件的安全上下文
/dev/ttyMT.* u:object_r:ttyMT_device:s0
虚拟文件系统的标识方式与普通的文件系统文件标识方式不一样,用genfscon来配置。
genfscon的语法是: