avc权限问题解决

avc权限问题是android开发中比较常见的权限问题,已经有了一套成熟的解决方案。

SELinux(安全增强型 Linux)是 Linux 内核的一个安全模块,它提供了强制访问控制 (MAC)。MAC 是一种安全模型,它根据系统管理员定义的一组规则来强制执行访问控制决策。SELinux旨在通过限制用户和进程在系统上可以执行的操作来防止对系统资源和数据的未经授权的访问。

avc(访问向量缓存)是 SELinux 的一个组件,它存储了 SELinux 策略做出的访问控制决策。avc 用于通过缓存先前决策的结果来加速访问控制决策的制定过程。

当一个进程试图访问一个资源时,SELinux 会检查 avc 以查看访问是否被允许。如果允许访问,则进程被允许继续。如果拒绝访问,则进程被终止并记录一条 avc 拒绝消息。

目录

问题确认

解决方法


问题确认

可以通过以下方式确认是否属于avc权限问题:

  1. 查看log里是否有出现avc报错。
  2. 将SELinux设置为permissive后,观察程序是否可以按预期执行。
    SELinux有两种状态,permissive和enforce。可以通过下述命令查看:
    adb shell getenforce
    permissive模式下,SELinux 会记录违反安全策略的尝试,但不会阻止它们。这允许管理员在强制实施策略之前测试和调试 SELinux 策略。一般在开发调试阶段使用。
    enforce 模式下,SELinux 会阻止违反安全策略的尝试。这提供了更高的安全性级别,但可能会导致合法的操作被阻止,即产生avc权限问题。
    SELinux状态设置方法:
    adb shell setenforce 0 //permissive
    adb shell setenforce 1 //enforce

解决方法

  • Step 1:抓取avc权限问题log
    adb logcat | grep "avc" > avc.txt
    
  • Step 2:使用工具audit2allow,执行audit2allow –i avc
    audit2allow –i avc
  • Step 3:可以输出对应需要的权限如下(例)
    #============= platform_app ==============
    allow platform_app nfc_service:service_manager find;
  • Step 4:找到对应.te文件
    find -name platform_app.te
  • Step 5:例中位于
    ./sepolicy/public/platform_app.te
  • Step 6:在其中加入上面的输出
    allow platform_app nfc_service:service_manager find;

重新编译就可以解决avc权限问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值