1. transition - 进程域转换
作用
允许一个进程启动另一个进程并改变其安全域。
使用场景
sepolicy
# 允许 init 进程启动 zygote 并转换到 zygote 域
allow init zygote:process transition;
# 允许 shell 启动应用并转换到应用域
allow shell appdomain:process transition;
实际示例
less
init进程 (u:r:init:s0)
↓ 执行 /system/bin/zygote (u:object_r:zygote_exec:s0)
↓ 需要 transition 权限
zygote进程 (u:r:zygote:s0) ← 域转换完成
2. signal - 进程信号控制
作用
允许一个进程向另一个进程发送信号。
具体信号权限
sepolicy
# 基本信号权限
allow source_target target_type:process signal;
# 更细粒度的信号控制
allow source_target target_type:process {
sigchld # 子进程状态改变
sigkill # 强制终止
sigstop # 暂停执行
signull # 空信号(测试进程存在)
sigterm # 终止请求
};
使用场景
sepolicy
# 允许 init 向所有进程发送 SIGKILL
allow init domain:process sigkill;
# 允许 system_server 向应用发送 SIGTERM
allow system_server appdomain:process sigterm;
# 允许父进程接收子进程的 SIGCHLD
allow zygote appdomain:process sigchld;
3. ptrace - 进程调试和跟踪
作用
允许一个进程调试、跟踪另一个进程。
具体权限
sepolicy
allow debugger_app target_app:process {
ptrace # 跟踪目标进程
getattr # 获取进程属性
trace # 跟踪执行
};
使用场景
sepolicy
# 允许调试器应用调试普通应用
allow untrusted_app debugger_app:process ptrace;
# 允许系统工具进程监控其他进程
allow system_server appdomain:process { ptrace getattr };
4. execmem - 执行内存分配
作用
允许进程分配可执行的内存页。
使用场景
sepolicy
# 允许 JIT 编译器生成和执行代码
allow system_app self:process execmem;
# 允许动态代码生成的应用程序
allow untrusted_app self:process execmem;
具体应用
- JIT 编译器(Java、JavaScript)
- 动态代码生成
- 自修改代码
- 插件系统
完整权限示例
基础进程权限集
sepolicy
# 允许进程基本操作
allow my_daemon self:process {
fork # 创建子进程
sigchld # 处理子进程信号
execmem # 分配可执行内存
execstack # 执行栈内存
noatsecure # 忽略 AT_SECURE 标志
};
域转换完整配置
sepolicy
# 完整的域转换权限集
allow init my_daemon_exec:file { execute read open getattr map };
allow init my_daemon:process transition;
allow my_daemon my_daemon_exec:file entrypoint;
type_transition init my_daemon_exec:process my_daemon;
进程间通信权限
sepolicy
# 进程间信号通信
allow process_a process_b:process {
signal # 发送基本信号
sigchld # 子进程状态通知
sigkill # 强制终止
};
# 进程调试权限
allow debugger target_process:process {
ptrace # 进程跟踪
getattr # 获取进程属性
trace # 执行跟踪
};
实际策略案例分析
案例1:系统服务启动子进程
sepolicy
# system_server 启动媒体服务
allow system_server mediaserver:process transition;
allow system_server mediaserver_exec:file execute;
# mediaserver 需要的基本权限
allow mediaserver self:process {
fork # 创建子进程(如果需要)
sigchld # 处理子进程信号
execmem # 媒体编解码可能需要 JIT
};
案例2:调试器配置
sepolicy
# 调试器应用权限
allow debugger_app untrusted_app:process {
ptrace # 跟踪目标进程
getattr # 获取进程状态
signal # 发送控制信号
};
# 目标应用允许被调试
allow untrusted_app debugger_app:process ptrace;
案例3:自定义守护进程
sepolicy
type my_daemon, domain;
type my_daemon_exec, exec_type, file_type;
init_daemon_domain(my_daemon)
# 基础进程权限
allow my_daemon self:process {
fork # 可能创建工作者进程
sigchld # 处理子进程
execmem # 动态代码生成
signal # 向自身发送信号
};
# 允许接收来自 init 的信号
allow init my_daemon:process signal;
安全注意事项
1. execmem 的风险
sepolicy
# 危险:过于宽泛的 execmem 权限
allow untrusted_app *:process execmem;
# 安全:限制范围
allow jit_compiler_app self:process execmem;
2. ptrace 的隐私问题
sepolicy
# 只允许特定调试器使用 ptrace
neverallow { domain -debugger_app } appdomain:process ptrace;
3. signal 的滥用防护
sepolicy
# 禁止普通应用向系统进程发送信号
neverallow appdomain system_server:process signal;
调试技巧
查看进程权限拒绝
bash
# 查找进程相关的 AVC 拒绝
adb logcat | grep "avc:.*process"
# 示例输出
avc: denied { transition } for pid=1234 comm="init"
scontext=u:r:init:s0 tcontext=u:r:my_daemon:s0 tclass=process
avc: denied { execmem } for pid=5678 comm="my_app"
scontext=u:r:untrusted_app:s0 tcontext=u:r:untrusted_app:s0 tclass=process
权限检查命令
bash
# 检查进程权限
sesearch -A -s system_server -t mediaserver -c process
sesearch -A -s untrusted_app -c process -p execmem
总结
这些 process 类权限构成了 Android 进程管理和安全的基础:
transition- 控制进程域转换和安全上下文继承signal- 管理进程间通信和生命周期控制ptrace- 启用调试和性能分析功能execmem- 支持动态代码生成和 JIT 编译