报错日志
- ['add ', 'u:object_r:default_android_service:s0', '01-01 00:00:25.425 334 334 E SELinux : avc: denied { add } for pid=1709 uid=1000 name=xxxxxxx_2nd_manager scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=1']
- ['find ', 'u:object_r:default_android_service:s0', '01-01 00:00:25.825 334 334 E SELinux : avc: denied { find } for pid=1709 uid=1000 name=CxxxxxService scontext=u:r:system_server:s0 tcontext=u:object_r:default_android_service:s0 tclass=service_manager permissive=1']
- ['find ', 'u:object_r:xx_powermoding_hwservice:s0', '09-29 18:34:16.760 335 335 E SELinux : avc: denied { find } for interface=vendor.xx.powermode::IPowerModing sid=u:r:system_server:s0 pid=1709 scontext=u:r:system_server:s0 tcontext=u:object_r:xx_powermoding_hwservice:s0 tclass=hwservice_manager permissive=1']
上面报错的处理方法:
在.te文件(这里是system_server.te,一般都能找到同名的te文件)中添加
allow system_server default_android_service:service_manager { add find };
allow system_server xx_powermoding_hwservice:hwservice_manager find;
*注意上面语句中,scontext,tcontext和tclass的位置。
有时候allow会和其它文件里的disallow冲突,这时编译(make selinux_policy)会报错,并打印出冲突的位置(精确到某个文件的某一行)。此时可以使用dontaudit替代allow或者去掉disallow的冲突代码。
如果scontext和tcontext相同,tcontext可以用self代替
如allow xxx self:yyy { zzz };
编译完成后,推包验证。如果使用的是make selinux_policy,system和vendor目录都有产物。产物目录里,除了.cil文件以外,还有很多contexts结尾的文件,需要把整个文件夹push进去验证。
selinux的目录,下面以原生的logd为例。修改logd的selinux权限,需要修改/system/sepolicy目录下public/logd.te以及(如果是安卓12,对应API 32)/prebuilts/api/32.0/public/logd.te
调试selinux时,可以setenforce 0 关闭selinux检查,这样只会有selinux的权限报错,但实际没有拦截,不影响实际功能。此时报错的结尾permissive=1。而selinux权限拦截生效时,结尾permissive=0.