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

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

2014 年 11 月 17 日

CPOL

10分钟阅读

viewsIcon

8835

SEAndroid 现已成为在 Android 上实现 SELinux 强制访问控制 (MAC) 和中间件强制访问控制 (MMAC) 的整体框架。

Android 安全增强 (SEAndroid)

Android 在 Android OS 的 4.4 版本(“奇巧”)中添加了一些新功能。新功能中最重要的变化是能够以强制模式集成 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,即 robject_r
  • 类型:对于第三列类型,SEAndroid 定义了 139 种不同的策略类型,例如设备类型进程类型文件系统类型网络类型IPC 类型等等。
  • 安全级别:第四列专为多级安全 (MLS 扩展) 设计,它是一种添加安全上下文和格式敏感度 [: 类别列表] [- 敏感度 [: 类别列表]] 的访问机制,例如 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/local/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 应用商店下载一个文件管理器应用,然后从文件管理器菜单中打开命令 shell。这使我们能够模拟非信任应用执行文件操作的情况。

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

图 1:标准策略与更改策略的文件权限对比

摘要

本文介绍了 SEAndroid 策略的基本概念,并提供了一个如何在基于英特尔凌动处理器平台(代号 Bay Trail)的 SEAndroid 策略集中添加新策略的示例。它将帮助对定制 SEAndroid 感兴趣的 ODM 对 SEAndroid 策略机制有一个初步了解。

关于作者

梁志章是英特尔中国区开发者关系部门的应用工程师,负责支持企业应用开发者在英特尔®平台上启用安全技术。

注意事项

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

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

英特尔可随时更改规格和产品说明,恕不另行通知。设计人员不得依赖标记为“保留”或“未定义”的任何功能或指令的缺失或特性。英特尔保留这些功能和指令以供将来定义,对于将来更改这些功能和指令所引起的冲突或不兼容性,英特尔不承担任何责任。此处的信息如有更改,恕不另行通知。请勿根据此信息完成设计。

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

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

具有订单号且本文档中引用的文档或其他英特尔资料的副本可通过致电 1-800-548-4725 或访问以下网站获取:http://www.intel.com/design/literature.htm

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

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

© . All rights reserved.