Android SELinux默认开启时,若进程想访问并操作data分区的一个目录,通常需要解决部分进程访问data目录而造成的功能兼容性问题,如访问权限扩大或违反Google neverallow规则导致的认证失败。
实际案例
当进程没有添加SELinux的rule规则下去操作data目录,通过logcat可以看到会有许多的avc denied的信息,说明此操作被SELinux拦截处理了。可以执行setenforce 0临时关闭selinux防火墙,方便核对并添加sepolicy允许规则。
例如跑CTS测试时报了如下错误,必须想办法绕过它。
1、新建data子目录
在/system/core/rootdir/init.rc中执行并设置目录文件的访问权限。
on post-fs-data
mkdir /data/hht 0770 system system
注意:在vendor的rc文件里创建data子目录是不会成功的。将rc文件push到/system/etc/init/hw可快速验证。
adb push xxx\system\core\rootdir\init.rc /system/etc/init/hw
2、声明文件类型的变量
在/device/rockchip/common/sepolicy/vendor/file.te中添加如下定义:
type hht_data_file, file_type, data_file_type, core_data_file_type;
3、为文件分配安全标签
在/device/rockchip/common/sepolicy/vendor/file_contexts中添加如下规则:
/data/hht(/.*)? u:object_r:hht_data_file:s0
4、赋予控制访问文件节点的权限
在/device/rockchip/common/sepolicy/vendor/system_app.te中为system_app进程添加allow权限。
例如出现如下avc日志:
type=1400 audit(0.0:150): avc: denied { getattr } for path="/data/hht" dev="dm-37" ino=18203 scontext=u:r:system_app:s0 tcontext=u:object_r:hht_data_file:s0 tclass=dir permissive=0
type=1400 audit(0.0:151): avc: denied { search } for name="hht" dev="dm-37" ino=18203 scontext=u:r:system_app:s0 tcontext=u:object_r:hht_data_file:s0 tclass=dir permissive=0
宗旨是:缺啥补啥,并遵循如下规则:
{ getattr } 缺少的权限
scontext=u:r:system_app:s0 谁缺此权限
tcontext=u:object_r:hht_data_file:s0 对哪个类型文件缺少权限
tclass=dir 什么类型文件
若avc: denied过多,考虑使用audit2allow工具,可以获取日志中的所有拒绝事件并将其转换成相应的SELinux政策声明。
如下添加到对应的*.te文件中即可:
#============= 源类型 ==============
allow 源类型 目标类型:访问类型 操作权限;
完整的意思是:“源类型"进程对"目标类型"的"访问类型"缺少"操作权限”
5、编译验证:mmm /system/sepolicy或make selinux_sepolicy
push如下selinux产物验证:
adb push ***\out\target\product\rk3588_t\odm\etc\selinux /odm/etc
adb push ***\out\target\product\rk3588_t\product\etc\selinux /product/etc
adb push ***\out\target\product\rk3588_t\system\etc\selinux /system/etc
adb push ***\out\target\product\rk3588_t\system_ext\etc\selinux /system_ext/etc
adb push ***\out\target\product\rk3588_t\vendor\etc\selinux /vendor/etc
6、ls -aZ查看文件SELinux上下文
SELinux标签提供了用户(u)、角色(object_r)、类型(hht_data_file)和级别(s0)等信息用于做出访问控制决策。
7、参考链接