IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android系统10 RK3399 init进程启动(二十六) te文件和语法 -> 正文阅读

[移动开发]Android系统10 RK3399 init进程启动(二十六) 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代替就可以了

?

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:28:44  更:2022-06-06 17:29:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:21:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码