SELinux权限
SELinux是Google从android 5.0开始,强制引入的一套非常严格的权限管理机制,主要用于增强系统的安全性。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。SELinux 按照默认拒绝的原则运行:任何未经明确允许的行为都会被拒绝。
然而,在开发中,我们经常会遇到由于SELinux造成的各种权限不足,即使拥有“万能的root权限”,也不能获取全部的权限。
确认是否SELinux权限问题
- 先查看当前权限模式:
adb shell getenforce
- SELinux权限有两种全局权限模式:
- Permissive(宽容模式):权限拒绝事件会被记录下来,但不会被强制执行。
- Enforce(强制模式):权限拒绝事件会被记录下来并强制执行。
切换SELinux模式:
Permissive: adb shell setenforce 0
Enforce: adb shell setenforce 1
如果问题消失了,基本可以确认是SELinux造成的权限问题,需要通过正规的方式来解决权限问题。
问题解决
报错log:
问题场景是读取dropbox下面文件所致
avc: denied { read } for name="dropbox" dev="vdd44" ino=466946 scontext=u:r:system_app:s0 tcontext=u:object_r:dropbox_data_file:s0 tclass=dir permissive=0
可以看到有avc denied,且最后有permissive=0,表示不允许。
拆分此问题
缺少的权限: { read }权限
谁缺少权限: scontext=u:r:system_app:s0
对哪个文件缺少权限:tcontext=u:object_r:dropbox_data_file:s0
什么类型的文件: tclass=dir
完整的意思: system_app进程对object_r:dropbox_data_file类型的dir缺少read 权限。
解决方法
# system_app.te
allow system_app dropbox_data_file:dir { read };
总结此类问题万能公式:
要添加的权限语句: allow scontext tcontext:tclass { action };
要添加的目标文件: {scontext}.te
参考连接
- https://blog.csdn.net/Haomione/article/details/123881504
- https://blog.csdn.net/qq_40731414/article/details/126919088