0%

定制SELinux规则 允许app访问内核模块

问题描述

使用insmod安装内核模块后,在appNative层访问驱动,提示Permission Denied
设置驱动权限,绕过DAC权限检查:chmod 666 /dev/helloworld
再次调用,仍然失败。
执行dmesg -w | grep "avc: denied",查看SELinux日志。

1
[23292:logd.auditd]type=1400 audit(1651503112.740:5320): avc: denied { read write } for comm="exp.hellokernel" name="helloworld" dev="tmpfs" ino=297747 scontext=u:r:priv_app:s0:c227,c256,c512,c768 tcontext=u:object_r:device:s0 tclass=chr_file permissive=1

关闭SELinux后,成功调用驱动。

添加allow规则,调用仍失败,查阅资料得知需要设置为mlstrustedsubject

最终基于magiskpolicy,实现了自定义SELinux规则的添加。

PS:笔者将apk放到了system/priv-app目录下,所以rolepriv_app,而非untrusted_app

手动添加规则

方法一:sepolicy.rule

创建一个Magisk模块,放入sepolicy.rule,将其解压到$MODPATH

1
2
allow priv_app device chr_file { read write ioctl open getattr map }
attradd priv_app mlstrustedsubject

方法二:命令行

手动执行,或在Magisk模块的post-fs-data.sh中添加以下命令

1
2
magiskpolicy --live "allow priv_app device chr_file { read write ioctl open getattr map }"
magiskpolicy --live "attradd priv_app mlstrustedsubject"

untrusted_app

1
2
magiskpolicy --live "allow untrusted_app device chr_file { read write ioctl open getattr map }"
magiskpolicy --live "attradd untrusted_app mlstrustedsubject"

方法三:重编译Magisk

修改Magisk源代码,内置SELinux规则

具体可参考Magisk内嵌驱动模块且启动加载

方法四:重编译内核和系统

内置内核模块,修改系统的SELinux规则(理论可行,笔者未测试)

参考

AOSP 8.1 新增/dev设备节点 Selinux的权限设置
Android/SELinux 添加 AVC 权限
SELinux 添加一个权限
vold-posix_post-fs-data.sh