前言
SELinux 是Google从Android5.0开始,强制引入的一套非常严格的权限管理机制,主要用于增强系统的安全性。关于Selinux的具体内容,在本篇文章就不展开细说了。如果有兴趣了解selinux的东西,可以参考深入理解SELinux SEAndroid、SEAndroid安全机制框架分析。那么在开发中,我们经常会遇到由于SELinux造成的各种权限不足,如何快速的解决selinux权限问题,是这篇文章的所讨论的问题。
实例
对于进程要查看selinux权限问题使用ps -Z
;文件查看selinux权限ls -Z
Q1:Service xxx does not have a SELinux domain defined
当我想在init.rc加入一个service时,如果未添加相应的selinux权限,就会报错:init: Service xxx does not have a SELinux domain defined.
service xxx /system/bin/xxx
class main
user root
即没有添加相应的selinux domain(域)
解决办法:
1、修改seplicy/file_contexts,一般修改位置最好放在device目录的下的sepolicy。关于这个文件的详细,可以参考SEAndroid安全机制框架分析那篇文章,查看build/core/Makefile
/system/bin/xxx u:object_r:xxx_exec:s0
2、新增xxx.te文件,并在其中添加如下内容:
#需要为新增的进程增加域、执行权限
type xxx, domain;
type xxx_exec, exec_type, file_type;
#启用这个域
init_daemon_domain(xxx)
之后重新编译bootimage就可以啦。
Q2:avc: denied { mounton} for pid=2046 comm=”mount” path=”/factory” dev=”mmcblk0p17” ino=1 scontext=u:r:uncrypt:s0 tcontext=u:object_r:vfat:s0tclass=dir permissive=0
经过上面的添加,虽然有了相关的domain的权限,但是还是会报错,主要原因是权限的添加不够完全,对于修改了其他domain的权限时,没有添加相关的修改权限,便会出现此类问题。
解决方法是有公式的。
由上面可知缺少mounton的权限,解决权限问题有下面的公式,
scontext tcontext:tclass avc:denied
allow uncrypt vfat:dir mounton
Android O selinux权限
google 推出Android O后,修改的特性较多,selinux权限相应变化也较大,这部分待补充