概述----SEAndroid in Android 5.x

      SEAndroid,源自SELinux。SELinux最大的作用就是让人在网上发贴问如何关闭它(误。。!)。因为它太难搞了,普通linux系统里,su一下,大概一切都搞定了,但是开启了SELinux的系统里。。。它不让我们做什么事,我们也只能不做了。于是,被剥夺了上帝视角的猴子们愤怒了。我们要杀掉这个奇怪的selinux。回正题,su之后依然会受到限制,这就是SELinux和SEAndroid的最大特点。在用户视角来看的最大特点。android系统秉承自linux的开源风格,大家都可以来挖挖漏洞,钻钻空子。在当前软件市场琳琅满目的root工具的攻击下,传统android系统获取root权限,简直已经是标配了。
      在普通的android系统中,主要依靠应用程序和内核两个层次的安全机制来保护系统安全。
      其中应用程序层的就是permission机制,也就是在AndroidManifest.xml里面配的那些permission。程序想要使用某些与系统相关的功能,比如,阅读短信,就需要在AndroidManifest.xml中申请相关的permission,否则会在运行时提示permissiondeny。
      一个权限包含权限名称(android:name)、权限标签(android:label)、权限图标(android:icon)、权限所属组(android:permissionGroup)、权限描述(android:description)、权限保护级别(android:protectionLevel)这六个方面的信息。其中,权限所属组(android:permissionGroup)用来标示该权限所属的权限组,这一属性是可选的。Android系统按照功能的不同,将权限划分成的不同的集合,每个集合称为一个权限组。此外,用户也可以自己定义权限组。权限保护级别(android:protectionLevel)用来标识保护级别,这一属性是必需的。Android系统中的权限保护级别包括Normal、Dangerous、 Signature和Signatureorsystem四种。根据不同的保护级别,程序在使用权限时需要采取不同的认证方式。Normal权限需要在程序开发过程中申请;Dangerous 权限需要在安装过程中获得用户许可;Signature 和Signatureorsystem权限比较特殊,它们牵涉到程序的数字签名。Signature权限需要该程序和声明引用权限的程序使用相同的数字签名;Signatureorsystem权限则表示将权限授予给具有相同数字签名的程序。
      内核层的就是传统的DAC(自主访问控制)。在Android中,使用自主访问控制来保护系统中资源的安全性。系统中的每个文件都拥有三组与权限相关的参数,这三组参数分别代表着文件拥有者、与拥有者同组的用户、系统中其他用户这三者对该文件的读、写、执行权限。这些权限通常使用三组rwx(read/write/execute)值表示。
drwxrwx---root    sdcard_r         2015-10-09 20:37 moplus
drwxrwx---root    sdcard_r         2015-10-13 21:17 msc
-rw-rw----root    sdcard_r 276723135 2015-11-17 11:38 normal.zip
drwxrwx---root    sdcard_r         2015-10-12 17:47 one.hh.oneclient
drwxrwx---root    sdcard_r         2015-11-02 18:38 qqmusic
drwxrwx---root    sdcard_r         2015-10-09 21:08 qqpim

     此外,每个应用程序在安装进Android系统时,都会分配到一个UID,这个UID在系统中固定且唯一。同时,系统会为每个应用程序创建一个沙箱(Sandbox),防止不同程序之间相互影响。在Android系统当中,除非使用SharedUID,或设定全局readable/writeable,否则程序不能互相访问对方的资源文件。
 USER    PID   PPID VSIZE RSS    WCHAN   PC       NAME
