【Abyss】Android 平台 BPF 和 SECCOMP 的 SVC 指令拦截
Android
平台从上到下,无需 ROOT/解锁/刷机,应用级拦截框架的最后一环 ——SVC
系统调用拦截。
☞ Github: https://www.github.com/iofomo/abyss ☜
由于我们虚拟化产品的需求,需要支持在普通的Android
手机运行。我们需要搭建覆盖应用从上到下各层的应用级拦截框架,而Abyss
作为系统SVC
指令的调用拦截,是我们最底层的终极方案。
源码位置:https://github.com/iofomo/abyss/tree/main/svcer
01. 说明
Seccomp(Secure Computing Mode):
Seccomp
是 Linux
内核的一个安全特性,用于限制进程可以执行的系统调用。它通过过滤系统调用,防止恶意程序执行危险操作。Seccomp
通常与 BPF
结合使用,以实现更灵活的过滤规则。
BPF(Berkeley Packet Filter):
BPF
是一种内核技术,最初用于网络数据包过滤,但后来被扩展用于更广泛的用途,包括系统调用过滤。BPF
程序可以在内核中运行,用于检查和过滤系统调用。
02. 主要流程
首先,配置 BPF
规则,如下我们配置了目标系统调用号的拦截规则,不在这个名单内的就放过,这样可以实现仅拦截我们关心的系统调用(即函数),提升拦截效率和稳定性。
然后,我们需要过滤掉一些系统库和自身库,防止写入死循环。
自身实现库的过滤【必须】
vdso
的过滤【必须】linker
的过滤【可选,提效】libc
的过滤【可选,提效】
通过解析进程 maps
中对应库地址区间,配置跳过此区间的系统调用规则。
其次,应用以上配置。
最后,实现拦截后的处理。
03. 封装
为了使用方便,封装了一些基础系统调用的日志打印接口。
1)添加要拦截的系统调用号。(日常日志打印)
2)注册要拦截的系统调用回调。
3)初始化
04. 附
额外模块:
本框架实现了最基本的检测仿真,如通过 __NR_rt_sigaction
和 __NR_prctl
获取配置时,会对返回值进行还原。
参考项目:
https://github.com/proot-me/proot
https://github.com/termux/proot
评论