SELinux权限-总结

一、SELInux简介

1. Linux传统DAC权限检查通过后才会进行MAC(selinux)权限检查。

2. Google对SELinux进行一定修改后形成SEAndroid,它只是SELinux的一个子集,在Android5.0上强制打开。SEAndroid的安全检查几乎覆盖了所有重要系统资源,包括域转换、类型转换、进程、内核、文件、目录、设置、APP、网络、IPC相关操作等。

3. Android系统启动时,init进程负责将安全策略(Security Policy)加载到内核LSM模块中,内核LSM模块HOOK了文件系统的读写操作,当一个进程要去读写一个系统资源时会被HOOK,LSM内核模块会去AVC(Access Vector Cache)缓存向量中查询操作是否合法,如果查到则允许操作,否则就取安全服务(Security Server)中去检查,同时将检查的结果缓存到AVC缓存向量中,若安全服务中也没有查找到就拒绝这个操作。


二、SELinux源码与编译加载

1. SELinux相关源码主要分布在两个地方,external/selinux 和 system/sepolicy。前者是外部SELinux项目,主要用于编译Host命令行工具以编译SELinux策略标签,如 checkpolicy 目录是SELinux的策略编译器;libselinux目录是libselinux库和一些Android专用自定义内容;libsepol 目录下的 chkcon 目录用于确定安全上下文对指定的二进制策略是否有效,libsepol目录用于操控二进制安全策略的SELinux库;secilc 目录下为SELinux的CIL编译器,用于将cil文件转换为二进制文件。后者是核心 Android SELinux 策略配置,包括安全上下文和策略。其中 public ,目录下用于存放平台公共策略;private目录用于存放平台私有策略;vendor目录用于存放供应商策略。后者是SELinux编译的核心,也是日常工作需要频繁修改配置的地方。

2. Android R版本上的SEPolicy编译产物分布在 system、system_ext、product、vendor、odm 分区,都在etc/selinux目录下。

/system/etc/selinux
/system_ext/etc/selinux
/product/etc/selinux
/vendor/etc/selinux
/odm/etc/selinux/

前四个目录中的内容比较相似,主要是 contexts 结尾的安全上下文文件,.xml 签名文件和 .cil编译策略文件。odm分区下都是一些以 precompiled 开头的文件,一些是二进制文件,其余主要是hash校验文件。

3. 以 system 分区为例介绍下编译产物是如何生成的,/system/etc/selinux 下有五类文件,
(1) 安全上下文文件,如prop的就对应 plat_property_contexts,文件的就对应 plat_file_contexts,服务的就对应 plat_service_contexts。安全上下文文件用于为进程、服务、文件、属性打上标签。

plat_file_contexts
plat_property_contexts
plat_service_contexts
plat_hwservice_contexts
plat_keystore2_key_contexts
plat_seapp_contexts

(2) 安全策略文件,是个文本文件,是基于安全上下文定义的各种操作权限的策略文件的汇总。

plat_sepolicy.cil

(3) 兼容性策略文件,在 mapping 目录下,是有 "数字.cil" 命名的文本文件。主要用于兼容老的vendor策略,Google是支持system单独升级的,也就说一个老的系统刷了一个新的system.img之后,它实际加载的那个策略文件是和它的SDK是相关联的,比如R的手机刷了一个S的GSI,使用的还是 30.0.cil 文件和vendor下的cil文件去编译的。

...
30.0.cil
31.0.cil
32.0.cil
33.0.cil

(4) 签名文件,也即xml文件,保存的是apk或三方app用来签名的文件的HEX编码。

plat_mac_permissions.xml

(5) hash映射文件,就是.sha256为后缀的文本文件,里面只保存了一个hash值,是上面安全策略文件 plat_sepolicy.cil 以sha256编码的一个hash值。SEPolicy的启动加载流程中会用到。

plat_sepolicy_and_mapping.sha256

4. 以system分区为例介绍安全上下文 XXX_contexts 文件的编译
在 Android.mk 中定义了一个 PLAT_PRIVATE_POLICY 来指定目录,将此目录下的 XXX_contexts 拼接打包到手机 /system/etc/selinux 下形成 plat_XXX_contexts 文件。

//system/sepolicy/Android.mk
PLAT_PRIVATE_POLICY := $(LOCAL_PATH)/private # system/sepolicy/private

其它分区的编译原理类似,源码目录有产物的对应关系:

