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

配套系列教学视频链接:

      安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

te文件:Type Enforce文件, 该文件主要完成策略的制定, 文件中有非常多的语句, 我们需要基本掌握和理解其中的语法和语义,这样才能有利于我们进行开发。


一, 框图

上图是整个框图, 具体意思,请参考视频教程和之前的文章, 上面打星的地方就是本章节重点介绍的。

二,初识基本语法

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)有读文件权限

完整的allow相关的语句格式为:

rule_name source_type target_type :object_class perm_set

描述:

rule_name:规则名,分别有allow,dontaudit,auditallow,neverallow等

source_type:源类型,主要作用是用来填写一个域(domain),一般都是一个进程, 也叫做scotonext

target_type:目标的类型,一般都是客体的上下文标签,当然进程也是可以做为客体,比如一个进程给另外一个进程发送信号,获取另外一个进程pid等,

object_class:类别,目标(客体)是哪种类别,主要有file,dir,socket, process, SEAndroid还有binder等,在这些基础上又细分出设备字符类型(chr_file),链接文件(lnk_file)等。

perm_set:权限集合, 如read, write等。

更加复杂的格式为:

rule_name {source_type1 source_type2 ...}  { target_type1 target_type2 ... } :object_class  {perm_set}

基本语法对应的文件结构如下:

三 ​​​​​​,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 }的语句,否则编译会报错。

类似于在考试出题时,上级要求作文中不允许写议论文, 而在下级自主出题时,就出现了允许写议论文的要求, 这样这个”允许”就明显不合规。

 四,object_class

object_class类别作用是用于描述目标(客体)的类别,如dir, file类别, 不同的文件都可以设置相同的上下文,加上object_class类别之后,可以更精准的去描述目标(客体), 比如/data/test/(目录)  和/data/testfile(普通文件),  都是可以设置安全上下文为u:object_r:test:s0, 假如allow语句只想给定访问testfile普通文件时权限,而不想放开目录的权限, 就可以在在allow语句中将object_class设置进来, 如:

allow myprocess test:file read;

一般object_class都需要在system/sepolicy/private/security_classes中声明, 而对应classs涉及到的具体权限项目是在system/sepolicy/private/access_vectors中文件中声明的,如:

# 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

# network-related classes

class socket

class tcp_socket

class udp_socket

class rawip_socket

class node

class netif

....

class binder

....

# Property service

class property_service          # userspace

# Service manager

class service_manager           # userspace

以上文件我们只需要基本了解即可, 基本不会改。

Object_class默认会有对应的权限,在system/sepolicy/private/access_vectors文件会声明,其格式基本有以下几种:

common common_name { permission_name ... }

通用的权限集合,可以被另外一个格式class继承,例子:

common file

{

    ioctl

    read

    write

create

....

}

class class_name [ inherits common_name ] { permission_name ... }

Class不能被继承,access_vectors声明的class样例如下所示:

class filesystem

{

    mount

    remount

    unmount

    getattr

    ...

}

class dir

inherits file

{

    add_name

    remove_name

    reparent

    search

    rmdir

    open

    ...

五,perm_set

Perm set表示操作权限集合,system/sepolicy/public/global_macros会定义权限集宏定义, 如例子:

#####################################

# Common groupings of permissions.

#

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 }')

当然在perm_set 这个语法位置上也是可以使用上一节中的access_vectors文件中出现的权限字符串。

 六,例子

单个权限型

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

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旗浩QH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值