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

本文介绍了SEAndroid在Android 5.x中的关键组件和工作流程,包括Security Context的设置、SecurityServer的角色、SEAndroid Policy的加载以及内核空间中的SELinux LSM模块。SecurityServer负责权限判断,其依据是加载到内核的安全策略,内核通过LSM的Hook代码进行安全检查。Access Vector Cache用于提升后续相同访问的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

            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                      8912    820    ffffffff 00000000 S/init
root          229          9848    356    ffffffff 00000000 S/sbin/healthd
root          231          10560  1108  ffffffff 00000000 S/system/bin/lmkd
system      232          9468    688    ffffffff 00000000 S/system/bin/servicemanager
root          233          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实现了比DAC更加细致和深入的MAC(强制访问控制)。MAC将系统对象分为客体和主体两种。客体是指系统中的一切资源,如文件、目录以及端口等;主体指能够访问客体并对其进行操作的实体,在Android系统中,主要指运行中的进程等。系统中的所有客体和主体都拥有安全属性。同时,系统中存在一套预先制定好的策略来规定主体如何对客体进行操作。当主体试图对某个客体发起访问时,系统在执行操作前,先分别获取主体和客体的安全属性,并查询策略,按照策略的规定来判断访问操作是否可以执行。

           
            SEAndroid使用类型强制TE,系统中的所有客体和主体都拥有一个安全上下文作为自己的安全属性。同时,系统中存在一套预先制定好的策略来规定主体如何对客体进行操作。当主体试图对某个客体发起访问时,系统在执行操作前,先分别获取主体和客体的安全属性,并查询策略,按照策略的规定来判断访问操作是否可以执行。这样,访问控制就不再是基于用户身份了,而是基于进程的安全属性。使用SEAndroid,就可以将访问控制做到进程级别。

根据上图,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具体内容。
         
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值