selinux权限的原理之前有看过,一知半解,基本也没有修改过相关代码, 这两天一次需求开发中临时需要添加一个selinux权限,大概咨询了下同事,自己搞了一下,居然一次成功了,记录下。
需求开发需要在system_server进程中调用SystemProperties.set("vendor.mtk.xxx")设置一个vendor.mtk开头的属性,不适配selinux权限的话会报错导致开不了机。
添加selinux权限的步骤:
1. 查看设备根目录的vendor_property_contexts文件
busybox vi vendor_property_contexts
可以看到vendor.mtk开头的属性的selinux权限是u:object_r:vendor_mtk_default_prop:s0
下面就需要为system_server进程添加这个权限。
2. 查找system_server进程的selinux权限定义文件:system_server.te
Android原生的te文件放在源码目录的system/sepolicy目录下,一般手机或电视厂商在定制时会将自己的te文件都单独解耦出来,放在vendor目录,AndroidP上编译还是统一在system/sepolicy模块中编译,编译生成sepolicy文件,替换到设备根目录即可生效。
vendor自有的selinux权限定义文件具体放在哪个目录,在system/sepolicy的Android.mk中有定义,如
......
# BOARD_SEPOLICY_DIRS was used for vendor/odm sepolicy customization before.
# It has been replaced by BOARD_VENDOR_SEPOLICY_DIRS (mandatory) and
# BOARD_ODM_SEPOLICY_DIRS (optional). BOARD_SEPOLICY_DIRS is still allowed for
# backward compatibility, which will be merged into BOARD_VENDOR_SEPOLICY_DIRS.
ifdef BOARD_SEPOLICY_DIRS
BOARD_VENDOR_SEPOLICY_DIRS += $(BOARD_SEPOLICY_DIRS)
endif
ifdef BOARD_ODM_SEPOLICY_DIRS
ifneq ($(PRODUCT_SEPOLICY_SPLIT),true)
$(error PRODUCT_SEPOLICY_SPLIT needs to be true when using BOARD_ODM_SEPOLICY_DIRS)
endif
endif
......
这里面的BOARD_SEPOLICY_DIRS和BOARD_ODM_SEPOLICY_DIRS就是分别为手机/电视厂商和odm预留的selinux权限定义目录,这2个宏的具体定义在厂商自定义的编译脚本中,是厂商定制的,找后这个宏定义后,一般会在其定义的目录中找到system_server.te文件。
3. 在找到的system_server.te文件中添加需要的权限即可,如下。
# ifdef VENDOR_EDIT
allow system_server vendor_mtk_default_prop:property_service set;
# endif /* VENDOR_EDIT */
缺少selinux权限时,一般会在logcat或kernel log中打印如下警告信息:
avc: denied { read } for name=“u:object_r:hwservicemanager_prop:s0” dev=“tmpfs” ino=20968 scontext=u:r:hal_secure_element_unisoc:s0 tcontext=u:object_r:hwservicemanager_prop:s0 tclass=file permissive=0
这个log说明了如下信息:
缺少什么权限: { read }权限,
谁缺少权限: scontext=u:r:hal_secure_element_unisoc:s0
对哪个文件缺少权限:tcontext=u:object_r:hwservicemanager_prop
什么类型的文件: tclass=file
完整的意思: hal_secure_element_unisoc进程对hwservicemanager_prop类型的file缺少read 权限。
解决办法是找到scontext权限定义的te文件,加入:
allow hal_secure_element_unisoc hwservicemanager_prop:file read;
sepolicy 配置和快速验证_Pogogo1的博客-CSDN博客_system_file_type 一文中有修改te文件的话可以通过编译sepolicy并替换cil文件可以快速验证,但本地在一个androidR TV项目上验证并不生效,还是要全编。
make selinux_policy -j8 // vendor 和system 都修改了
make selinux_policy_nonsystem -j8 // 只修改 vendor相关的sepolicy
编译成功后,只需要替换如下文件 vendor_sepolicy.cil,即可快速验证
/vendor/etc/selinux/vendor_sepolicy.cil