SEAndroid安全机制(一)

建议阅读

文章完成后,有天偶然翻到google文档才发现关于SEAndroid安全机制非常详细的资料,建议阅读https://source.android.com/security/selinux/device-policy

引言

近一年的工作,经常遇到要处理一些内核节点的权限问题,这就涉及到SEAndroid安全机制。学会如何这类处理问题,同时也需要了解下SEAndroid安全机制究竟是何方神圣,框架和用途又是怎样。

1. 安全机制

  • 在Selinux之前,Linux使用的安全机制称为DAC(自主访问控制),主要根据文件所属的分组来限制对资源的访问。分为:拥有者,同组用户和其他用户,一般在终端通过ls -Z命令可以查看各资源文件的DAC权限设置。这是一种非常粗略的权限管理方法,只能控制对资源文件的读写和执行,不能进行更精确的控制。
  • DAC机制的问题在于它区别用户和程序,它将所有用户运行的程序赋予和用户相同的权限。一旦病毒和木马程序获取了系统的root权限,将没有任何手段阻止他们对系统的破坏和窃取信息。
  • MAC(强制访问控制),它将系统中的资源分密级和类别进行管理,保证每个用户只能访问那些明确授权可以访问的资源。MAC有2个重要的概念:Subject和Object。主体通常指用户或用户运行的进程,而客体包括文件,目录,socket等系统资源。另外,如果进程作为一种被访问的资源时,它也是一种客体。
  • 在MAC机制中,主体和客体都被设置了安全上下文(Security Context),同时系统中还存在一个安全规则库。每次主体访问客体时,系统通过检查安全上下文来确定主体是否有权限访问。
  • DAC和MAC并存,在一次访问过程中,系统先进行DAC检查,通过后再进行MAC检查。

2.SEAndroid基本框架

SEAndroid安全机制(一)_第1张图片
SEAndroid安全机制框架

以SELinux文件系统接口为边界,SEAndroid安全机制包含有内核空间和用户空间两部分支持。在内核空间,主要涉及到一个称为SELinux LSM的模块。而在用户空间中,涉及到Security Context、Security Server和SEAndroid Policy等模块。这些内核空间模块和用户空间模块的作用以及交互如下所示:

    1. 内核空间的SELinux LSM模块负责内核资源的安全访问控制。

    2. 用户空间的SEAndroid Policy描述的是资源安全访问策略。系统在启动的时候,用户空间的Security Server需要将这些安全访问策略加载内核空间的SELinux LSM模块中去。这是通过SELinux文件系统接口实现的。

    3. 用户空间的Security Context描述的是资源安全上下文。SEAndroid的安全访问策略就是在资源的安全上下文基础上实现的。

    4. 用户空间的Security Server一方面需要到用户空间的Security Context去检索对象的安全上下文,另一方面也需要到内核空间去操作对象的安全上下文。

    5. 用户空间的selinux库封装了对SELinux文件系统接口的读写操作。用户空间的Security Server访问内核空间的SELinux LSM模块时,都是间接地通过selinux进行的。这样可以将对SELinux文件系统接口的读写操作封装成更有意义的函数调用。

    6. 用户空间的Security Server到用户空间的Security Context去检索对象的安全上下文时,同样也是通过selinux库来进行的。

3. 安全上下文

  • ls -lZ查看文件的安全上下文


    SEAndroid安全机制(一)_第2张图片
    文件的安全上下文
  • ps -Z查看进程的安全上下文


    SEAndroid安全机制(一)_第3张图片
    进程的安全上下文

安全上下文的格式是:User:Role:Type[Level] (指定用户:指定角色:客体和主体所属的类型【定义安全等级】)
对此我们唯一需要关注的是Type,后面我们会说到。

  • type语句

type init ,domain;

type cgroup ,fs_type;

type 类型名称, 属性;

type语句中的属性值都是预定好的,例如domain就代表域,通常主体的type具体domain属性。fs_type表示文件,通常用于客体的类型。

4. 访问规则语句

allow init unlabeled:filesystem mount;
allow init kernel:security load_policy;

以上两条规则的含义:

  • 允许init域加载没有安全上下文的文件系统
  • 允许init域为kernel装载policy

以上定义访问规则使用的allow语句,语法如下:

