作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程(甚至是使用 root/超级用户权限(Linux 功能)运行的进程)强制执行强制访问控制 (MAC)。许多公司和组织为 Android 的 SELinux 实现做出了贡献。借助 SELinux,Android 可以更好地保护和限制系统服务,控制对应用数据和系统日志的访问,减少恶意软件的影响,并保护用户免受移动设备上代码中潜在缺陷的影响。
SELinux 基于默认拒绝原则运行:任何未明确允许的操作都会被拒绝。SELinux 可以在两种全局模式下运行
- 宽容模式,在这种模式下,权限拒绝会被记录但不会强制执行。
- 强制执行模式,在这种模式下,权限拒绝会被记录并强制执行。
Android 包括强制执行模式下的 SELinux 以及默认情况下在整个 AOSP 中工作的相应安全策略。在强制执行模式下,不允许的操作会被阻止,并且所有尝试的违规行为都会被内核记录到 dmesg
和 logcat
中。在开发过程中,您应该在强制执行这些错误之前使用这些错误来改进您的软件和 SELinux 策略。有关更多详情,请参阅实施 SELinux。
SELinux 还支持按域宽容模式,在这种模式下,可以使特定域(进程)处于宽容模式,同时将系统的其余部分置于全局强制执行模式。域只是一个标签,用于标识安全策略中的进程或进程集,其中所有标记有相同域的进程都受到安全策略的相同对待。按域宽容模式允许将 SELinux 增量应用到系统中越来越多的部分,并为新服务开发策略(同时保持系统其余部分的强制执行)。
背景
Android 安全模型部分基于应用沙盒的概念。每个应用都在其自己的沙盒中运行。在 Android 4.3 之前,这些沙盒是通过在安装时为每个应用创建唯一的 Linux UID 来定义的。Android 4.3 及更高版本使用 SELinux 来进一步定义 Android 应用沙盒的边界。
在 Android 5.0 及更高版本中,SELinux 已完全强制执行,这建立在 Android 4.3 的宽容发布和 Android 4.4 的部分强制执行的基础上。通过此更改,Android 从对有限的关键域(installd
、netd
、vold
和 zygote
)强制执行转变为对所有内容(超过 60 个域)强制执行。具体来说
- 在 Android 5.x 及更高版本中,所有内容都处于强制执行模式。
- 除
init
之外的任何进程都不应在init
域中运行。 - 任何通用拒绝(对于
block_device
、socket_device
、default_service
)都表明设备需要一个特殊域。
Android 6.0 通过降低我们策略的宽容度来加强系统,包括更好的用户隔离、IOCTL 过滤、减少暴露服务的威胁、进一步收紧 SELinux 域以及极其有限的 /proc
访问。
Android 7.0 更新了 SELinux 配置,以进一步锁定应用沙盒并减少攻击面。此版本还将整体式 mediaserver 堆栈分解为更小的进程,以减少其权限范围。有关更多详情,请参阅使用更多 Linux 内核防御来保护 Android 和 强化媒体堆栈。
Android 8.0 更新了 SELinux 以与 Treble 配合使用,Treble 将较低级别的供应商代码与 Android 系统框架分开。此版本更新了 SELinux 策略,以允许设备制造商和 SOC 供应商更新其策略部分,构建其映像(vendor.img
、boot.img
等),然后独立于平台或反之亦然地更新这些映像。
虽然有可能在设备上运行更高版本/更新的平台(框架)版本,但不支持相反的情况;供应商映像(vendor.img/odm.img
)的版本不能高于平台(system.img
)。因此,较新的平台版本可能会引入 SELinux 兼容性问题,因为平台 SELinux 策略的版本比策略的供应商 SELinux 部分的版本更新。Android 8.0 模型提供了一种保持兼容性的方法,以防止不必要的同步 OTA。
其他资源
如需构建有用的 SELinux 策略方面的帮助,请参阅以下资源。
- SELinux 笔记本,SELinux 的最新参考。本文档包含有关策略语言、每个关键字的含义以及安全上下文如何计算的更多详情。
- SELinux 策略实施的可视化操作指南
- Linux 安全增强功能
- 安全增强型 (SE) Android:为 Android 带来灵活的 MAC
- 将 SELinux 实施为 Linux 安全模块
- 配置 SELinux 策略