作为安卓安全模型的一部分,安卓使用安全增强型Linux(SELinux)对所有进程实施强制性访问控制(MAC),甚至是以root/超级用户权限(Linux能力)运行的进程。许多公司和组织都为安卓的SELinux实现做出了贡献。有了SELinux,安卓可以更好地保护和限制系统服务,控制对应用程序数据和系统日志的访问,减少恶意软件的影响,并保护用户免受移动设备上代码的潜在缺陷。
SELinux根据默认拒绝的原则运作。任何没有明确允许的东西都会被拒绝。SELinux可以在两种全局模式下运行。
- Permissive mode: 其中权限拒绝被记录下来,但不强制执行。
- Enforcing mode: 其中权限拒绝被记录和强制执行。
- Disabled:表示SELinux没有实际运行。
setenv append_bootargs androidboot.selinux=permissive
saveenv
getenforce、setenforce命令
可以通过getenforce和setenforce命令来查看和切换当前的模式,如:
# 查看当前系统SELinux模式
jyq@ubuntu:~$ getenforce
Permissive
# 将SELinux模式设置为Enforcing模式,1表示Enforing模式,0表示Permissive模式
jyq@ubuntu:~$ sudo setenforce 1
jyq@ubuntu:~$ getenforce
Enforcing
但是需要注意的是,setenforce命令无法在Disabled的模式下进行模式的切换,如果要切换Diabled模式,则通过上面的bootargs来实现。
SELinux概念
一个政策规则的形式是:
allow source target:class permissions;
- Source - 规则主体的类型(或属性)。谁在请求访问?
- Target - 对象的类型(或属性)。要求访问的是什么?
- Class - 被访问对象的种类(如文件、套接字)。
- Permissions - 正在进行的操作(或一组操作)(例如,读、写)。
一个规则的例子是:
allow untrusted_app app_data_file:file {
read write };
这说明应用程序被允许读写标有app_data_file的文件。还存在其他类型的应用程序。例如,isolated_app用于其清单中带有isolatedProcess=true的应用服务。Android没有对这两种类型重复规则,而是对涵盖应用程序的所有类型使用一个名为appdomain的属性:
# 将属性appdomain与类型untrusted_app相关联。
typeattribute untrusted_app, appdomain;
# 将属性appdomain与类型isolated_app相关联。
typeattribute isolated_app, appdomain;
allow appdomain app_data_file:file {
read write };
allow appdomain app_data_file:file {
read write };
与
allow appdomain app_data_file:file rw_file_perms;
相等
当写下一条指定属性名称的规则时,该名称会自动扩展到与该属性相关的域或类型列表。一些值得注意的属性是。
- domain - 与所有进程类型相关的属性。
- file_type - 与所有文件类型关联的属性。
在调试SELinux策略或标记文件时(通过file_contexts或运行ls -Z时),你可能会遇到一个安全上下文(也称为标签)。
# ls -Z /sys/devices/platform