什么是Andorid SElinux?
SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统
,这个系统是要强制控制进程对系统资源的访问,并提供基于角色和多层级的安全访问控制策略。它要控制的不仅仅是用户,而是进程级别的。SELinux提供了比传统的UNIX权限更好的访问控制
。
使用SELinux,我们可以指定只有满足某种条件的进程才能访问相关的系统资源,这样即使用户运行了攻击程序或者以root身份运行,它也访问不了SELinux不授权的文件。
其工作原理如下:
哪个版本默认开启了selinux?
userdebug版本和eng版本默认关闭;
user默认开启;
如何通过调试手段确认问题是否是selinux导致?
- 将SELinux 模式调整到Permissive 模式,然后再测试确认是否与SELinux 约束相关。
- 如果还能复现问题,则与SELinux 无关, 如果原本很容易复现, 而Permissive mode 不能再复现, 那么可能关系比较大.
- adb在线修改seLinux:
getenforce //获取当前seLinux状态
Enforcing ://表示已打开
Permissive ://表示已关闭
setenforce 1 //打开seLinux
setenforce 0 //关闭seLinux
SELinux包含五个基本组成:
- 用于处理文件系统的辅助模块,即SELinuxFS.
- 集成Linux Security Modules的hooks sets.
- Security Policy Database.
- Security Label验证模块.
- Access Vector Cache(AVC),访问向量缓存,以便提高验证速度.
具体流程如下:
- 进程通过系统调用(System Call)访问某个资源,进入Kernel后,先会做基本的检测,如果异常则直接返回.
- Linux Kernel DAC审查,如果异常则直接返回.
- 调用Linux Kernel Modules的相关hooks,对接到SELinux的hooks,进而进行MAC的验证,如果异常则直接返回.
- 访问真正的系统资源.
- 返回用户态,将结构反馈.
注:enforcing mode (限制访问);permissive mode:(只审查权限,不限制)