domain_auto_trans,source_domain,untrusted_app
一. domain_auto_trans
- 自动域转换宏
它是干什么的?
domain_auto_trans
是一个策略宏,它用于在 SELinux 策略中定义一条规则:“当某个域(进程)执行某个特定类型的文件时,新产生的进程应该自动转换到一个新的、指定的域”
它不是一个基本的 SELinux 权限,而是一个为了方便而创建的“快捷方式”,它会自动生成实现自动域转换所需的所有底层 allow
规则
参数:
domain_auto_trans(source_domain, target_type, new_domain)
source_domain
:当前正在执行程序的进程所在的安全域。例如init
,zygote
,shell
target_type
:被执行的程序文件本身的安全上下文类型。例如adbd_exec
,app_process_exec
,system_file
new_domain
:执行成功后,新进程应该被放置的安全域。例如adbd
,system_server
,untrusted_app
它背后做了什么?
这个一条宏指令会扩展为三条基本的 allow
规则和一条 type_transition
规则:
# 1. 允许源域进程执行目标类型的文件
allow source_domain target_type:file execute;# 2. 允许新域将目标类型的文件作为其“入口点”
allow new_domain target_type:file entrypoint;# 3. 允许源域进程向新域进程转换
allow source_domain new_domain:process transition;# 4. 最关键的一步:定义默认的类型转换规则。
# 意思是:当 source_domain 进程执行 target_type 文件时,
# 默认情况下,新进程的域应该是 new_domain。
type_transition source_domain target_type:process new_domain;
例子:
domain_auto_trans(zygote, app_exec, system_server)
这意味着:当 zygote
进程执行一个被标记为 app_exec
类型的文件时,新启动的进程会自动从 zygote
域转换到 system_server
域
二. source_domain
- 源域
它是干什么的?
这只是一个占位符参数,代表转换过程的起点。它指的是发起 execve()
系统调用的那个进程所在的安全域
这个进程通常是“孵化器”或“启动器”,比如
init
:第一个用户空间进程,负责启动系统服务zygote
:Android 的孵化进程,负责启动应用和系统服务shell
:在 ADB 或终端中运行的命令,比如adb shell
源域进程的权限决定了它能执行哪些文件以及它能将子进程转换到哪些域
三. untrusted_app
- 不受信任的应用域
它是干什么的?
untrusted_app
是 Android 为第三方应用程序分配的标准 SELinux 域(安全上下文)。它的名字就体现了其安全设计初衷:默认不信任
主要特点:
- 最小权限原则:
untrusted_app
域被授予的权限极其有限。它只能访问明确允许的资源,无法访问其他应用的数据、系统日志、大多数设备文件等 - 沙盒化:每个运行在
untrusted_app
域的应用都被隔离在自己的沙盒中,彼此之间以及与系统之间是隔离的 - 与平台应用的区别:Android 还有
platform_app
域,用于预装在系统分区、与系统平台一起签名的应用。platform_app
比untrusted_app
拥有稍多的权限,但仍然远少于系统服务域(如system_server
)
它是如何被赋予应用的?
这正是一个域转换的完美例子!
- 源域:
zygote
监听请求,准备孵化新应用 - 目标文件:应用本身的代码。Android 应用并非直接执行一个二进制文件,而是由
zygote
复制自身进程,然后加载应用的代码包(DEX/OAT 文件)。但这些代码库文件也有一个类型,比如apk_data_file
- 转换规则:策略中有一条核心规则:
domain_auto_trans(zygote, apk_data_file, untrusted_app)
- 结果:当
zygote
为第三方应用 fork 并准备加载其代码时,SELinux 策略会检查到这个转换规则。由于所有条件满足(zygote 有执行/过渡权限,apk 文件是 untrusted_app 的有效入口点),新进程的域就从高权限的zygote
降权转换到了限制级的untrusted_app
它们如何协同工作:
总结与关系图
概念 | 角色 | 类比 |
---|---|---|
domain_auto_trans | 规则制定者 | 一份官方文件,规定:“如果A部门(source_domain )的员工使用了B工具(target_type ),就必须自动调到C岗位(new_domain )” |
source_domain | 起点/发起者 | A部门的员工(如 zygote )。他的身份决定了他能使用哪些工具以及能调到哪些岗位 |
untrusted_app | 终点/目标之一 | C岗位中的一个,即限制最多的基层岗位。第三方应用员工最终都在这里 |