问题描述
使用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