在研究eBPF的这一年时间里,一直有小伙伴会问如下问题:
eBPF是什么,能干啥,在安全开发与逆向中能干啥?
eBPF能做改机么,能脱壳么,能抓包么,能用来过Frida检测么?
eBPF与Frida一样么,有什么优势与区别?
接下来,我将一一回答之。
安全开发与逆向
eBPF 诞生时只是用于网络抓包过滤的,后面发展过程中,由于其框架特性,衍生成为了高性能的可观测性工具。eBPF程序编译成字节码,被挂载到不同的“监测点”上,这些“监测点”通常指的是代码执行点,当内核/用户态的“监测点”被动执行时,会触发执行挂载到这个“监测点”的eBPF字节码。后面被执行时能拿到程序的上下文寄存器与栈信息,这些信息在代码跟踪、程序profiling等领域大有用处。当然,eBPF还带有数据的处理能力,这个能力目前限于网络数据应用处理,对于安全开发来说,代码跟踪就是eBPF的强项,使用bcc/bpftrace能够开发功能强大的代码跟踪工具,这些工具的稳定性又比用户态实现的Hook框架要稳定的多。
比如我在eBPF第二季里面开发的ndksnoop工具,分析native方法调用比Frida就要方便的多,而且目前无视一切反检测与反调试。
第三季我也开发了syscallsnoop用于系统调用跟踪,开发了detect-frida工具用于Frida检测分析。
改机、脱壳、抓包、Frida反检测?
改机指的是对安卓设备的信息接口进行修改,从而达到欺骗设备指纹检测的一种技术手段。这在黑产领域用的较多,当然,开发安卓代码分析沙箱这类正经常规的需求也离不开这个功能,使用eBPF能否进入改机呢?
eBPF提供了一个叫bpf_probe_write_user的接口,允许开发人员对用户态的数据进入写入修改操作,但是,出于安全的考虑,并没有提供内核数据修改与内核/用户代码的修改功能。这意味着,默认情况下,要想实现数据的修改,只能使用bpf_probe_write_user。经过一段时间的研究,我也研究出了一些玩法,并在eBPF第四季里面加入了相应的实现讲解与代码实例。
当然,由于没有代码补丁与内核数据修改的功能,eBPF在安全功能上着实欠缺,经过一段时间的摸索,我也完成了使用eBPF来修改内核数据与代码,也就是说,目前,使用定制版本的内核,eBPF具备了更高规格功能的改机能力。我也会在后面与大家分享更多这方面的实践。
至于脱壳,理论上eBPF可行,目前仍然需要研究。
抓包功能方面,ecapture能够处理安卓公开框架的数据抓包,对于私有框架的抓包探索,在开启了eBPF的上帝模式后,这个也有更多我新的玩法,后面我会进一步研究。
Frida反检测方面,由于现在支持代码补丁,以后反检测完全可以使用eBPF来做。
以下是第一篇分享,如何改uname信息的实践。
eBPF与Frida的区别
这是被问的最多的一个问题。它们两者都可以用于代码跟踪分析,eBPF的优势在于可以跟踪内核代码与系统调用,而无用户态感知,这点上是Frida无法做到了。eBPF的kprobes/uprobes的Hook能力是内核级别的,稳定性比Frida要高了很多,不同版本的内核使用上几乎不会遇到兼容性问题。
Frida的优势在于它能够处理用户态Java代码参数,能够对数据与代码进行补丁,目前eBPF可以跟踪分析安卓Java代码的调用,但对于参数内容的处理,还有待深入研究。前面说过,eBPF默认不具备代码补丁与内核数据写的功能,在这点上,Frida要强出一些,不过最近我研究出了eBPF修改代码与内核数据,这让eBPF有了更多可玩的空间。
总体来说,eBPF不是用于取代Frida的,Frida也无法覆盖eBPF的安全分析能力,实际过程中,两个工具可以结合起来使用。
以上就是我对于eBPF在安全领域研究的最新的进展,大家多多关注,有更新的内容会第一时间通知大家。
对我的eBPF安全攻防课程感兴趣的朋友,可以点击阅读原文,进一步了解。