什么是Andorid SElinux?
SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统
,这个系统是要强制控制进程对系统资源的访问,并提供基于角色和多层级的安全访问控制策略。它要控制的不仅仅是用户,而是进程级别的。SELinux提供了比传统的UNIX权限更好的访问控制
。
使用SELinux,我们可以指定只有满足某种条件的进程才能访问相关的系统资源,这样即使用户运行了攻击程序或者以root身份运行,它也访问不了SELinux不授权的文件。
其工作原理如下:
- 把系统实体分为主体和客体。比如进程为主体,文件,目录,文件描述符,网络套接字等客体,进程也可以作为客体看待。
- 对主体定义域上下文属性,对文件定义类型上下文属性,其实就是打个标签。
- 在用户空间的策略文件里配置域所具有的访问某种类型属性以及域切换规则等。
- 策略的判断和执行由内核实现。在系统运行过程中,当某个进程要访问一个文件时,有系统内核根据用户空间的配置策略文件来判断进程的域上下文是否有访问文件的权限。同时在需要时完成域切换等操作。
ps -Z //可列出当前系统正在运行进程的域上下文
ls -Z //可列出文件和目录的类型上下文属性
哪个版本默认开启了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:(只审查权限,不限制)