process 类权限详解

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 编译
相关推荐
2501_940094022 小时前
CHDroid 安卓上的游戏ROM CHD格式转换工具软件 游戏ROM容量压缩
android·游戏
猪哥帅过吴彦祖2 小时前
Flutter 从入门到精通:状态管理入门 - setState 的局限性与 Provider 的优雅之道
android·flutter·ios
用户69371750013842 小时前
Kotlin 协程 快速入门
android·后端·kotlin
金鸿客2 小时前
用Compose实现一个Banner轮播组件
android
狂团商城小师妹2 小时前
JAVA国际版同城服务同城信息同城任务发布平台APP源码Android + IOS
android·java·ios
老华带你飞4 小时前
记录生活系统|记录美好|健康管理|基于java+Android+微信小程序的记录生活系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·生活·毕设·记录生活系统
峥嵘life4 小时前
Android16 更新fastboot版本解决fastbootd模式识别不到设备问题
android·学习
puyaCheer4 小时前
Android 打开 在线 pdf 文件
android·pdf
RainbowC014 小时前
从Dalvik字节码角度优化安卓编码
android·java/jvm