自动化零件商城(www.rssme.com)专业PLC,变频器,直线模组,触摸屏,控制器,传感器等自动化商品网上购物商城,为广大中小工业企业提供优质、低价格和种类齐全的自动化零件。
文章目录

前言

之前《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

相关文章

自动化零件商城(www.rssme.com)专业PLC,变频器,直线模组,触摸屏,控制器,传感器等自动化商品网上购物商城,为广大中小工业企业提供优质、低价格和种类齐全的自动化零件。

暂无评论

none
暂无评论...