SE for Android 系列之整体概要(二)

所支持的MAC服务

MAC和MMAC功能概述:

  • 标准的SELinux MAC 策略是基于type enforcement(TE,即类型强制访问)/ multi-level security (MLS,即多级别安全机制),也可以理解为是一种白名单机制;
  • Install MMAC策略中的package和signature标签支持通过setinfo标签,来指定应用的context(安全上下文,指运行时domain)。该策略只对预装应用生效,而第三方的应用则无法通过这种方式指定,所有的第三方应用都只能由<default>标签匹配,而且seinfo的值为“default”。(译者注,这里会让你看得头晕,建议找到mac_permissions.xml文件对着看)
    • SEAndroid Install MMAC策略还能能够检查应用所申请的权限列表是否被允许。如果不允许,那么该应用就不能够安装。另外如果这款应用已经安装在手机上了,后来策略更新并与其产生冲突了,那么这款应用也不能运行。配置文件允许的动作有:allow(允许),deny(拒绝)和allow all permissions(允许所有权限)。 检查流程如下:
      • 安装或升级第三方应用时,它的权限列表都被会检查。如果在<default>里存在任意一项不被允许的权限,那么该应用安装或升级过程就会失败;
      • 预装的应用,他们的升级过程,系统也会去做一次权限检查。如果在package或者signature标签存在不允许的权限,更升级失败。如果存在某个权限,在package或者signature标签中没有显式声明为allow,而在default标签中声明为deny的话,升级过程同样会失败;
  • Intent MMAC策略的作用是决定Intent是否能够被分发到其他几种组件。策略会屏蔽掉所有没有被定义为允许的Intent分发。这是一个可选的策略,并不需要定制的SELinux策略支持,不过它可以对“主体”的安全上下文进行合法性校验。
  • Content Provider MMAC策略作用是决定content provider的访问请求是否被允许。策略会屏蔽掉所有没有被定义为允许的访问请求。目前的版本支持use, read, read/write三种权限。这是一个可选的策略,并不需要定制的SELinux策略支持。
  • Revoke permissions策略的作用是决定权限在运行过程中是否会被检查,如果权限被撤消了那么权限就会变成denied状态(也就是说,除了指定的权限会被变成denied,其他的权限都是允许的)。这是一个可选的策略,并不需要定制的SELinux策略支持。


Android为支持MAC所引入的变化

SE for Android为Android的内核增加了SELinux的支持,同时在用户空间也实现了如下几方面的目标:

  1. 定义所有具有特权守护进程,以防止权限被滥用以及把它们的破坏降到最低;
  2. 构造沙箱,使应用与应用和系统之间互相隔离;
  3. 防止应用提权;
  4. 利用MMAC策略,使应用的权限在安装和运行的过程中变得可控;
  5. 提供一种集中的、可分析的策略;
这些目标是由下列改措实现的:
  • 实现了yaffs2文件系统的安全标注;
  • 文件系统镜像文件(yaffs2和ext4)编译时标注;
  • 为recovery console和程序更新器提供标注功能;
  • 基于内核的Binder IPC权限检测;
  • 实现对由init进程所产生的服务端套接字(service sockets)和本地套接字文件(socket files)的标注功能;
  • 实现对由ueventd进程所产生的设备节点(device nodes)的标注功能;
  • 为应用和应用数据文件夹提供灵活易配置的标注功能;
  • 最小化SELinux用户空间的可用端口;
  • 提供了JNI方式的SELinux接口;
  • 为Zygote socket commands的使用提供了用户空间级别的权限检查;
  • 为Android properties的使用提供了用户空间级别的权限检查;
  • 专门针对Android编写了TE策略文件;
  • 为所有系统服务和应用定义domain;
  • 利用MLS类别隔离应用;
SE 对Android项目的变动
  • external/libselinux
提供了SELinux用户空间的函数库并集成到设备上。该库在原版本的基本上为适应Android而增加了一列的函数,如下所示:
  • selinux_android_setcontext
