问题描述
使用insmod安装内核模块后,在app的Native层访问驱动,提示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目录下,所以role是priv_app,而非untrusted_app。
手动添加规则
方法一:sepolicy.rule
创建一个Magisk模块,放入sepolicy.rule,将其解压到$MODPATH。
1 | allow priv_app device chr_file { read write ioctl open getattr map } |
方法二:命令行
手动执行,或在Magisk模块的post-fs-data.sh中添加以下命令
1 | magiskpolicy --live "allow priv_app device chr_file { read write ioctl open getattr map }" |
untrusted_app
1 | magiskpolicy --live "allow untrusted_app device chr_file { read write ioctl open getattr map }" |
方法三:重编译Magisk
修改Magisk源代码,内置SELinux规则
具体可参考Magisk内嵌驱动模块且启动加载
方法四:重编译内核和系统
内置内核模块,修改系统的SELinux规则(理论可行,笔者未测试)
参考
AOSP 8.1 新增/dev设备节点 Selinux的权限设置
Android/SELinux 添加 AVC 权限
SELinux 添加一个权限
vold-posix_post-fs-data.sh