avc权限问题是android开发中比较常见的权限问题,已经有了一套成熟的解决方案。
SELinux(安全增强型 Linux)是 Linux 内核的一个安全模块,它提供了强制访问控制 (MAC)。MAC 是一种安全模型,它根据系统管理员定义的一组规则来强制执行访问控制决策。SELinux旨在通过限制用户和进程在系统上可以执行的操作来防止对系统资源和数据的未经授权的访问。
avc(访问向量缓存)是 SELinux 的一个组件,它存储了 SELinux 策略做出的访问控制决策。avc 用于通过缓存先前决策的结果来加速访问控制决策的制定过程。
当一个进程试图访问一个资源时,SELinux 会检查 avc 以查看访问是否被允许。如果允许访问,则进程被允许继续。如果拒绝访问,则进程被终止并记录一条 avc 拒绝消息。
目录
问题确认
可以通过以下方式确认是否属于avc权限问题:
- 查看log里是否有出现avc报错。
- 将SELinux设置为permissive后,观察程序是否可以按预期执行。
SELinux有两种状态,permissive和enforce。可以通过下述命令查看:
permissive模式下,SELinux 会记录违反安全策略的尝试,但不会阻止它们。这允许管理员在强制实施策略之前测试和调试 SELinux 策略。一般在开发调试阶段使用。adb shell getenforce
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权限问题。