Android Q 平台 增加文件ioctl 的SElinux权限
示例问题:avc: denied { ioctl } for path="/**/**" dev="**" ino=4026533781 ioctlcmd=0x6601 scontext=u:r:gap**:s0 tcontext=u:object_r:proc**:s0 tclass=file permissive=0
按照Android Q之前的selinux规则,只需要添加ioctl权限即可 allow gap** proc**:file { ioctl };
但是在Android Q上这样添加依然会报相同的selinux问题。强制关闭selinux, 执行setenforce 0; 可以规避该seliux问题。说明在Android Q上的ioctl规则没有添加正确。
===============
通过调查发现Android Q 上ioctl权限除需要allow之外 还需要增加allowxperm语句。
Google在Android Q上增强了对ioctl的审查,除保持对ioctl的审查/授权之外,对具体的ioctlcmd也需要进一步地审查/授权。
/kernel/security/selinux/hooks.c
...
error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
...
==============
示例中的问题解决方法:
1. 找到ioctlcmd=0x6601对应的CMD
/system/sepolicy/public/ioctl_defines文件(ioctl_defines也可能在vendor目录下)中找到
define(`DEV_1', `0x00006601')
2. 编写sepolicy如下:
allow gap** proc**:file { ioctl };
allowxperm gap** proc**:file ioctl { DEV_1 };
最后重新编译运行即可解决该问题。
PS:seliunx的权限问题不会一次暴露完,需要一步步添加!