目录
一、简介
二、Selinux资源访问控制
三、Selinux工作模式
四、判断是否为Sepolicy问题
五、快速修改
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是 Linux 的一个安全子系统。SELinux 主要作用是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。Google从android 5.0开始引入Selinux。
Selinux中对资源的访问控制分为两类: DAC和MAC。
Selinux会先做DAC检查再做MAC检查。
Selinux 有三种工作模式,分别为:
对于Android设备来说,adb shell后执行getenforce即可获得当前工作模式。
Step1. 当某个进程出问题时,举个例子,比如so明明存在却无法link,那么看日志里是否有相关的avc:
avc: denied { read } for name="libxxx.so" dev="xxx" ino=xxx scontext=u:r:abc:s0 tcontext=u:object_r:vendor_file:s0 tclass=file permissive=0
Step2. 临时关闭Selinux
adb shell
# 设置为Permissive模式
setenforce 0
# 看一下成功没
getenforce
上述方法重启后失效,仅限临时验证。
Step3. 看问题是否消失
也可以根据需要重启进程啥的。消失了就是Selinux的问题。
其实很好修改,再来看这句日志:
avc: denied { read } for name="libxxx.so" dev="xxx" ino=xxx scontext=u:r:abc:s0 tcontext=u:object_r:vendor_file:s0 tclass=file permissive=0
这句日志的意思是:{被拒绝的动作} name="客体名称" scontext=u:r:主体上下文:s0 tcontext=u:object_r:客体上下文:s0 tclass=客体类型
只关注标红部分即可,缺啥补啥。在abc.te文件(小概率其他文件)中加上一行:
allow abc vendor_file:file { read };
即可。
---------------------------
如果abc这个主体上下文不存在(全局搜下,正常都会有,没有说明是你自己独创的),那就要在file_context文件中加入
/vendor/bin/hw/android\.hardware\.abc@1\.0-service u:object_r:abc_exec:s0
前面的abc对应文件名字,不一定是这个我只是举个例子。然后新建abc.te,开头写入:
type abc, domain;# allow init to launch processes in this context
type abc_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(abc)
类似的。然后下面再加上allow那个权限。
验证:修改后编译selinux_policy,如果abc安全上下文也是你自己写上的需要编译vendor或eng_vendor镜像替换(各厂商不太一样)。替换,验证。如果再报其他权限问题,再加。
参考优秀博客:
Android SELinux 规则介绍 - 万卷茅屋 (wertherzhang.com)
Android的Sepolicy - 青山牧云人 - 博客园 (cnblogs.com)