PLAT_PRIVATE_POLICY --> system
BOARD_PLAT_PRIVATE_SEPOLICY_DIR --> system_ext
PRODUCT_PRIVATE_POLICY --> product
BOARD_VENDOR_SEPOLICY_DIRS --> vendor

编译宏                                源码目录                                                产物
----------------------------------------------------------------------------------------------------
PLAT_PRIVATE_POLICY                    system/sepolicy/private/XXX_contexts                    /system/etc/selinux/plat_XXX_contexts
----------------------------------------------------------------------------------------------------
BOARD_PLAT_PRIVATE_SEPOLICY_DIR        device/qcom/sepolicy/XXX/private/XXX_context            /system_ext/etc/selinux/system_ext_XXX_contexts
                                    device/<vendor>/system/sepolicy/private/XXX_context    
----------------------------------------------------------------------------------------------------
PRODUCT_PRIVATE_POLICY                device/qcom/sepolicy/product/XXX/private/XXX_context    /product/etc/selinux/product_XXX_contexts
----------------------------------------------------------------------------------------------------
BOARD_VENDOR_SEPOLICY_DIRS            system/sepolicy/vendor/XXX_contexts                        /vendor/etc/selinux/vendor_XXX_contexts
                                    device/qcom/sepolicy/XXX/vendor/XXX_context
                                    device/vendor/<vendor>/system/sepolicy/vendor/XXX_context

注:XXX表示的是文件类型,比如 file、hwservice、property.

5. 安全策略 XXX.cil 的编译
编译流程以system分区为例,主要依赖下面两个宏:

//system/sepolicy/Android.mk
PLAT_PUBLIC_POLICY := $(LOCAL_PATH)/public #对应 system/sepolicy/public 目录
PLAT_PRIVATE_POLICY := $(LOCAL_PATH)/private # 对应 system/sepolicy/private

先将 Object Classes and permissions文件、TE file(.te文件)、RBAC files、User declarations、Security context specifications 文件通过Cat命令的方式将各种源文件连接起来,然后通过M4命令将宏定义展开形成 policy.conf 文件,它也是文本文件,然后通过 checkpolicy 命令检查
是否有 neverallow 冲突,然后经过 secilc 转化为 plat_sepolicy.cil,它是将宏定义展开后的文本描述文件,然后打包到手机 system/etc/selinux 目录下。

其它几个分区的编译同理,区别是搜寻不同目录下的源码文件进行编译,对应关系如下,熟悉源码和产物对应关系有利于调试分析问题,但Android源码是在不停变化的,要根据实际情况使用。

编译宏                        源码目录                                    产物
------------------------------------------------------------------------------
PLAT_PUBLIC_POLICY            system/sepolicy/public                        /system/etc/selinux/plat_sepolicy.cil
PLAT_PRIVATE_POLICY            system/sepolicy/private
------------------------------------------------------------------------------
SYSTEM_EXT_PUBLIC_POLICY    device/qcom/sepolicy/XXX/public                /system_ext/etc/selinux/system_ext_sepolicy.cil
SYSTEM_EXT_PRIVATE_POLICY    device/qcom/sepolicy/XXX/private
                            vendor/<vendor>/system/sepolicy/public
                            vendor/<vendor>/system/sepolicy/private
------------------------------------------------------------------------------
PRODUCT_PUBLIC_POLICY        device/qcom/sepolicy/product/XXX/public        /product/etc/selinux/product_sepolicy.cil
PRODUCT_PRIVATE_POLICY        device/qcom/sepolicy/product/XXX/private
------------------------------------------------------------------------------
PLAT_PUBLIC_POLICY            system/sepolicy/public                        /vendor/etc/selinux/plat_pub_versioned.cil
SYSTEM_EXT_PUBLIC_POLICY    device/qcom/sepolicy/XXX/public                /vendor/etc/selinux/vendor_sepolicy.cil
PRODUCT_PUBLIC_POLICY        device/qcom/sepolicy/product/XXX/public
PLAT_VENDOR_POLICY            system/sepolicy/vendor
BOARD_VENDOR_POLICY_DIRS    device/qcom/sepolicy/XXX/vendor
                            vendor/<vendor>/system/sepolicy/vendor
------------------------------------------------------------------------------

6. odm分区安全策略 precompiled_sepolicy 的编译
主要是2步:
(1) systrem、systrem_ext、product、vendor 几个分区的.cil文件拼接并转换成二进制文件 precompiled_sepolicy,然后保存到 odm 分区。
(2) systrem、systrem_ext、product 几个分区下的.sha256文件记录了.cil文件的hash值,同步会在odm保存一份,直接拷贝然后重命名的。

