android selinux报avc denied权限和编译报neverallow解决方案

在android修改代码后,经常会遇到运行时报avc denied问题。
下面是我遇到的案例,以及我的解决方案,发出来供大家参考一下。

运行avc denied的日志:

[   20.626831] type=1400 audit(81582.939:4): avc: denied { read write } for comm="tee" name="mmcblk1rpmb" dev="tmpfs" ino=25616 scontext=u:r:tee:s0 tcontext=u:object_r:device:s0 tclass=chr_file permissive=0

根据SEinux policy规则,我们在相应的.te文件中添加allow规则

allow tee device:chr_file { open read write };

接着编译一下android,发现编译会报never allow的错误,报错内容如下:

libsepol.report_failure: neverallow on line 444 of system/sepolicy/public/domain.te (or line 12990 of policy.conf) violated by allow tee device:chr_file { read write };
libsepol.check_assertions: 1 neverallow failures occurred
Error while expanding policy

报错原因也比较直接,就是domain域中指明的规则,我们先看下为什么会报错吧
直接打开编译报错中那个domain.te,路径:system/sepolicy/public/domain.te,找到和我们添加的部分,搜索“device:chr_file”,可以找到如下内容了,看一下就明白了,不允许我们这样修改了。

# Don't allow raw read/write/open access to generic devices.
# Rather force a relabel to a more specific type.
neverallow domain device:chr_file { open read write };

那是什么原因导致的这个编译报错呢?
说直白一点就是当前这个process进程申请的权限过高了。

那有没有办法绕过这个报错呢?
当然是有的,可以参考如下步骤
1、先查看一下是哪些相关的代码申请的这个权限,主要是判断一下是申请的属性还是device节点访问权限等。
2、新增加一个SELinux type
根据申请的类型可以进修改一下访问的Object的Lable
比如我这里是device节点,那我就在device.te中

type my_rpmb_device, dev_type;

3、绑定文件到这个SELinux type
因为我这里知道我访问的是/dev/mmcblk1rpmb节点,我在第一步中确认的,
所以在file_contexts中添加如下代码。

/dev/mmcblk1rpmb u:object_r:my_rpmb_device:s0

4、修改te文件,添加process/domain的访问权限
这里就比较简单了,直接添加对应的规则就可以了。

allow tee my_rpmb_device:chr_file { open read write };

最后重新再编译一下android,就不会再报之前的编译问题了。

------------------------------ 分割线 -------------------------------------------------------------
另外补充一个在用户空间调用ioctl导致的selinux权限报错问题
报错日志如下:

[   36.348961] type=1400 audit(88595.495:24): 
avc: denied { ioctl } for comm="tee-supplicant" path="/dev/mmcblk1rpmb" dev="tmpfs" ino=25620 ioctlcmd=0xb301 scontext=u:r:tee:s0 tcontext=u:object_r:tee_rpmb_device:s0 tclass=chr_file permissive=0

报错原因是Google在Android Q上增强了对ioctl的审查,除保持对ioctl的审查/授权之外,对具体的ioctlcmd也需要进一步地审查/授权。

那有没有办法解决这个报错呢?当然也是有的~
解决方法如下:
1、在对应的te文件添加如下code
根据报错的日志,添加如下对应code即可。

allow tee tee_rpmb_device:chr_file { open read write ioctl };
allow tee tee_rpmb_device:blk_file ioctl;
allowxperm tee tee_rpmb_device:blk_file ioctl 0xb301;
  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值