65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 SEAndroid 进行 Android* 安全性定制

2014 年 8 月 14 日

CPOL

10分钟阅读

viewsIcon

34008

SEAndroid 指的是 Android 安全增强功能,是一种用于识别和解决关键安全漏洞的 Android 安全解决方案。

Android 安全增强功能 (SEAndroid)

Android 在 Android OS 的 4.4 版本 ("Kitkat") 中增加了一些新功能。新功能中最重要的是能够以强制模式集成 SEAndroid,这意味着所有 Android 组件的访问权限都受 SEAndroid 控制。

什么是 SEAndroid?SEAndroid 指的是 Android 安全增强功能,是一种用于识别和解决关键安全漏洞的 Android 安全解决方案。最初,该项目的范围是启用 SELinux 在 Android 中使用,以限制有缺陷或恶意应用程序造成的损害,并强制执行应用程序之间的隔离保证。然而,项目的范围发生了变化,不仅仅包括 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 中的 **user**,并且唯一的是 **u**。
  • 角色:第二列指示 SEAndroid 中的 **role**,分别是 **r** 和 **object_r**。
  • 类型:对于第三列的类型,SEAndroid 定义了 139 种不同的策略类型,例如 **设备类型**、**进程类型**、**文件系统类型**、**网络类型**、**IPC 类型** 等。
  • 安全级别:第四列专为多级别安全(扩展 MLS)设计,它是用于添加安全上下文和格式化敏感性的访问机制 **[: category list] [- sensitivity [: category list]]**,例如 **s0 - s15: c0 - c1023**,而类别在当前的 Android 版本中可能不是必需的。敏感性和类别组合在一起声明了当前的安全级别,数字用于识别最低和最高安全级别的范围。此列的参数用于 MLS 约束检查,“15”和“1023”分别代表最大敏感性和类别。此参数范围可以在 Android.mk 中定义。

安全上下文是第三列类型中最重要的部分,进程类型称为 **domain**。**Type** 是 SEAndroid 参数中最重要的一部分,策略参数大大扩展,因此为每个带有适当类型标记的文件设置系统变得极其重要。

SEAndroid 策略源文件位于 external/sepolicy 目录下。

该策略包括用于生成 SELinux 内核策略文件的源文件、一个 file_contexts 配置文件、一个 property_contexts 配置文件、一个 seapp_contexts 配置文件以及一个 mac_permissions.xml 配置文件。

  • file_contexts 配置文件用于在构建时(例如,系统分区)和运行时(例如,设备节点、服务套接字文件、init.rc 创建的 /data 目录等)标记文件。
  • property_contexts 配置文件用于指定 Android 属性的安全上下文,以用于权限检查。
  • seapp_contexts 配置文件用于标记应用程序进程和应用程序包目录。
  • mac_permissions.xml 配置文件是中间件 MAC 策略。

特定于设备的策略源文件位于 **device/<vendor>/<device>** 目录下。

  • 可以通过在 **device/<vendor>/<device>** 或 **vendor/<vendor>/<device> 目录** 下的 **BoardConfig.mk 文件** 中定义 BOARD_SEPOLICY_DIRSBOARD_SEPOLICY_UNION 和/或 BOARD_SEPOLICY_REPLACE 变量来指定特定于设备的策略,例如基于 Intel® Atom™ 处理器(代号为 Bay Trail)的平板电脑 FFRD8 的配置文件是“/device/intel/baytrail/BoardConfig.mk”。
  • device/intel/baytrail/BoardConfig.mk 中可以找到一个示例,该示例定义了这些变量以引用 device/intel/baytrail/sepolicy 下的特定于设备的策略文件。
  • 有关每个设备策略的文档可以在 external/sepolicy/README 中找到。

修改 SEAndroid 策略

SEAndroid 策略文件位于 /external/sepolicy 目录下。您可以修改这些策略文件,看看应用新策略后会发生什么。请在修改策略文件时密切注意,因为错误的配置可能导致整个系统在启动时崩溃。示例如下

步骤 1:修改前检查

首先,我们需要检查文件“/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 中描述的更改。

步骤 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 应用商店下载一个 FileManager 应用程序,然后从 FileManager 菜单打开命令 shell。这使我们能够模拟不受信任的应用程序执行文件操作的条件。

通过进入 /data/local/tmp/ 目录并创建新文件和新目录,可以创建新文件和新目录。(对于标准的 FFRD8 设备,禁止创建新文件和新目录。)不同策略的结果显示在下面的比较图中,左侧的图表显示了未更改策略的结果,右侧的图表显示了已更改策略的结果

图 1:标准策略和已更改策略之间的文件权限比较

摘要

本文介绍了 SEAndroid 策略的基本概念,并以基于 Intel Atom 处理器平台(代号为 Bay Trail)为例,展示了如何向 SEAndroid 策略集添加新策略。这将有助于有兴趣定制构建 SEAndroid 的 ODM 对 SEAndroid 策略机制有一个初步的了解。

关于作者

Liang Z. Zhang 是 Intel PRC 开发者关系部门的应用工程师,负责支持企业应用开发者在 Intel® 平台上启用安全技术。

注意事项

本文档中的信息是根据英特尔产品提供的。本文档不授予任何明示或暗示的、通过禁止反悔或其他方式授予的知识产权许可。除英特尔此类产品的销售条款和条件中另有规定外,英特尔不承担任何责任,并在此声明不提供与英特尔产品销售和/或使用相关的任何明示或暗示的保证,包括对特定用途的适用性、适销性或侵犯任何专利、版权或其他知识产权的保证。

除非 Intel 书面同意,否则 Intel 产品不设计也不用于任何可能导致人员伤亡的应用程序。

英特尔可随时更改规格和产品说明,恕不另行通知。设计者不得依赖任何标记为“保留”或“未定义”的功能或说明的缺失或特性。英特尔保留这些用于未来定义的权利,对于因其未来更改而引起的任何冲突或不兼容性,英特尔概不负责。此处的信息如有更改,恕不另行通知。请勿使用此信息来最终确定设计。

本文档中描述的产品可能包含已知为勘误的设计缺陷或错误,这可能导致产品偏离已发布的规范。当前的已表征勘误可应要求提供。

请联系您当地的英特尔销售办事处或您的经销商以获取最新的规范,并在下订单前进行咨询。

可通过致电 1-800-548-4725 或访问 http://www.intel.com/design/literature.htm 获取订购号并在此文档中引用的文件副本,或其他英特尔文献。

性能测试中使用的软件和工作负载可能已针对在英特尔微处理器上的性能进行了优化。性能测试,例如 SYSmark* 和 MobileMark*,是使用特定的计算机系统、组件、软件、操作和功能测量的。对任何这些因素的任何更改都可能导致结果有所不同。您应参考其他信息和性能测试,以协助您全面评估您打算购买的产品,包括该产品与其他产品结合使用时的性能。

本文档中重印的任何软件源代码均根据软件许可证提供,并且只能根据该许可证的条款使用或复制。

© . All rights reserved.