当前位置: 首页 > >

【Android系统开发】SEAndroid权限解决方法汇总

发布时间:

前言:

从android5.x开始,引入严格的selinux权限管理机制,经常会遇到各种avc denied的log。
SEAndroid就是SElinux的增强型版本。


确认问题

先排查是否由SElinux策略导致的问题
串口输入:setenforce 0
串口输入:getenforce 0 即进入了permissive



1. 强制关闭SEAndroid的方法:
1.1 方法一

如果是user版本固件,则在bootcmd加入androidboot.selinux =permissive即可

如果是eng或者userdebug固件也想用androidboot.selinux =permissive控制需要修改system/core/init/Android.mk,如下


7 ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
8 init_options +=
9 -DALLOW_LOCAL_PROP_OVERRIDE=1
10 -DALLOW_PERMISSIVE_SELINUX=1
11 -DREBOOT_BOOTLOADER_ON_PANIC=1
12 -DWORLD_WRITABLE_KMSG=1
13 -DDUMP_ON_UMOUNT_FAILURE=1
14 else
15 init_options +=
16 -DALLOW_LOCAL_PROP_OVERRIDE=0
17 -DALLOW_PERMISSIVE_SELINUX=0 将此项-DALLOW_PERMISSIVE_SELINUX=0 改成-DALLOW_PERMISSIVE_SELINUX=1
18 -DREBOOT_BOOTLOADER_ON_PANIC=0
19 -DWORLD_WRITABLE_KMSG=0
20 -DDUMP_ON_UMOUNT_FAILURE=0
21 endi

注意androidboot.selinux由system/core/init/selinux.cpp中解析。



1.2 方法二

串口修改setenforce 0,临时性的*艉笙



1.3 方法三

在内核中关闭selinux的支持



Security options ?>
? ? [*] NSA SELinux Support



取消选中NSA SELinux Support即可。



1.4 方法四

根据具体的SEAndroid权限报错,填充权限到对应的.te文件,有以下两种方法:


1.4.1 根据万能套用公式 手动填写

# adb shell cat /proc/kmsg | grep avc
# adb shell dmesg | grep avc
# adb logcat | grep avc

解决原则是: 缺什么补什么,一步一步补到没有avc denied为止。


例如内核log如下:


audit(0.0:67): avc: denied { write }for path="/dev/block/vold/93:96" dev="tmpfs" ino=1263 scontext=u:r:kernel:s0 tcontext=u:object_r:block_device:s0tclass=blk_file permissive=0

分析过程
缺少什么权限: { write }权限,
谁缺少权限: scontext=u:r:kernel:s0,
对哪个文件缺少权限:tcontext=u:object_r:block_device
什么类型的文件: tclass=blk_file


解决方法kernel.te


allow kernel block_device:blk_file write;

万能套用公式


scontext(进程名) tcontext(安全上下文) tclass(访问类型) avc denied(访问权限)
allow kernel block_device:blk_file write

重新编译:make bootimage,重新烧写boot.img固件.



1.4.2:根据envsetup.sh中提供的工具自带生成

万能工具:
目前所有的 SELinux 权限检测失败,在 Kernel Log 或者 Android Log 中都有对应的 avc-denied Log 与之对应。反过来,有 avc-denied log,并非就会直接失败,还需要确认当时 SELinux 的模式, 是 Enforcing 还是 Permissve。
如果是 Enforcing 模式,就要检测对应的进程访问权限资源是否正常?是否有必要添加? 如果有必要添加,可以找下面的方式生成需要的 sepolicy 规则并添加到对应 te 文件。


使用 audit2allow 简化方法


    从 logcat 或串口中提取相应的 avc-denied log,下面的语句为提取所有的 avc- denied log

    $ adb shell "cat /proc/kmsg | grep avc" > avc_log.txt

    使用 audit2allow 工具生成对应的 policy 规则
    audio2allow 使用必须先 source build/envsetup.sh,导入环境变量

    $ audit2allow -i avc_log.txt -p $OUT/vendor/etc/selinux/precompiled_sepolicy

    将对应的policy 添加到 te 文件中
    一般添加在 /device//common/sepolicy 或者 /device//$DEVICE/sepolicy 目录下 。
    厂家通过下面个命令 添加自定义的 sepolicy 规则:

    BOARD_SEPOLICY_DIRS += device/$SoC/common/sepolicy



友情链接: