前言

之前《Android SELInux相关知识使用》也介绍过如果配置相关缺少的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;

上面语句分别的意思

  1. 允许adbd域(domain), 对安全上下文为anr_data_file的目录(dir)有读目录权限

  2. 允许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

下面针对日志进行拆开介绍。

  1. 操作权限

    { write }

    也就是少了write权限。

  1. 源类型

    scontext=u:r:kernel:s0

    源类型为kernel

  1. 目标类型

    tcontext=u:object_r:block_device:s0

    目标类型为block_device

  1. 访问类型

    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岁以上的除外。

其中:

  1. ~号表示除了某项以外的权限

  2. -号表示去除某项权限

  3. *号表示所有权限

如下例子:

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代替就可以了。

参考文章

  1. Android系统10 RK3399 init进程启动(二十六) Selinux TE文件和语法

  2. Android SELInux相关知识使用

  3. Android 10.0 RK3399 init 进程启动.pdf

 历史上的今天

  1. 大众论坛
  2. 化龙巷
  3. 麻辣社区
  4. 地宝网
  5. 青青岛社区
  6. 落伍者
  7. 驴友论坛
  8. 红豆社区
  9. 华声论坛

相关文章

暂无评论

none
暂无评论...