Android 安全增强功能 (SEAndroid)
Android 已经为 4.4 版 Android OS (“Kitkat”) 增加了一些新功能。 这些新功能的最重要变化是在强制模式下集成 SEAndroid 的能力,这意味着对所有 Android 组件的访问权限都处于 SEAndroid 的控制。
什么是 SEAndroid? SEAndroid 指的是 Android 安全增强功能,一款 Android 安全解决方案,可确定及解决关键性间隔问题。 最初,本计划旨在 Android 中使用 SELinux,以便限制有缺陷或恶意应用造成的损失,并强制隔离应用。 但是,该计划所涵盖的范围已更改,可在 SELinux 的基础上包含更多内容。 SEAndroid 目前是在 Android 上执行 SELinux 强制访问控制 (MAC) 和中间件强制访问控制 (MMAC) 的整体框架。
让我们澄清一些与 SEAndroid 相关的概念:
- 安全增强型 Linux* (SELinux) 是一种强制访问控制的实现。它的作法是以最小权限原则为基础,在 Linux 核心中使用 Linux 安全模块 (LSM)。 它并不是一款 Linux 发布版,而是一组可以应用在类 UNIX* 操作系统(如 Linux 和 BSD)的修改。
- 自主访问控制 (DAC) 是标准的 Linux 安全模型。 在此模型中,访问权限基于用户的身份和对象所有权。
- 强制访问控制 (MAC) 限制了主体(进程)和对象(文件、套接字和设备等)的权限。
SELinux 不会更改 Linux 环境中的任何现有的安全功能;相反,SELinux 扩展了安全模型,以便包括强制访问控制(如,在 SELinux 环境中强制执行 MAC 和 DAC)。
SEAndroid 通过向内核和用户空间添加 SELinux 支持来增强 Android 系统的安全性,实现了以下功能:
- 限制特权守护进程,确保其免受滥用,并尽可能减少通过特权守护进程所造成的损失。
- 采用沙箱机制并实现应用之间以及应用与系统的隔离
- 防止提升应用权限
- 支持在安装和运行时通过 MMAC 控制应用权限
- 提供了一项集中式可分析的策略
此外,在 Android 4.4 中,SEAndroid 是在强制模式下启用,而不是非功能禁用模式或仅通知的许可模式,这意味着在 Android 运行时环境中任何非法操作都将被禁止。
SEAndroid 策略
SEAndroid 策略是整个 SEAndroid 安全机制的一个核心。 此外,该安全架构还需要具有严格的安全策略,以确保访问主体只有最小的对象访问权限,这样程序就能执行基本功能,但将被阻止执行恶意操作。
如上所述,SEAndroid 是在强制模式下执行,而不是在非功能禁用模式或仅通知的许可模式,可用作参考内容并有助于执行测试和开发。
SEAndroid 的安全上下文与 SELinux 基本一致。 四个组成部分:用户、角色、类型和敏感度,即 u: object_r: system_data_file: s0说明如下:
- 用户: 在 SEAndroid 中第一列安全上下文是用户并且只有一个 u。
- 角色: 在 SEAndroid 中第二列表示角色,分别为 r和 object_r。
- 类型: 对于第三列类型,SEAndroid 确定了 139 项不同的策略类型,如设备类型、进程类型、文件系统类型、网络类型和 IPC 类型等等。
- 安全级别: 第四列专为多级安全功能(扩展 MLS)而设计,MLS 是一种访问机制,可增加安全上下文和格式敏感度
[:类别列表] [-敏感度[:类别列表]]
,例如s0 - s15: c0 - c1023
,而在当前 Android 版本中不需要类别。 敏感度和类别组合表示当前的安全级别,数字根据最低和最高级别的安全功能进行确定。 此列参数被用于查看 MLS 限制,其中“15”和“1023”表示最大敏感度和类别。 此参数范围可以在 Android.mk中进行确定。
安全上下文是第三列类型最重要的组成部分,并且进程类型被称为域。 类型是最重要的 SEAndroid 参数并且策略参数得到大幅扩展,因此所有标有相应类型的文件系统变得极其重要。
SEAndroid 策略源位于 external/sepolicy下方。
该策略包括用于生成 SELinux 核心策略文件的源文件:file_contexts配置、property_contexts配置、seapp_contexts配置和 mac_permissions.xml配置。
- file_contexts配置用于在构建(例如,系统分区)和运行时(例如,设备节点、服务套接字文件和由 init.rc 创建的/数据目录等)标记文件。
- property_contexts被用于指定 Android 属性的安全上下文,供查看权限。
- seapp_contexts配置被用于标记应用进程和应用程序包目录。
- mac_permissions.xml配置是中间件 MAC 策略。
特定于设备的策略源位于 device/<vendor>/<device>下方。
- 可通过定义 device/<vendor>/<device>或 vendor/<vendor>/<device> 目录下方的 BoardConfig.mk 文件中的 BOARD_SEPOLICY_DIRS、BOARD_SEPOLICY_UNION或 BOARD_SEPOLICY_REPLACE变量来指定特定于设备的策略,即英特尔® 凌动™ 处理器平板电脑(代号 Bay Trail)FFRD8 的配置文件是 “/device/intel/baytrail/BoardConfig.mk”。
- 您可以在 device/intel/baytrail/BoardConfig.mk中查看相关示例,后者定义了这些变量,以便引用 device/intel/baytrail/sepolicy下方特定于设备的策略文件。
- 您可以在 external/sepolicy/README中找到每台设备的策略文档。
更改 SEAndroid 策略
SEAndroid 策略文件位于 /external/sepolicy下方。 您可以更改这些策略文件,了解应用新策略后会出现什么情况。 更改策略文件时要十分仔细,因为错误的配置会导致整个系统在启动过程中停止响应。 以下是一个示例:
第一步: 先查看,再修改
首先,我们需要查看 “/device/intel/baytrail/BoardConfig.mk”文件。 本主板的 sepolicy 配置如下:
BOARD_SEPOLICY_DIRS := device/intel/baytrail/sepolicy BOARD_SEPOLICY_UNION := file_contexts seapp_contexts file.te genfs_contexts fs_use device.te healthd.te app.te untrusted_app.te surfaceflinger.te vold.te ecryptfs.te zygote.te netd.te
BOARD_SEPOLICY_DIRS确定了特定于设备的策略文件所在的目录。 BOARD_SEPOLICY_UNION意味着最终策略配置是一般策略文件和特定于设备的策略文件的组合结果。 在 Android 的构建过程中,构建系统将检查不同策略之间的冲突。 如果应用了 BOARD_SEPOLICY_ REPLACE,这意味着特定于设备的策略将替换一般策略的配置。
其次,我们需要打开 “/external/sepolicy/untrusted_app.te”文件,并查看是否显示以下两行内容:
Allow untrusted_app shell_data_file:file rw_file_perms Allow untrusted_app shell_data_file:dir r_dir_perms
上述两项策略为不信任应用(正常应用,不是系统应用)提供了在运行环境下读写文件和读取 shell_data_file类型目录的权限。 在运行环境下,shell_data_file将指向 /data/local/tmp/中的任意文件,这在开发环境下的 /external/sepolicy/file_contexts中得到了定义,如下所示:
/data/local/tmp(/.*)? u:object_r:shell_data_file:s0
但是,上述权限存在一些局限。 如果这些文件和目录位于 /data/loacal/tmp/中,则不信任的应用可以读/写这些文件,并进入这些目录。 但不信任的应用无法在 /data/local/tmp/下方创建自己的文件和目录。 只有系统应用或服务可以为不信任的应用创建文件或目录。 如果我们要给予不信任的应用更多的权限,则我们可以执行第 2 步中描述的更改。
第二步: 添加新策略
现在我们可以编辑 “/device/intel/baytrail/sepolicy/untrusted_app.te”文件,并将以下两行内容添加至文件末尾:
Allow untrusted_app shell_data_file:file create_file_perms Allow untrusted_app shell_data_file:dir create_dir_perms
在运行环境中,这两项为不信任的应用在 /data/local/tmp/中创建文件和目录提供了权限,这在以下开发环境下的 /external/sepolicy/file_contexts中得到了定义:
/data/local/tmp(/.*)? u:object_r:shell_data_file:s0
基本文件/目录的权限在 /external/sepolicy/global_macros中得到了定义:
define(`x_file_perms', `{ getattr execute execute_no_trans }') define(`r_file_perms', `{ getattr open read ioctl lock }') define(`w_file_perms', `{ open append write }') define(`rx_file_perms', `{ r_file_perms x_file_perms }') define(`ra_file_perms', `{ r_file_perms append }') define(`rw_file_perms', `{ r_file_perms w_file_perms }') define(`rwx_file_perms', `{ rw_file_perms x_file_perms }') define(`link_file_perms', `{ getattr link unlink rename }') define(`create_file_perms', `{ create setattr rw_file_perms link_file_perms }') 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 }') define(`create_dir_perms', `{ create reparent rmdir setattr rw_dir_perms link_file_perms }')
我们可以看出,这些权限,如文件操作“{ getattr open read ioctl lock }”与真实文件系统中的文件操作功能一样。
最后,我们需要重建 Android 源树并将新映像刷新至 Bay Trail FFRD8 设备中。
验证 SEAndroid 策略
启动 FFRD8 之后,我们可以从“Android 应用商店”下载一款文件管理器应用,然后从文件管理器菜单中打开命令 shell。 这样,我们就可以效仿不信任的应用执行文件操作的状态。
新文件和新目录可以通过打开 /data/local/tmp/目录进行创建。 (使用标准 FFRD8 设备后,创建新文件和新目录被禁止。) 以下对比图显示了不同策略的结果,左图显示了未更改策略的结果,右图显示了已更改策略的结果:
图 1: 标准策略与已更改策略之间的文件权限对比
总结
本文介绍了 SEAndroid 策略的基本概念,并演示了如何根据英特尔凌动处理器平台(代号“Bay Trail”),将新策略添加至 SEAndroid 策略集。 这将帮助有志于定制 SEAndroid 的 ODM 初步了解 SEAndroid 策略机制。
关于作者
Liang Z. Zhang 现任英特尔中国开发人员关系部门的应用工程师,负责帮助企业应用开发人员使用基于英特尔® 平台的安全技术。
声明
本文件中包含关于英特尔产品的信息。 本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。 除英特尔产品销售的条款和条件规定的责任外,英特尔不承担任何其他责任。英特尔在此作出免责声明:本文件不构成英特尔关于其产品的使用和/或销售的任何明示或暗示的保证,包括不就其产品的(i)对某一特定用途的适用性、(ii)适销性以及(iii)对任何专利、版权或其他知识产权的侵害的承担任何责任或作出任何担保。
除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。
英特尔有权随时更改产品的规格和描述而毋需发出通知。 设计者不应信赖任何英特产品所不具有的特性,设计者亦不应信赖任何标有“保留权利”或“未定义”说明或特性描述。 对此,英特尔保留将来对其进行定义的权利,同时,英特尔不应为因其日后更改该等说明或特性描述而产生的冲突和不相容承担任何责任。 此处提供的信息可随时改变而毋需通知。 请勿根据本文件提供的信息完成一项产品设计。
本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。 这些缺陷或失误已收录于勘误表中,可索取获得。
在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。
索取本文件中或英特尔的其他材料中提的、包含订单号的文件的复印件,可拨打 1-800-548-4725,或登录 http://www.intel.com/design/literature.htm
在性能检测过程中涉及的软件及其性能只有在英特尔微处理器的架构下方能得到优化。 诸如 SYSmark 和 MobileMark 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能, 上述任何要素的变动都有可能导致测试结果的变化。 请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。
对本文件中包含的软件源代码的提供均依据相关软件许可而做出,任何对该等源代码的使用和复制均应按照相关软件许可的条款执行。