配套系列教学视频链接:
? ? ??安卓系列教程之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代替就可以了 |
?
|