root     1    0    8912  820   ffffffff 00000000 S/init
root     229  1    9848  356   ffffffff 00000000 S/sbin/healthd
root     231  1    10560  1108  ffffffff 00000000 S/system/bin/lmkd
system   232  1    9468  688   ffffffff 00000000 S/system/bin/servicemanager
root     233  1    17948  1520  ffffffff 00000000 S/system/bin/vold
u0_a96   3741  256  1530212 45148 ffffffff 00000000 S com.sankuai.mtmp.push
u0_a6    3797  256  1593016 88856 ffffffff 00000000 S com.bbm
u0_a100   3873 256   1584704 54316 ffffffff00000000 S com.tencent.mm:push

      于是,在这两个普通的安全机制的普通保护下,普通的android系统就这么普通的运行着。一旦开启了root模式,大家一起上帝视角。


      SEAndroid运行在真。内核当中,它起作用的点,在DAC检测之后,也就是说,假如一个程序想要执行某个操作,这个动作首先要通过DAC检查,然后再通过SEAndroid的检查,然后才能执行。再换言之,即使获得了root权限,还是要守seandroid的规矩。
     SEAndroid对系统的保护,是藉由实现Linux安全模块(LSM)来实现的。这个模块,以可加载内核的形式加载到android系统当中。从下面的图来看,LSMhook了系统调用,在访问动作执行前,作为最后的一道防线。
概述----SEAndroid in Android 5.x_第1张图片
      SEAndroid实现了比DAC更加细致和深入的MAC(强制访问控制)。MAC将系统对象分为客体和主体两种。客体是指系统中的一切资源,如文件、目录以及端口等;主体指能够访问客体并对其进行操作的实体,在Android系统中,主要指运行中的进程等。系统中的所有客体和主体都拥有安全属性。同时,系统中存在一套预先制定好的策略来规定主体如何对客体进行操作。当主体试图对某个客体发起访问时,系统在执行操作前,先分别获取主体和客体的安全属性,并查询策略,按照策略的规定来判断访问操作是否可以执行。

      
      SEAndroid使用类型强制TE,系统中的所有客体和主体都拥有一个安全上下文作为自己的安全属性。同时,系统中存在一套预先制定好的策略来规定主体如何对客体进行操作。当主体试图对某个客体发起访问时,系统在执行操作前,先分别获取主体和客体的安全属性,并查询策略,按照策略的规定来判断访问操作是否可以执行。这样,访问控制就不再是基于用户身份了,而是基于进程的安全属性。使用SEAndroid,就可以将访问控制做到进程级别。
概述----SEAndroid in Android 5.x_第2张图片
根据上图,SEAndroid系统分为用户空间部分和内核部分。
其中,用户空间部分,主要包含三部分:
  1. Security Context,也就是主体和客体的安全上下文。
  2. SecurityServer,4个,其中PackageManagerService和installd负责创建应用数据目录的securitycontext,Zygote进程负责创建进程的security context,而init进程负责控制系统属性的安全访问。
  3. SEAndroid Policy,安全策略,这个策略将在系统运行时,加载到内核当中。
负责三件事:
  1. 查询主体客体应该使用什么安全上下文。
  2. 为主体和客体设置安全上下文。
  3. 将策略文件加载到内核当中。

而这些操作都是通过libselinux库中提供的方法来实现的。

      内核空间部分,就是SELinuxLSM模块。首先,SELinux会在LSM中注册相应的回调函数。其次,LSM会在相应的内核对象子系统中会加入一些Hook代码。例如,我们调用系统接口read函数来读取一个文件的时候,就会进入到内核的文件子系统中。在文件子系统中负责读取文件函数vfs_read就会调用LSM加入的Hook代码。这些Hook代码就会调用之前SELinux注册进来的回调函数,以便后者可以进行安全检查。

      SecurityServer模块,负责安全访问逻辑判断,也就是说,主体对客体是否有权执行操作,是由它来判断的。而判断的标准,就是被加载到内核当中的SEAndroidPolicy。当判断完成后,判断结果将被暂时保存到Access VectorCache当中,这样当下一次相同的访问来到时,系统会首先查询cache,当cache miss的时候,才去调用SecurityServer。


基本上,以上讲的东西都很理论性。下一篇开始讲SEAndroid具体内容。
     

你可能感兴趣的:(SEAndroid)