天天看點

Android系統10 RK3399 init程序啟動(二十六) Selinux TE檔案和文法

說明

系統:Android10.0

裝置: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

te檔案:Type Enforce檔案, 該檔案主要完成政策的制定, 檔案中有非常多的語句, 我們需要基本掌握和了解其中的文法和語義,這樣才能有利于我們進行開發。

一, 框圖

Android系統10 RK3399 init程式啟動(二十六) Selinux TE檔案和文法

上圖是整個框圖, 具體意思,請參考視訊教程和之前的文章, 上面打星的地方就是本章節重點介紹的。

二,初識基本文法

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}

基本文法對應的檔案結構如下:

Android系統10 RK3399 init程式啟動(二十六) Selinux TE檔案和文法

三 ,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套接字進行所有操作

繼續閱讀