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 安全的第一道防线。即使应用被攻破,攻击者也无法直接访问其他应用的数据或系统核心服务,除非存在内核漏洞或配置错误。
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 模式下验证。
2.4 三者协同:一个完整的访问控制流程
以“应用 A 请求访问摄像头”为例,展示三层防御如何逐层过滤:
- 权限检查:系统检查应用 A 是否声明
CAMERA权限且用户已授权。若未授权,直接拒绝。 - 沙箱隔离:应用 A 的进程运行在 UID 10001 下,无法直接访问摄像头驱动设备文件(
/dev/video*),必须通过 Camera Service(运行在 system UID)代理。 - 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 通过“类型”标签和“允许规则”来精确控制每个进程能做什么、不能做什么。