在Selinux框架中,安全策略都是写在te文件中,以adb.te 文件为例
allow adbd shell_data_file:dir create_dir_perms;
策略的基本格式是:
rule_name source_type target_type :object_class perm_set
rule_name
规则名。常见的规则名有allow,neverallow,dontaudit,auditallow等
rule_name | 说明 |
---|---|
allow | 允许权限操作,必须显示说明,否则代表没有权限 |
neverallow | 这里不能理解为不允许,neverallow是对allow语句进行检查。一旦neverallow了某项权限,如果再写allow该权限的话,编译报错 |
dontaudit | 对权限检查失败的操作不做记录 |
auditallow | 允许记录,重点是记录, 允许权限规则必须使用allow,此处允许记录是指允许对权限检查成功和失败的结果进行记录 |
source_type
源类型,主要作用是用来填写一个域(domain),一般都是一个进程, 一般也叫做scotonext。如上面示例中的adbd就属于domain域
type adbd, domain;
domain的定义在system\sepolicy\public\attributes文件中
attribute dev_type;
# All types used for processes.
attribute domain;
# All types used for filesystems.
# On change, update CHECK_FC_ASSERT_ATTRS
# definition in tools/checkfc.c.
attribute fs_type;
target_type
目标的类型,一般都是客体的上下文标签,当然进程也是可以做为客体,比如一个进程给另外一个进
程发送信号,获取另外一个进程pid 等
上面示例中的shell_data_file 在file.te中定义
type shell_data_file, file_type, data_file_type, core_data_file_type, mlstrustedobject;
而 file_type,data_file_type等也需要在system\sepolicy\public\attributes文件中定义
attribute file_type;
attribute data_file_type;
object_class
类别,目标(客体)是哪种类别,主要有file,dir,socket, process, SEAndroid 还有binder 等,在这些基础上又细分出设备字符类型(chr_file),链接文件(lnk_file)等
object_class 需要在security_classes中定义
# file-related classes
class filesystem
class file
class dir
class fd
class lnk_file
class chr_file
class blk_file
class sock_file
class fifo_file
而class所涉及的具体权限是在access_vectors文件中声明的,比如 filesystem所能申请的权限如下:
class filesystem
{
mount
remount
unmount
getattr
relabelfrom
relabelto
associate
quotamod
quotaget
watch
}
perm_set
权限集合。如:read,write。注意所能填写的是access_vectors文件对每个object_class 定义的权限。
总结
1,策略语句中的每部分都不是随便写的,都需要在相关文件中定义,如下:
2,perm_set集合可以填写什么,需要看access_vectors文件对前面的object_class 的规定。如:object_class 是file_system,则perm_set可以填写mout、remount、unmount等
3,用type来定义一个新的类型