Android 中的安全增强型 Linux

作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程(甚至是使用 root/超级用户权限(Linux 功能)运行的进程)强制执行强制访问控制 (MAC)。许多公司和组织为 Android 的 SELinux 实现做出了贡献。借助 SELinux,Android 可以更好地保护和限制系统服务,控制对应用数据和系统日志的访问,减少恶意软件的影响,并保护用户免受移动设备上代码中潜在缺陷的影响。

SELinux 基于默认拒绝原则运行:任何未明确允许的操作都会被拒绝。SELinux 可以在两种全局模式下运行

  • 宽容模式,在这种模式下,权限拒绝会被记录但不会强制执行。
  • 强制执行模式,在这种模式下,权限拒绝会被记录强制执行。

Android 包括强制执行模式下的 SELinux 以及默认情况下在整个 AOSP 中工作的相应安全策略。在强制执行模式下,不允许的操作会被阻止,并且所有尝试的违规行为都会被内核记录到 dmesglogcat 中。在开发过程中,您应该在强制执行这些错误之前使用这些错误来改进您的软件和 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 从对有限的关键域(installdnetdvoldzygote)强制执行转变为对所有内容(超过 60 个域)强制执行。具体来说

  • 在 Android 5.x 及更高版本中,所有内容都处于强制执行模式。
  • init 之外的任何进程都不应在 init 域中运行。
  • 任何通用拒绝(对于 block_devicesocket_devicedefault_service)都表明设备需要一个特殊域。

Android 6.0 通过降低我们策略的宽容度来加强系统,包括更好的用户隔离、IOCTL 过滤、减少暴露服务的威胁、进一步收紧 SELinux 域以及极其有限的 /proc 访问。

Android 7.0 更新了 SELinux 配置,以进一步锁定应用沙盒并减少攻击面。此版本还将整体式 mediaserver 堆栈分解为更小的进程,以减少其权限范围。有关更多详情,请参阅使用更多 Linux 内核防御来保护 Android强化媒体堆栈

Android 8.0 更新了 SELinux 以与 Treble 配合使用,Treble 将较低级别的供应商代码与 Android 系统框架分开。此版本更新了 SELinux 策略,以允许设备制造商和 SOC 供应商更新其策略部分,构建其映像(vendor.imgboot.img 等),然后独立于平台或反之亦然地更新这些映像。

虽然有可能在设备上运行更高版本/更新的平台(框架)版本,但不支持相反的情况;供应商映像(vendor.img/odm.img)的版本不能高于平台(system.img)。因此,较新的平台版本可能会引入 SELinux 兼容性问题,因为平台 SELinux 策略的版本比策略的供应商 SELinux 部分的版本更新。Android 8.0 模型提供了一种保持兼容性的方法,以防止不必要的同步 OTA。

其他资源

如需构建有用的 SELinux 策略方面的帮助,请参阅以下资源。