利用这个函数可以为应用设置正确的domain上下文,它会利用保存在seapp_contexts文件里的信息计算出正确的上下文。如果是在初始化阶段,这个函数也会调用selinux_android_seapp_context_reload加载seapp_contexts文件并对里面的每一项进行排序,详细过程见"seapp_contexts文件"一节。
该函数会被dalvik/vm/native/dalvik-system-Zygote.cpp和system/core/run-as/run-as.c调用。
  • selinux_android_setfilecon2
利用这个函数可以为应用文件夹和文件设置正常的上下文,它会利用保存在seapp_contexts文件里的信息计算出正确的上下文。如果是在初始化阶段,这个函数也会调用selinux_android_seapp_context_reload加载seapp_contexts文件并对里面的每一项进行排序,详细过程见"seapp_contexts文件"一节。
当安装应用时,该函数会被frameworks/base/cmds/installd/commands.c调用。
  • selinux_android_restorecon
利用这个函数可以让文件的上下文恢复成file_contexts文件里初始配置。该函数在初始经和安装等过程过程中会被多处调用。
  • selinux_android_load_policy
如果SELinux是开启的话,利用该函数可以加载SELinux文件系统,并通过调用selinux_android_reload_policy把策略文件加载到内核。
  • selinux_android_reload_policy
加载策略文件进内核。该函数会被system/core/init.c调用。
  • external/libsepol
提供了用户空间的策略工具库。这部分代码跟SELinux是一样的,而且不会集成到设备上。
  • external/checkpolicy
提供了策略构造工具。这部分代码跟SELinux是一样的,而且也不会集成到设备上(因此策略的构造必须在主机开发环境中进行)。
  • external/sepolicy
这个SE for Android特有的部分,里面包含各种策略模块(*.te文件),class/permissoin文件等等。所有策略模块依据Android.mk文件进行构造的,最终会连同其他配置文件(file_contexts, seapp_contexts和property_contexts)一起集成到设备上(编译成sepolicy文件)。也有一些工具可以根据不同的设备进行策略补充,这部分会在“策略构建”一节详细描述。
策略文件的在“SELinux MAC配置文件”一节进行详细描述。相关的工具也会在“策略构建工具”一节有详细的描述。
这里也包含了关于SE for Android的类定义,详细可以查看“SE for Android 的类和权限”一节。
这个文件夹也包含了Install MMAC、Intent MMAC、Content Permission MMAC策略,如果有配置的话,请参考“ SE for Android 系列之整体概要(一)”中的“ SE for Android的项目编译”一节。
  • external/mac-policy
这里包含revoke permission的策略配置文件(revoke_permission.xml),利用这种策略可以让Android的权限动态撤消。 如果项目选项选择revoke_perms的话,就会包含这个文件夹。
  • build
针对SE for Android进行修改。
  • dalvik
当进程被fork后,会使用selinux_android_setcontext进行domain上下文设置。
  • libcore
Zygote.java里添加了setInfo和niceName两种传入参数(译者注,应该是zygote command命令里添加了--setInfo和--niceName两种配置)
  • frameworks/base
    • JNI——添加了SELlinux的函数支持,如isSELinuxEnabled和setFSCreateCon。
    • SELinux 的Java类和方法的定义。
    • Zygote连接者的安全上下文检查。
    • 为package manager和各种service提供文件权限的管理(译者注,这里不太明白)
    • 添加MMAC框架
  • system/core
    • 支持SELinux的toolbox,比如load_policy, runcon
    • 支持SELinux的系统初始化,比如init,init.rc
    • 支持SELinux的核审服务(audittd)
  • system/extras
支持SELinux的ext4文件系统
  • kernel
已经有多个内核增加了LSM和SELinux支持,详细可以查看SEforAndroid - Building for a Device.
Android的内核存在多个版本(目前是3.4,模拟器使用的是Goldfish),因此最新版本的SELinux一般还没有集成到SEforAndroid。在“内核LSM和SELinux的支持”一节里,会详细说明内核的变化。

  • device

关于支持设备的详情情况,可以查看SEforAndroid - Building for a Device

可以修改设备的配置文件定制策略文件,详细见“构建策略文件”一节

你可能感兴趣的:(SE for Android 系列之整体概要(二))