前言
之前《》也介绍过如果配置相关缺少的SELInux权限,但是之前也是简单介绍或根据日志打印进行介绍的。
本文主要摘抄,核心内容根据参考文1。
正文
语法
Te文件中一般经常出现如下语句: 在system/sepolicy/private/adbd.te文件中
# adb pull /data/anr/traces.txt allow adbd anr_data_file:dir r_dir_perms; allow adbd anr_data_file:file r_file_perms;
上面语句分别的意思
允许adbd域(domain), 对安全上下文为anr_data_file的目录(dir)有读目录权限
允许adbd域(domain), 对安全上下文为anr_data_file的文件(file)有读文件权限
格式
rule_name source_type target_type :object_class perm_set
也就主要涉及rule_name,source_type,target_type,object_class和perm_set,下面分别介绍一下。
rule_name
规则名。
rule_name 一般有以下四种:
rule_name | 详细说明 |
---|---|
allow | 允许权限操作,必须显示说明 |
allowaudit | 允许记录,重点是记录, 允许权限规则必须使用allow,此处允许记录是指允许对权限检查成功和失败的结果进行记录 |
dontaudit | 对权限检查失败的操作不做记录 |
neverallow | 此处不能简单理解为不允许,没有显示注明allow的策略默认就是不允许, 此处的意思是在生成安全策略文件时检查是否违背neverallow的要求。如:neverallow logd dev_type:blk_file { read write }; 此处意思是在其他策略文件中就不要出现allow logd dev_type:blk_file { read write }的语句,否则编译会报错。类似于在考试出题时,上级要求作文中不允许写议论文, 而在下级自主出题时,就出现了允许写议论文的要求, 这样这个”允许”就明显不合规。 |
source_type
源类型。
主要作用是用来填写一个域(domain),一般都是一个进程,,也叫做scotonext。
target_type
目标的类型。
一般都是客体的上下文标签,当然进程也是可以做为客体,比如一个进程给另外一个进程发送信号,获取另外一个进程pid等,
object_class
类别,目标(客体)是哪种类别。
主要有file,dir,socket,process,SEAndroid还有binder等,在这些基础上又细分出设备字符类型(chr_file),链接文件(lnk_file)等。
perm_set
Perm set表示操作权限集合。
在system/sepolicy/public/global_macros会定义权限集宏定义, 如例子:
define(`x_file_perms', `{ getattr execute execute_no_trans map }') define(`r_file_perms', `{ getattr open read ioctl lock map }') define(`w_file_perms', `{ open append write lock map }') define(`rx_file_perms', `{ r_file_perms x_file_perms }') define(`ra_file_perms', `{ r_file_perms append }') define(`rw_file_perms', `{ r_file_perms w_file_perms }') define(`rwx_file_perms', `{ rw_file_perms x_file_perms }') define(`create_file_perms', `{ create rename setattr unlink rw_file_perms }')
Demo
下面是日志中提示缺少的权限
avc: denied { write } for path="/dev/block/vold/93:96" dev="tmpfs" ino=/1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0 tclass=blk_file permissive=0
下面针对日志进行拆开介绍。
操作权限
{ write }
也就是少了write权限。
源类型
scontext=u:r:kernel:s0
源类型为kernel
目标类型
tcontext=u:object_r:block_device:s0
目标类型为block_device
访问类型
tclass=blk_file
访问类型为blk_file
因此在kernel.te文件新增如下规则
allow kernel block_device:blk_file write;
写操作一般还伴随open、append等,所以一般使用w_file_perms宏替代单一的write,可改为如下:
allow kernel block_device:blk_file w_file_perms;
Demo
单个权限型
allow adbd tmpfs:dir search;
允许adbd域对虚拟化文件系统tmfs中的目录进行搜索。
集合权限型
allow adbd shell:unix_stream_socket { read write };
允许adbd域对shell的流式套接字进行读和写。
allow hal_bluetooth { uhid_device hci_attach_dev }:chr_file rw_file_perms;
允许hal_bluetooth域对有上下文uhid_device,hci_attach_dev的字符设备,有读写文件权限。
特殊限定权限型
allow init { file_type -system_file }:dir relabelto;
允许init域的进程对file_type类型中除了system_file类型外的目录执行relabelto操作;
file_type类型是一个集合,当对这个集合进行特定权限放开后,可能这个集合中某个特定类型的权限你并不想放开, 那么可以加上-进行进一步排除, 可以证明理解: 允许美女参加选美, 但是40岁以上的除外。
其中:
~号表示除了某项以外的权限
-号表示去除某项权限
*号表示所有权限
如下例子:
allow { domain -coredomain # access is explicitly granted to individual coredomains } same_process_hal_file:file { execute read open getattr map };
表示允许domain( 需排除coredomain) ,对same_process_hal_file类型的普通文件(file), 拥有 execute read open getattr map权限。
self关键词
allow system_server self:netlink_selinux_socket *;
允许system_server域的进程能够对system_server类型的netlink_selinux_socket套接字进行所有操作。
self表示targettype与source type相同,这时就不用再重复写一遍sourcetype了,用self代替就可以了。
参考文章
《》
《》
《