[Description]
android KK 4.4 版本后,如果发现进程无法访问某些文件,无法连接socket 等问题,并且发现errno 是EPERM(Operation not permitted) 或者 EACCES (Permission denied), 如何确认此类问题是因为SELinux 约束引起?
 
[Keyword]
android, SELinux, Permission denied, 访问限制,  权限问题
 
[Solution]
在Android KK 4.4 版本后,Google 有正式有限制的启用SELinux, 来增强android 的安全保护。
SELinux 分成enforcing mode 和 permissive mode, enforcing mode 会强制性限制访问; 而permissve mode 只审查权限, 但不限制, 即不会产生实质性影响.
 
KK 版本, Google 只有限制的启用SELinux, 即只有针对netd, installd, zygote, vold 以及它们直接fork 出的child process 使用enforcing mode, 但不包括zygote fork的普通app.

L  版本, Google 全面开启SELinux, 几乎所有的process 都使enforcing mode, 影响面非常广.
 
另外为了限制user 版本root 权限,针对su 有做特别的处理,可以参考FAQ android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
 
目前所有的SELinux check 失败,在kernel log 或者android log(L版本后)中都有对应的"avc:  denied" 或者 "avc: denied"的LOG 与之对应。反过来,有此LOG,并非就会直接失败,还需要确认当时SELinux 的模式, 是enforcing mode 还是 permissve mode.
 
如果问题容易复现,我们可以先将SELinux 模式调整到Permissive mode,然后再测试确认是否与SELinux 约束相关.
在ENG 版本中:
adb shell setenforce 0
 
[相关FAQ]
[FAQ11414] android KK 4.4 版本后,user 版本su 权限严重被限制问题说明
[FAQ11486] 在Kernel Log 中出现"avc: denied" 要如何处理?
[FAQ11484] 如何设置确认selinux 模式
[FAQ11483] 如何快速Debug SELinux Policy 问题
Logo

更多推荐