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 编译
相关推荐
程序员-珍1 小时前
报错下载android sdk失败
android·java
齊家治國平天下3 小时前
AAOS 电源管理深度解析:休眠/唤醒/功耗优化
android·车载系统·aaos·aosp·电源管理·休眠唤醒·carpowermanager
Xzaveir3 小时前
企业号码展示不可观测怎么办:状态机、拨测事件与异常回放
android·人工智能
2501_916007473 小时前
iOS和macOS应用程序性能分析和优化工具使用综合指南
android·macos·ios·小程序·uni-app·iphone·webview
黄林晴4 小时前
Nearby Connections 重大变更:不再自动开启 Wi-Fi / 蓝牙,适配指南
android
恋猫de小郭4 小时前
Flutter 全新真 3D 实现,用 flutter_scene 能开发一个「我的世界」
android·前端·flutter
CS创新实验室15 小时前
量子计算机的操作系统:原理、实践与经典架构之对比
架构·操作系统·量子计算
HLC++17 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼20 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼21 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android