1.SELinux的介绍
Android平台的SELinux(Security Enhanced Linux)是一种基于Linux内核的安全增强技术,由美国国家安全局(NSA)发起并得到Red Hat、Tresys等公司的支持。SELinux的主要目的是在Linux操作系统上实现强制访问控制(Mandatory Access Control,MAC),以提高系统的安全性。 在Android系统中,SELinux的实现称为SEAndroid。从Android 4.4版本开始,SEAndroid正式启用,为Android设备提供了更加严格的安全保障。SELinux与传统的自主访问控制(Discretionary Access Control,DAC)不同,它不仅限制了进程对资源的访问权限,还限制了进程对资源的访问方式。通过这种方式,SELinux可以有效地防止恶意程序对系统资源的滥用,提高系统的安全性。 SELinux在Android设备中主要有三种操作模式:禁用(Disabled)、宽容(Permissive)和强制(Enforcing)。在禁用模式下,SELinux不发挥作用,系统恢复到传统的DAC安全模型;在宽容模式下,SELinux会对违反策略的行为进行警告,但仍然允许访问资源;在强制模式下,SELinux会严格实施安全策略,对违反策略的行为进行阻止。 Android中的SELinux策略配置是通过.te文件来实现的。.te文件包含了SELinux的策略规则,用于定义进程、对象和权限之间的关系。例如,某个应用程序需要读取系统属性,那么就需要在相应的.te文件中添加允许规则。通过编写.te文件,开发者可以为应用程序配置所需的安全策略,以确保应用程序在运行时能够正常访问系统资源。 当SELinux策略规则发生冲突时,通常需要进行特殊处理。例如,某个应用程序需要写入/proc目录下的文件,但SELinux策略中没有对应的允许规则,那么该应用程序将无法写入文件。在这种情况下,可以通过修改.te文件或使用audit2allow工具来生成相应的允许规则,以解决冲突。 总之,Android平台下的SELinux是一种重要的安全技术,它通过强制访问控制策略,提高了Android设备的安全性。通过编写.te文件和合理配置SELinux策略,开发者可以确保应用程序在运行时能够安全地访问系统资源。在实际开发过程中,了解和掌握SELinux的相关知识和技术,对于保障Android应用程序的安全性具有重要意义。
2.SELinux 基本架构与原理 SELinux 是典型的MAC-Mandatory Access Controls实现,对系统中每个对象都生成一个安全上下文(Security Context),每一个对象访问系统的资源都要进行安全上下文审查。审查的规则包括类型强制检测(type enforcement),多层安全审查(Multi-Level Security),以及基于角色的访问控制(RBAC: Role Based Access Control)。SELinux 搭建在Linux Security Module(LSM)基础上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 验证,如果异常则直接返回。 * 访问真正的系统资源。 * 返回用户态,将结果反馈。
3.一些关于SELinux编译问题报错
以我要添加的客户权限为例:首先我在system/sepolicy/private/system_app.te添加客户所需权限(权限太多,这里我就加一个权限):
diff --git a/system/sepolicy/private/system_app.te
b/system/sepolicy/private/system_app.te
old mode 100644
new mode 100755
index 239686e671f..8e03106907a
--- a/system/sepolicy/private/system_app.te
+++ b/system/sepolicy/private/system_app.te
@@ -186,3 +186,12 @@ neverallow system_app fuse_device:chr_file *;
# bug reports, but not reads.
neverallow system_app shell_data_file:dir { no_w_dir_perms open search read };
neverallow system_app shell_data_file:file { open read ioctl lock };
+allow system_app hwservicemanager:file r_file_perms;
这样编译会报这样的错误:
libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te (or line 56148 of policy.conf) violated by allow system_app hwservicemanager:file { ioctl read lock open watch watch_reads };
libsepol.report_failure: neverallow on line 454 of system/sepolicy/public/app.te (or line 10500 of policy.conf) violated by allow system_app hwservicemanager:file { ioctl read lock open watch watch_reads };
提示我加的hwservicemanager这个权限是有问题的,会跟system/sepolicy/public/app.te中第四百五十四行的有冲突,打开这个文件看第四百五十四行看:
neverallow { appdomain -shell } { domain -appdomain }:file no_rw_file_perms;
提示neverallow,但是我要加的权限是allow,这就从冲突了,解法就是在这个neverallow中,把我要加的这个文件过滤掉(也可以只单纯过滤这个权限),改动如下:
neverallow { appdomain -shell -system_app} { domain -appdomain }:file no_rw_file_perms;
这样改完以后再编译还是会报错,报错log如下:
libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te (or line 56148 of policy.conf) violated by allow system_app hwservicemanager:file { ioctl read lock open watch watch_reads };
现在提示我添加权限的这个文件的第九行有问题,第九行是:
app_domain(system_app)
app_domain指的是应用程序的域,解决办法是:
diff --git a/system/sepolicy/public/te_macros b/system/sepolicy/public/te_macros
old mode 100644
new mode 100755
index 7dc5062c557..c000220f156
--- a/system/sepolicy/public/te_macros
+++ b/system/sepolicy/public/te_macros
@@ -187,8 +187,8 @@ typeattribute $1 appdomain;
type_transition $1 tmpfs:file appdomain_tmpfs;
userfaultfd_use($1)
allow $1 appdomain_tmpfs:file { execute getattr map read write };
-neverallow { $1 -runas_app -shell -simpleperf } { domain -$1 }:file no_rw_file_perms;
-neverallow { appdomain -runas_app -shell -simpleperf -$1 } $1:file no_rw_file_perms;
+neverallow { $1 -system_app -runas_app -shell -simpleperf } { domain -$1 }:file no_rw_file_perms;
+neverallow { appdomain -system_app -runas_app -shell -simpleperf -$1 } $1:file no_rw_file_perms;
# The Android security model guarantees the confidentiality and integrity
# of application data and execution state. Ptrace bypasses those
# confidentiality guarantees. Disallow ptrace access from system components to
也是在neverallow把这个文件过滤掉,其实这种有冲突的解决思想都是想办法把自己要加的权限给规避掉,关于SELinux编译报错的问题,一次只会报一个地方,解完一个再报下一个,直到解到编译没有问题为止,这一点比较烦人!