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 编译
相关推荐
有位神秘人24 分钟前
Android中Notification的使用详解
android·java·javascript
·云扬·33 分钟前
MySQL Binlog落盘机制深度解析:性能与安全性的平衡艺术
android·mysql·adb
独自破碎E2 小时前
【BISHI9】田忌赛马
android·java·开发语言
代码s贝多芬的音符3 小时前
android 两个人脸对比 mlkit
android
darkb1rd5 小时前
五、PHP类型转换与类型安全
android·安全·php
gjxDaniel5 小时前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
csj505 小时前
安卓基础之《(22)—高级控件(4)碎片Fragment》
android
峥嵘life6 小时前
Android16 【CTS】CtsMediaCodecTestCases等一些列Media测试存在Failed项
android·linux·学习
stevenzqzq7 小时前
Compose 中的状态可变性体系
android·compose
fakerth7 小时前
【OpenHarmony】输入法imf框架
操作系统·openharmony