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