allow source_type target_type : class Permission

  • Source type 源类型:通常是某种属性为domain的类型,代表主体。
  • Target type 目标类型:允许访问的客体的类型(type),目标类型可以指定多个。
  • Object class 客体类别:允许访问的客体类别,是对目标类型的限制。
  • Permission 许可:指定主体可以对客体进行操作的种类。可参见access_vectors。

5.访问控制规则

  • allow : 允许主体对客体进行操作
  • neverallow :拒绝主体对客体进行操作
  • dontaudit : 表示不记录某条违反规则的决策信息
  • auditallow :记录某项决策信息,通常SElinux只记录失败的信息,应用这条规则后会记录成功的决策信息。

6.策略文件位置

Android 6.0 位置在external/sepolicy, 7.0变动到system/sepolicy

6.1角色定义文件roles

角色定义文件用来定义Selinux系统的角色,内容如下:

role r;
role r types domain;

SeAndroid只定义了一种角色r。

6.2 用户定义文件users

user u roles { r } level s0 range s0 - mls_systemhigh;

同样之定义了一种u,这就是我们在安全上下文一节说只要关注type的原因。

6.3 属性定义文件attributes

该文件定义了所以type定义中用到的属性值,如下所示:

attribute dev_type;
attribute domain;
attribute fs_type;
.....

具体释义可以查看源码中的注释

6.4 Class定义文件security_classes

在规则定义语句中会用客体限制类别(Object Class),该文件定义了所有系统中用到的class,如下所示:

class filesystem
class file
class dir
class fd
class lnk_file
class chr_file
class blk_file

class sock_file
class fifo_file
.....
代表着一个对系统资源细化的一个类别。

6.5 操作定义文件access_vectors

allow语句的最后一项为允许的操作,都在该文件中定义,以下举一个对file文件可以进行操作类型的。

common file{
ioctl
read
write
create
getattr
setattr
lock
relabelfrom
relabelto
append
link
rename
execute
swapon
quotaon
mounton
}
......

6.6 宏定义操作文件 global_macros

allow允许的操作可以用宏包裹起来,定义在文件global_macros。

define(r_dir_perms',{ open getattr read search ioctl }')
define(w_dir_perms',{ open search write add_name remove_name }')
define(ra_dir_perms',{ r_dir_perms add_name write }')
define(rw_dir_perms',{ r_dir_perms w_dir_perms }')
......

6.7 file_contexts 文件

file_contexts 文件保存的是所有文件的安全上先问定义,部分内容如下:

/dev(/.)? u:object_r:device:s0
/dev/akm8973.
u:object_r:sensors_device:s0
/dev/accelerometer u:object_r:sensors_device:s0
/dev/adf[0-9]* u:object_r:graphics_device:s0
/dev/adf-interface[0-9].[0-9] u:object_r:graphics_device:s0
/dev/adf-overlay-engine[0-9].[0-9] u:object_r:graphics_device:s0
/dev/alarm u:object_r:alarm_device:s0
/dev/android_adb.* u:object_r:adb_device:s0
/dev/ashmem u:object_r:ashmem_device:s0
/dev/audio.* u:object_r:audio_device:s0
......

前半部分是文件的路径,后面是安全上下文的定义。

6.8 property_contexts文件

该文件保存了系统中所有Android属性的安全上下文定义:

net. u:object_r:system_prop:s0
dev. u:object_r:system_prop:s0
runtime. u:object_r:system_prop:s0
hw. u:object_r:system_prop:s0
sys. u:object_r:system_prop:s0
sys.powerctl u:object_r:powerctl_prop:s0
sys.usb.ffs. u:object_r:ffs_prop:s0
service. u:object_r:system_prop:s0
wlan. u:object_r:system_prop:s0
......

6.9 .te文件(规则文件)

Sepolicy目录里最多的文件类型,大多以domain的名字命令,包含类型定义和规则定义语句。举一个platform_app.te文件的例子,代表着对platform_app域操作文件规则的定义,如下:

allow platform_app { apk_tmp_file apk_private_tmp_file }:dir rw_dir_perms;
allow platform_app { apk_tmp_file apk_private_tmp_file }:file rw_file_perms;
allow platform_app apk_private_data_file:dir search;
allow platform_app asec_apk_file:dir create_dir_perms;
allow platform_app asec_apk_file:file create_file_perms;
......

你可能感兴趣的:(SEAndroid安全机制(一))