2. Android 安全架构概览:沙箱机制、权限模型与 SELinux 的关系

Android 的安全架构并非单一技术,而是由多层防御机制构成的纵深防御体系。理解这一体系是配置 SELinux 策略的前提。本章将剖析 Android 沙箱机制、权限模型以及 SELinux 强制访问控制三者如何协同工作,构建从应用层到内核层的完整安全屏障。

2.1 Android 沙箱机制:进程隔离的基石

Android 沙箱的核心思想是“最小权限原则”——每个应用默认只能访问自己的私有数据,无法干扰其他应用或系统。这一机制在 Linux 内核层面通过 UID(用户标识符)和进程隔离实现。

  • UID 分配:安装应用时,系统为其分配一个唯一的 Linux 用户 ID(UID)。应用进程运行在该 UID 下,拥有独立的进程空间和文件系统权限。
  • 文件系统隔离:应用私有目录(/data/data/<package>)的权限仅对该 UID 开放,其他 UID 无法读取。
  • 进程间通信(IPC)限制:默认情况下,不同 UID 的进程无法通过标准 Linux IPC 机制(如信号量、共享内存)直接通信,必须通过 Binder 框架进行受控交互。
关键理解:沙箱机制是 Android 安全的第一道防线。即使应用被攻破,攻击者也无法直接访问其他应用的数据或系统核心服务,除非存在内核漏洞或配置错误。
Android 沙箱机制:UID 隔离与进程隔离 Android 沙箱机制:UID 隔离与进程隔离 应用 A 沙箱 UID: 10001 进程 PID: 1234 私有目录: /data/data/com.app.a 应用 B 沙箱 UID: 10002 进程 PID: 5678 私有目录: /data/data/com.app.b 系统服务沙箱 UID: system (1000) 进程 PID: 789 系统目录: /system/bin/ Linux 内核隔离层:不同 UID 进程无法直接访问对方内存或文件

2.2 Android 权限模型:应用层访问控制

沙箱机制解决了进程隔离问题,但应用仍需要访问系统资源(如摄像头、联系人、网络)。Android 权限模型在应用层提供了细粒度的授权管理。

权限类型 保护级别 授权方式 示例
普通权限 normal 安装时自动授予 INTERNET、ACCESS_NETWORK_STATE
危险权限 dangerous 运行时弹窗请求 CAMERA、READ_CONTACTS
签名权限 signature 仅同签名应用可获取 BIND_ACCESSIBILITY_SERVICE
特权权限 privileged 仅系统应用可声明 INSTALL_PACKAGES
权限模型与沙箱的协作:沙箱提供“进程隔离”,权限模型提供“资源授权”。应用必须先通过沙箱隔离,再通过权限检查,才能访问受保护资源。例如,即使应用拥有 CAMERA 权限,也无法直接读取其他应用的私有文件。

2.3 SELinux 在 Android 中的角色:从 DAC 到 MAC

传统的 Linux 权限模型(DAC,自主访问控制)依赖 UID 和文件权限位(rwx)。但 DAC 存在根本缺陷:root 用户拥有无限权限,一旦进程被提权,整个系统将沦陷。SELinux 引入 MAC(强制访问控制),为每个进程和对象打上安全上下文标签,由内核强制实施策略规则。

  • DAC 的局限:root 用户可绕过所有文件权限检查;SUID 程序存在提权风险。
  • MAC 的优势:即使进程以 root 运行,SELinux 策略仍可限制其行为;策略由系统定义,应用无法修改。
  • Android 中的 SELinux 模式:
    • Enforcing(强制模式):拒绝违规操作并记录 avc 审计日志。
    • Permissive(宽容模式):仅记录违规操作,不拒绝(用于调试)。
    • Disabled(禁用):关闭 SELinux(生产环境严禁使用)。
实战警告:在 Android 内核开发中,切勿在生产版本中将 SELinux 设为 Permissive 或 Disabled。即使系统功能正常,也意味着安全防线已失效。所有策略调整必须在 Enforcing 模式下验证。
Android 安全架构:三层防御体系 Android 安全架构:三层防御体系 第一层:应用层权限模型 AndroidManifest.xml 声明权限 → 运行时授权弹窗 → PermissionManager 检查 第二层:沙箱机制(进程隔离) UID 隔离 → 文件系统权限 → Binder IPC 受控通信 第三层:SELinux 强制访问控制(MAC) 安全上下文标签 → 策略规则检查 → avc 审计日志 三层防御协同:权限模型控制“能否请求”,沙箱控制“能否访问”,SELinux 控制“能否执行”

2.4 三者协同:一个完整的访问控制流程

以“应用 A 请求访问摄像头”为例,展示三层防御如何逐层过滤:

  1. 权限检查:系统检查应用 A 是否声明 CAMERA 权限且用户已授权。若未授权,直接拒绝。
  2. 沙箱隔离:应用 A 的进程运行在 UID 10001 下,无法直接访问摄像头驱动设备文件(/dev/video*),必须通过 Camera Service(运行在 system UID)代理。
  3. SELinux 策略检查:Camera Service 在访问 /dev/video0 时,内核 SELinux 子系统检查其安全上下文(如 u:r:camera_service:s0)是否具有对设备节点(u:object_r:video_device:s0)的 read/write 权限。若策略禁止,操作被拒绝并记录 avc 日志。
核心结论:SELinux 是 Android 安全架构的“最后一道闸门”。即使应用通过了权限检查和沙箱隔离,SELinux 仍可基于全局策略阻止危险操作。这也是为什么 Android 内核中 SELinux 策略配置如此重要——它弥补了 DAC 和权限模型的固有缺陷。

2.5 安全上下文与策略规则基础

SELinux 的核心概念是“安全上下文”(Security Context),格式为 user:role:type:level。在 Android 中,最关键的字段是 type(类型),它决定了进程或对象的“身份”。

组件 安全上下文示例 说明
系统服务进程 u:r:system_server:s0 类型 system_server,拥有系统级权限
应用进程 u:r:untrusted_app:s0 类型 untrusted_app,受严格限制
设备节点 u:object_r:video_device:s0 类型 video_device,摄像头设备
系统文件 u:object_r:system_file:s0 类型 system_file,只读系统文件

策略规则的基本语法为:

allow source_type target_type:class perm_set;
# 示例:允许 system_server 对 video_device 执行 read 和 write 操作
allow system_server video_device:chr_file { read write ioctl };
学习路径提示:后续章节将深入讲解如何编写和调试这些策略规则。当前阶段,只需理解 SELinux 通过“类型”标签和“允许规则”来精确控制每个进程能做什么、不能做什么。
SELinux 安全上下文与策略规则关系 SELinux 安全上下文与策略规则关系 进程(主体) 安全上下文: u:r:system_server:s0 请求 read/write 对象(资源) 安全上下文: u:object_r:video_device:s0 策略规则 allow system_server video_device:chr_file { read write }; 决策流程:内核提取主体类型 → 查找策略规则 → 匹配对象类型和类别 → 允许或拒绝

2.6 本章小结