LineageOS自定义守护进程如何不修改系统SEPolicy绕过sys_ptrace的neverallow限制
问题解答
错误原因
你当前的写法不生效是因为SEPolicy的neverallow规则是全局累加生效,不存在覆盖逻辑:
- 系统
system/sepolicy/private/domain.te中定义的neverallow已经明确禁止了除列出的vold/llkd等域外的所有domain获取sys_ptrace权限 - 你新增自定义
neverallow只是额外新增了一条规则,并不会抵消系统原有neverallow的限制 - 你为
valord添加的allow规则和系统原有neverallow冲突,所以编译阶段的SEPolicy合规检查会直接报错
不修改系统SEPolicy源码的可行方案
方案1:替换实现逻辑,避免使用sys_ptrace(最优)
绝大多数进程监控场景不需要用到ptrace能力,你可以改为读取/proc文件系统获取进程运行信息,仅需要为valord添加对应proc文件的读取权限即可,完全不会触发sys_ptrace相关的neverallow限制,示例规则参考:
allow valord proc:file r_file_perms; allow valord proc:dir r_dir_perms;
方案2:运行时动态修改SEPolicy(适用于必须用ptrace的场景)
编译阶段的neverallow检查仅针对静态编译进rom的SEPolicy规则,你可以放弃在静态规则中加权限,改为开机阶段动态注入权限:
- 删掉你之前写的
allow valord self:global_capability_class_set sys_ptrace规则,以及你新增的自定义neverallow规则 - 在init的开机执行脚本中加入如下命令(需要rom支持
supolicy工具,userdebug/eng版本默认自带,user版本如果有root权限也可以手动集成):
supolicy --live 'allow valord self global_capability_class_set sys_ptrace'
该命令会在系统启动后动态修改运行时的SEPolicy规则,不会触发编译阶段的neverallow检查,也能解决你日志中提到的权限拒绝问题。
方案3:利用userdebug/eng版本的豁免规则
如果你编译的是userdebug或者eng版本,可以将valord加入到userdebug_or_eng的豁免域列表中,只需要在你的自定义规则中添加如下声明即可:
userdebug_or_eng(` allow valord self:global_capability_class_set sys_ptrace; ')
因为系统原有neverallow规则中已经对userdebug_or_eng标记的规则做了例外适配,这种写法在userdebug/eng版本编译时不会触发neverallow报错,同时也不需要修改系统源码。
内容的提问来源于stack exchange,提问作者user6012107
相关产品推荐
相关产品推荐