# cat /system/etc/selinux/plat_sepolicy_and_mapping.sha256
978d7869cd452b96a689589954fa3414ca51ec4586525a76d7b412347142d794
# cat /odm/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256
978d7869cd452b96a689589954fa3414ca51ec4586525a76d7b412347142d794

precompiled_sepolicy 文件是所有安全策略的汇总,开机会加载到LSM中。

7. SELinux启动流程
开机init进程负责SELinux策略文件的加载,
(1) 初始化时根据是否 Trible device 加载不同的sepolicy文件,Android N后一般都是 Trible 的了。
(2) 非 Trible 设备加载根目录下的sepolicy文件,比如进recovery模式时的加载。
(3) Trible 设备判断 system、system_ext、product 里的.sha256映射文件是否和odm下备份的一致,若一致直接加载odm下的 precompiled_sepolicy 到内核LSM中,若.sha256不一致,则会在手机中编译生成一个sepolicy后加载,会影响开机启动速度。

8. SELinux加载改后,如何干预进程访问文件
(1) 用户空间进程通过系统调用访问内核空间文件inode.
(2) 首先做一般检查,如文件是否存在,参数是否正确等。
(3) DAC检查,即基于Linux的 UID/GID的安全检查访问权限。
(4) MAC检查,即基于SELinux的安全上下文和安全策略的安全检查。

三、SELinux语法

1. 安全上下文
SELinux中,进程和文件都会被赋予一个安全属性,官方说法为Security Context,也即安全上下文。安全上下文定于语法:user:role:type:sensitivity[:category] 

字段                        含义
----------------------------------
user                        用户,Android中只定义了一个SELinux用户和角色,其值为"u".
role                        角色,Android中主体的角色为"r",客体的角色为"object_r"
type                        类型,将主体和客体划分为不同的组,用于在安全策略中授予权限的标识。
sensitivity[:category]        安全等级,包括敏感度和类别,用于军用和教育行业的多级安全策略(MLS)。

2. 主体和客体
主体(subject):指进程,是活的,是安全行为的发起者,使用 "ps -Z" 命令查看进程的安全上下文。
客体(object),也可称对象,所有可读取的对象,是死的,比如文件、目录、属性、套接字等,使用 "ls -Z" 命令查看文件的安全上下文。

3. 权限命令
allow:表示允许主体对客体执行允许的操作
neverallow:表示不允许主体对客体执行指定的操作。当遇到了 neverallow 冲突时,可改主体或客体来绕过。
dontaudit : 对那些权限检查失败的操作不做记录
auditallow: audit含义就是记录某项操作。默认SELinux只记录那些权限检查失败的操作。 auditallow则使得权限检查成功的操作也被记录。

 

4. 常用通配符
"-"表示去除某项内容
"*"表示所有内容
"~"表示取反,除了~之外的
例如:

neverallow appdomain fs_type:filesystem ~getattr; #表示不允许 appdomain 域的进程对类型为 fs_type 的文件系统除了 getattr 之外的操作。
neverallow {appdomain -init -gsid } gsi_data_file:dir*; #表示不允许 appdomain 域中除了init、gsid外的,对类型为 gsi_data_file 的目录做任何操作。
neverallow {domain -vold} vold_data_file:dir *; #表示除了 vold 外的进程都不允许操作 vold_data_file 类型的目录

5. 安全策略语法
SELinux安全策略用于描述、授予主体对客体的一些操作行为,是以.te为后缀的文本文件。定义语法:rule_name source_type target_type:class perm_set; 

字段            含义
---------------------------------------
rule_name        allow, dontaudit, auditallow, neverallow 等关键字
source_type        源类型,主体的类型,一个进程或一组进程的标签
target_type        目标类型,一个客体或一组客体的类型标签
class            客体类别,表示要操作的客体的类型,文件,套接字等
perm_set        许可,要执行的操作,读,写等

(1) rule_name
其中 rule_name 下的 allow 表示允许某个进程执行某个操作, dontaudit 表示对那些权限检查失败的操作不做记录, auditallow 表示即使权限检查成功的操作也被记录,它只是记录,和授予权限无关,要授予权限必须使用 allow, neverallow 表示没有被 allow 的动作就不被允许执行,neverallow 只是显示地指出某个操作不被允许,强行添加 allow 会导致编译出错。

rule_name 字段中最常用的是allow,表示授予权限,当授予多条同类型权限时可用 {} 括起来
例1:allow system_server rootfs:dir{open read}
含义:表示允许 system_server 域中的进程 open 和 read 类型为 rootfs 的目录。

 

