Android Selinux错误快速定位

2017/11/08 Android

前言

SELinux 是Google从Android5.0开始,强制引入的一套非常严格的权限管理机制,主要用于增强系统的安全性。关于Selinux的具体内容,在本篇文章就不展开细说了。如果有兴趣了解selinux的东西,可以参考深入理解SELinux SEAndroidSEAndroid安全机制框架分析。那么在开发中,我们经常会遇到由于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权限相应变化也较大,这部分待补充

Search

    Table of Contents