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_915106324 小时前
如何查看手机使用记录:Android和iOS设备全面指南
android·ios·智能手机·小程序·uni-app·iphone·webview
nee~6 小时前
Android设备USB连接转无线操作(windows)
android·windows
sun0077006 小时前
android上ethernet和wifi共存
android
青莲8437 小时前
Android Jetpack - 3 LiveData
android·前端
小蜜蜂嗡嗡7 小时前
flutter namespace问题
android·flutter
Cat God 0077 小时前
MySQL-查漏补缺版(六:MySQL-优化)
android·数据库·mysql
QING6188 小时前
Jetpack Compose Brush API 简单使用实战 —— 新手指南
android·kotlin·android jetpack
Swizard8 小时前
别让 AI 假装在工作:Android "Vibe Coding" 的生存指南
android·java·vibe coding
云边有个稻草人9 小时前
openEuler容器化实践:Docker部署全场景落地指南
操作系统
电饭叔9 小时前
《python语言程序设计》2018版--第8章14题利用字符串输入作为一个信用卡号之一(Luhn算法解释)
android·java·python