(2) class
查看客体类别(class)的方法:system/sepolicy/private/security_classes 中定义了Android中所有的客体类别。

class filesystem
class file
class anon_inode
class dir
...

(3) perm_set
查看某种类别的客体的操作(perm_set)的方法:system/sepolicy/private/access_vectors 中定义了Android中所有的操作类别。

common file
{
    ioctl
    read
    ...
}
...
common ipc
{
    create
    destroy
    ...
}

6. 安全策略语句支持通配符,常用的有如下几个:
"-" 表示去除某项内容
"*" 表示所有内容
"~" 表示取反,除了~之外的

例2:neverallow appdomain fs_type:filesystem ~getattr;
含义:表示不允许 appdomain 域中的进程对类型为 fs_type 文件系统做除了 getattr 之外的操作。

例3:neverallow {domain -init -gsid} gsi_data_file:dir *;
含义:表示不允许 domain 域中除了 init、gsid 域外,对类型为 gsi_data_file 的目录做任何操作。

7. 宏定义
安全策略语句支持宏定义,即定义的一种类似函数的模板以方便编写策略,编译时M4工具会自动将其展开。
例:r_dir_file(ueventd, sysfs_type)
r_dir_file 是个宏,定义在 te_macros 文件中,如下,其中 $1, $2 表示传入的参数

