Android随笔-SELinux是什么?

SELinux(Security-Enhanced Linux)是 Linux 内核的一个强制访问控制(MAC)安全模块,由 NSA(美国国家安全局)开发,后被集成到 Android 系统中。

一、为什么需要 SELinux

传统 Linux 的安全问题

传统 Linux 使用 DAC(Discretionary Access Control,自主访问控制):

问题 说明
root 权限过大 root 用户可以做任何事,一旦应用获取 root,系统完全暴露
应用权限粒度粗 应用要么有权限,要么没有,无法精细控制
进程间缺乏隔离 进程可以任意访问其他进程的资源

例子:没有 SELinux 的危险

恶意应用获取 root 后:

  • 读取其他应用的私有数据

  • 修改系统 文件

  • 注入代码 到其他进程

  • 完全控制系统

二、SELinux 的核心机制

2.1 MAC vs DAC

特性 DAC(传统 Linux) MAC(SELinux)
控制方式 资源所有者自主决定 系统强制策略决定
root 限制 root 不受限制 root 也受策略约束
粒度 用户/组级别 进程/文件级别,精细到每个操作
灵活性 高(用户可改) 低(策略由管理员定义)

2.2 三个核心概念

┌─────────────────────────────────────────┐

│ 1. Subject(主体)= 进程 │

│ 如:Zygote 进程、某个应用进程 │

├─────────────────────────────────────────┤

│ 2. Object(客体)= 资源 │

│ 如:文件、目录、Socket、Binder 接口 │

├─────────────────────────────────────────┤

│ 3. Policy(策略)= 访问规则 │

│ 如:Zygote 只能读取 /system/bin/* │

│ 应用 A 不能访问应用 B 的数据 │

└─────────────────────────────────────────┘

2.3 安全上下文(Security Context)

每个进程和文件都有一个标签,格式为:

user:role:type:level

例如:

#Zygote 进程的安全上下文

u:r:zygote:s0

#系统文件的安全上下文

u:object_r:system_file:s0

#应用数据的安全上下文

u:object_r:app_data_file:s0

字段 含义
user SELinux 用户(通常固定为 u)
role 角色(进程为 r,文件为 object_r)
type 核心:决定访问权限的类型
level 安全级别(MLS/MCS,多用户隔离)

三、SELinux 的工作模式

模式 说明 用途
Enforcing 强制模式,违反策略的操作会被拒绝 生产环境
Permissive 宽容模式,违反策略只记录日志,不阻止 调试、开发
Disabled 完全关闭 SELinux 不推荐
bash 复制代码
# 查看当前模式
adb shell getenforce
# 输出: Enforcing 或 Permissive

# 临时切换(需 root)
adb shell setenforce 0   # 切换到 Permissive
adb shell setenforce 1   # 切换到 Enforcing

四、Android 中的 SELinux 策略

4.1 策略文件位置

4.2 常见类型(Type)

类型 说明
zygote Zygote 进程
system_server SystemServer 进程
platform_app 系统签名应用
untrusted_app 普通第三方应用
shell ADB shell
init init 进程

4.3 策略规则示例

bash 复制代码
# zygote.te (Zygote 的策略文件)
type zygote, domain;
type zygote_exec, exec_type, file_type;

# Zygote 可以执行 zygote_exec 类型的文件
init_daemon_domain(zygote)

# Zygote 可以创建 /dev/socket/zygote
allow zygote zygote_socket:sock_file create_file_perms;

# Zygote 可以 fork 子进程
allow zygote self:process fork;

# Zygote 可以读取 /system 目录
allow zygote system_file:dir r_dir_perms;

# Zygote 不能访问应用私有数据(除非明确允许)
# neverallow zygote app_data_file:file *;

五、SELinux 在 Android 启动流程中的作用

init 进程中的 SELinux 初始化

c 复制代码
// init 第一阶段
selinux_android_load_policy();    // 加载策略文件
selinux_restore_context("/dev");  // 恢复 /dev 目录的安全上下文
selinux_restore_context("/system"); // 恢复 /system 目录的安全上下文

六、实际案例:SELinux 如何保护系统

案例 1:阻止应用读取其他应用数据

bash 复制代码
# 应用 A 的类型是 untrusted_app
# 应用 B 的数据文件类型是 app_data_file

# 默认规则:应用只能访问自己的数据
allow untrusted_app app_data_file:dir search;
# 但只能访问属于自己的 app_data_file 实例(通过 MLS 级别隔离)

案例 2:限制 Zygote 的权限

bash 复制代码
# Zygote 虽然以 root 运行,但 SELinux 限制它:
allow zygote self:capability { setgid setuid };  // 只能使用这两个 capability
# 不能:kill 其他进程、修改系统文件、访问网络等

案例 3:Binder 调用控制

bash 复制代码
# 只有特定类型的进程可以调用 system_server 的 Binder 接口
allow system_server zygote:binder { call transfer };
allow platform_app system_server:binder call;
# 普通应用 untrusted_app 没有这个权限

七、开发中常见的 SELinux 问题

问题 现象 解决
avc: denied 日志中出现 avc: denied { read } 修改 .te 策略文件,添加 allow 规则
权限不足 应用无法访问某个文件 检查文件和进程的安全上下文是否匹配
CTS 失败 兼容性测试不通过 确保策略符合 Android 安全规范

查看 SELinux 日志

bash 复制代码
adb shell dmesg | grep avc
# 或
adb shell logcat -b events | grep selinux

# 示例输出:
# avc: denied { read } for pid=1234 comm="myapp" name="data" dev="dm-0" 
#      ino=12345 scontext=u:r:untrusted_app:s0:c512,c768 
#      tcontext=u:object_r:system_data_file:s0 tclass=dir permissive=0

八、总结

SELinux 是 Android 的"安全门卫" ------ 它通过强制访问控制策略,给每个进程和文件打上"身份标签",严格规定"谁能做什么",即使 root 用户也无法逾越策略限制。这让 Android 系统即使面对恶意应用或权限提升攻击,也能守住安全底线。

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui