說明
系統: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套接字進行所有操作 |