# system/sepolicy/public/te_macros
# r_dir_file(domain, type)
# Allow the specified domain to read directories, files and symbolic links of the specified type.
define(`r_dir_file', `
allow $1 $2:dir r_dir_perms;
allow $1 $2:{ file lnk_file } r_file_perms;
')

# 策略展开后为:
allow ueventd sysfs_type:dir r_dir_perms;
allow ueventd sysfs_type:{ file lnk_file } r_file_perms;

而 r_dir_perms 和 r_file_perms 又属于 perm_set 宏,定义在 global_macros 中,如下:

# system/sepolicy/public/global_macros
define(`r_dir_perms', `{ open getattr read search ioctl lock watch watch_reads }')
define(`r_file_perms', `{ getattr open read ioctl lock map watch watch_reads }')

# 策略展开后为:
allow ueventd sysfs_type:dir { open getattr read search ioctl lock watch watch_reads };
allow ueventd sysfs_type:{ file lnk_file } { getattr open read ioctl lock map watch watch_reads };

8. 类型转换

父进程创建子进程和目录下创建新文件时会涉及到类型转换

(1) 进程的类型转换指某个进程从一个域切换到另一个于域运行。子进程默认和父进程保持一致。Android提供了进程转换的宏 domain_auto_trans,下面语句表示 init 进程执行 charger_exec 类型文件
创建进程类型为 charger:

domain_auto_trans(init, charger_exec, charger);

注意,init启动的服务的安全上下文不能是init, 必须重新定义,否则无法运行,会提示:"Service XXX doesn't have a SELInux domain defined!"

(2) 文件的类型转换是指新创建的文件的类型转换为指定类型。默认和其父目录类型保持一致。Android提供的文件转换宏为 file_type_auto_trans, 如下语句表示 cnd 域的进程在 socket_devices
类型的目录下创建设备文件,新文件类型变成 cnd_socket.

file_type_auto_trans(cnd, socket_device, cnd_socket);

9. MLS 多级安全

MLS 多级安全,可以对文件和进程进行分级管控。SELinux的MLS包括敏感度和类别(sensitivity[:category]),SEAndroid里,只定义了 s0 一个敏感度和 0--1023 个类别。

u:object_r:privapp_data_file:s0:c512,c768        3452 2022-02-02 11:30 com.android.bootreg

Android默认启用了MLS,当主体和客体安全等级不同时,SEAndroid会给予 mlsconstrain 对class进行额外检查。如下 mls 文件中定义了主体对dir类型的客体执行指定操作时需要满足一些额外条件:

# system/sepolicy/prebuilts/api/26.0/private/mls
# Only constrain open, not read/write.
# Also constrain other forms of manipulation, e.g. chmod/chown, unlink, rename, etc.
# Subject must be equivalent to object unless the subject is trusted.
mlsconstrain dir { open search setattr rename add_name remove_name reparent rmdir } (t2 != app_data_file or l1 eq l2 or t1 == mlstrustedsubject);
mlsconstrain { file lnk_file sock_file } { open setattr unlink link rename } (t2 != app_data_file or l1 eq l2 or t1 == mlstrustedsubject);

注:t1,t2 分别表示主体和客体的类型,l1,l2分别表示主体和客体MSL level.

# 一个相关报错的例子:
avc:denied{add_name} for name="Recordings" secontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=0
# 上述报错添加:
allow platform_app system_data_file:dir add_name
# 没有生效,这就是 MLS 拦截了。根据下面 mls 的 mlsconstrain 定义可知,对 dir 的 add_name 还需要满足额外的检查,最简单的方法是让 t1==mlstrustedsubject,即添加:
type platform_app, domain, mlstrustedsubject;

# Write operations: Subject must be equivalent to the object unless the subject or the object is trusted
mlsconstrain dir {write setattr rename add_name remove_name reparent rmdir}
    (t2 == app_data_file or t2 == privapp_data_file or l1 eq l2 or t1 == mlstrustedsubject or t2 == mlstrustedsubject or l1 dom l2 or l1 domby l2);

四、SELinux配置

1. SELinux常见的配置类型有 文件、App、bin、服务、属性。更多类型的配置可参考Google文档:https://source.android.com/security/selinux/images/SELinux_Treble.pdf 是个pdf文件,直接下载。

2. 新增文件类型配置

(1) 普通文件

# android/vendor/<vendor>/system/sepolicy/private/file_contexts  # 普通文件在 file_contexts 里配置
/data/system/font(/.*)? u:object_r:oem_font_data_file:s0 #将文件的完整路径和类型名关联上

# android/vendor/<vendor>/system/sepolicy/private/file.te # 在te文件中将 oem_font_data_file 类型的文件关联到指定的组里面,它就有对应组里面的权限了
type oem_font_data_file, file_type, data_file_type, core_data_file_type, mlstrustedsubject;

(2) 伪文件(sys、proc)

# android/vendor/<vendor>/system/sepolicy/vendor/genfs_contexts # 伪文件在这里面配置
genfscon sysfs /kernel/dispalay/ffl_set u:object_r:sysfs_graphics_ffl:s0

# android/vendor/<vendor>/system/sepolicy/vendor/file.te # 也是在file.te中将其与所属的类型进行关联
type sysfs_graphics_ffl, sysfs_type, fs_type;

配置好后可以使用 ls -Z 可以查看配置是否生效。

3. 新增app类型

# android/vendor/<vendor>/system/sepolicy/private/keys.conf # 在这里指定app签名文件的完整路径
[@DATA_APP_STD] # 这里定义一个名字
ALL: vendor/<vendor>/build/make/security/data_app_std.x509.pem

# android/vendor/<vendor>/system/sepolicy/private/mac_permissions.xml # 在此文件中将签名文件与类型名进行关联
<signer signature="@DATA_APP_STD">
   <seinfo value="data_app_std"/>
</signer>

# android/vendor/<vendor>/system/sepolicy/private/seapp_contexts # 根据app签名和包名定义域的名字
user=app seinfo=data_app_std name=com.os.backuprestore domain=backuprestore_app type=app_data_file

通过上面定义,就表示采用 data_app_std.x509.pem 签名,且包名为 com.os.backuprestore 的应用的domain是 backuprestore_app,它生成的数据文件类型是 app_data_file。

4. 新增bin程序类型

# android/vendor/<vendor>/system/sepolicy/vendor/file_contexts
/odm/bin/o_sensor_fb u:object_r:o_sensor_fb_exec:s0 # 可关联可执行文件和类型名,类型名需要以_exec为后缀

# android/vendor/<vendor>/system/sepolicy/vendor/o_sensor_fb.te # 文件名需要是"可执行文件名.te",在此文件中定义可执行文件运行后域的名字
type o_sensor_fb, domain;
type o_sensor_fb_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(o_sensor_fb) #若是由init启动,可直接使用这个宏,表示init进程拉起它后进程名叫做 o_sensor_fb 域.

程序运行后执行 ps -AZ | grep o_sensor_fb 确认配置是否生效。

5. ServiceManager新增服务类型

# android/vendor/<vendor>/system/sepolicy/vendor/file_contexts # 关联服务和服务域名
o_core_app_service u:object_r:core_app_service:s0

# android/vendor/<vendor>/system/sepolicy/private/service.te # 将服务域名绑定到特定组里面去
type core_app_service, app_api_service, service_manager_type;

# android/vendor/<vendor>/system/sepolicy/private/system_app.te # 针对服务添加一些权限
allow system_app core_app_service:service_manager{add find};

中间的这行,type 类型可以查 attributes 里面的定义:
app_api_service: 除了 isolated app,所有应用都可以使用。
service_manager_type:servicemanager 管理的所有 service。

6. 新增属性类型

# android/vendor/<vendor>/system/sepolicy/vendor/property_contexts # 将属性名字和属性域名关联起来
ro.vendor.o.version_suffix u:object_r:vendor_o_prop:s0

# android/vendor/<vendor>/system/sepolicy/vendor/property.te # 将属性和相应的组别进行关联
vendor_public_prop(vendor_o_prop);

注:vendor_public_prop 宏表示vendor相关属性。getprop -Z ro.vendor.o.version_suffix 可以确认配置是否生效。


五、SElinux常用调试方法

1. 确认是不是由于SELinux问题导致
关闭SELinux看问题是否还复现,机器启动后可通过 setenforce 0 来关闭。开机阶段可通过修改kernel cmdline: ndroidboost.selinux=permissive 或 修改 selinux.cpp 中的 IsEnforcing 函数返回flase 来关闭selinux.

2. 根据deny log添加所需权限
在kernel log、event log 或 main log 中,检索关键字:

[25689.386737] type=1400 audit(1660918498.894:8836): avc: denied { read } for comm="unknown" 
    name="tcp" dev="proc" ino=4026532037 scontext=u:r:untrusted_app_30:s0:c31,c257,c512,c768 
    tcontext=u:object_r:proc_net_tcp_udp:s0 tclass=file permissive=0 app=com.xunmeng.pinduoduo

然后根据log可按模板 allow scontext tcontext:tclass{xxx} 添加:allow untrusted_app_30 proc_net_tcp_udp:file{read},sepolicy-inject工具可以在手机端动态添加权限,可实现一次调试即可添加所有需要的权限。

3. 编译修改权限文件在手机中快速验证

SELinux权限生成后,如何添加进源码中。有2个原则:
(1) vendor客制化的修改需要放在 vendor/<vendor>/system/sepolicy 目录。禁止修改 Google 原生策略,因为修改原生策略后会影响后后续升级的兼容性,Google 的一些 neverallow 策略修改了会导致CTS测试fail。
(2) 权限添加到以主体命名的TE文件中,文件不存在可新建。比如规则 "allow vendor_dpmd vendor_diag)device:chr_file{read write};" 需要添加到 vendor_dpmd.te 中。注意,TE文件需要以空行结尾,否则会导致编译报错,新增TE文件时要注意,而且报错比较慢辨别,一个文件中有问题,报错的是拼接的下一个文件有问题。

从Android O开始,Sepolicy 仓库分为 private、public、vendor 三个目录,主要是为了满足Google Treple涉及思想。

vendor的sepolicy也区分为下面三个不同目录:
(1) vendor/<oplus>/system/sepolicy/private
a. 打包到 system_ext.img,对应system相关功能。
b. 定义的type、domain不允许vendor引用。
(2) vendor/<oplus>/system/sepolicy/public
a. 打包到 system_ext.img,同时建立mapping,也会参与vendor分区的编译。
b. 定义的type、domain允许vendor引用。
(3) vendor/<oplus>/system/sepolicy/vendor
a. 打包到 vendor.img
b. 定义的type、domain仅vendor引用,一般OEM厂商客制化的修改都是放在这里面的。

4. 查询当前SELinux开关状态
adb shell getenforce
如果返回Enforcing(强制模式),表示SELinux正在运行中,SELinux规则会进行拦截。
如果返回Permissive(宽容模式),表示SELinux运作中,只有警告信息,不会实际进行拦截。
如果返回Disabled,表示SELinux禁用,没有运行。
adb shell setenforce 1 (可以修改回 Enforcing 状态)

5. 安全上下文类型查询方法
进程的安全上下文类型: ps -AZ | grep process (process可以是进程号 或者 进程名)
文件的安全上下文类型: ls -lZ file (file换成实际的文件夹或者文件)
属性的安全上下文类型: getprop -Z property (property换成实际使用的属性)

注:te文件要以空行结尾,否则会导致编译报错,新增te文件时要注意。Android T 限制了te文件的格式,必须为ASCII格式。


6. selinux每次报错只报部分权限缺失,可能需要多次添加权限验证,直到问题解决。

原文地址:https://www.cnblogs.com/hellokitty2/p/16617219.html

posted @ 2023-11-07 19:12  zxiaocheng  阅读(2048)  评论(0编辑  收藏  举报