系统版本:Android 11.0
平 台:RK3568
在 Android 系统的开发及适配过程中,我们常常需要对 SELinux avc 权限进行修改,以下是我对 SELinux avc 权限修改总结的方法。
#进入Android终端
adb shell
#获取root权限
su
#查看系统当前 selinux 的工作模式
getenforce
#将 selinux 切换为 Enforcing 强制模式(如果已经是Enforcing模式可省略)
setentforce 1
#验证功能并打印log
logcat | grep avc
这么做的目的是为了能够在app报错时及时发现avc权限问题。例如,在app中通过接口对节点进行读写操作时发现了log报以下selinux avc权限错误:
type=1400 audit(0.0:875): avc: denied { read } for name="value" dev="sysfs" ino=29545 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
type=1400 audit(0.0:876): avc: denied { write } for name="value" dev="sysfs" ino=29545 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
(1) 将上述avc 权限的 log 信息收集起来并保存到文件中
例如:log.txt
(2) 在平台代码根目录下打开终端,执行以下命令 :
#初始化参数设置
source build/envsetup.sh
#通过lunch命令选择需要编译的分支
lunch
(3) 生成的selinux avc权限配置信息
#将 log.txt 文件拷贝到以下路径中,然后在终端中切换到路径所在的位置:
external/selinux/prebuilts/bin
#生成 selinux avc 权限配置信息,命令格式如下:
./audit2allow -i [log文件] > [生成文件]
如果生成的信息不全或者为空的话(如上图),可以在 log.txt 文件中重复放多几行 avc log 信息,再执行生成命令即可,例如:
(4) 加上open和getattr权限
注意,读写等 avc 权限的配置往往还需要加上 open 和 getattr 权限,例如:
allow system_server sysfs:file {read write open getattr};
如果不加就可能报以下错误:
type=1400 audit(0.0:604): avc: denied { getattr } for path="/sys/devices/platform/fdd60000.gpio/gpiochip0/gpio/gpio27/value" dev="sysfs" ino=29545 scontext=u:r:system_server:s0 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
(5) selinux avc权限配置信息添加位置
device/rockchip/common/sepolicy/vendor/
例如,这里是在该目录下的 system_server.te 文件添加。此外,还需要对对应api等级的相同文件进行一样的修改:
system/sepolicy/prebuilts/api/30.0/private/coredomain.te
或者在 system/sepolicy 目录下找到相应文件添也行,这里是:
system/sepolicy/public/system_server.te
(1) 编译
在根目录下编译 /system/sepolicy/ 中的文件,编译命令如下:
mmm /system/sepolicy/
(2) 验证
将编译好的文件从电脑推送到Android设备中,以下推送命令(注意,需要删掉mapping目录及其包含的文件才能push成功):
adb push odm/etc/selinux/* odm/etc/selinux
adb push product/etc/selinux/* product/etc/selinux
adb push system/etc/selinux/* system/etc/selinux
adb push system_ext/etc/selinux/* system_ext/etc/selinux
adb push vendor/etc/selinux/* vendor/etc/selinux
adb reboot
例如:
libsepol.report_failure: neverallow on line 99 of system/sepolicy/private/coredomain.te (or line 36611 of policy.conf) violated by allow system_server sysfs:file { read write open };
libsepol.check_assertions: 1 neverallow failures occurred
Error while expanding policy
即上述修改的权限被 neverallow,具体位置在 /system/sepolicy/private/coredomain.te 中第99行。所以,对以上报错的修改如下:
--- a/sepolicy/private/coredomain.te
+++ b/sepolicy/private/coredomain.te
@@ -111,6 +111,7 @@ full_treble_only(`
# /sys
neverallow {
coredomain
-init
-ueventd
-vold
+ -system_server
-system_app
} sysfs:file no_rw_file_perms;