问eBPF是个啥?网络上搜索一下就会有它的定义:
eBPF(扩展的伯克利包过滤器,Extended Berkeley Packet Filter)是一种内核技术,主要用于在Linux内核中执行用户定义的程序。它最早是为了网络数据包过滤而设计的,但现在已经发展成为一个通用的内核执行引擎,可以实现多种用途。
eBPF的主要应用包括:
网络监控和分析:使用eBPF可以在内核级别实时监控网络流量,提高网络性能分析的准确性和效率。
安全和审计:eBPF可以用于实现内核级别的安全策略,例如防火墙、入侵检测和访问控制等。
性能调优和故障排查:eBPF可以用于收集系统的性能指标,帮助开发者优化代码,排查潜在的性能问题。
跟踪和分析:eBPF可以用于内核和用户空间程序的跟踪,提供丰富的调试信息,方便开发者定位问题。
负载均衡和流量控制:eBPF可以实现内核级别的负载均衡和流量控制,提高网络服务的性能和稳定性。
总之,eBPF是一种强大的内核编程技术,可以应用于多个场景,提高系统性能和安全性。
上面是chatGPT机器人的回答,概括了eBPF用途与基础的应用领域。我就实际的用途再与大家探讨一下。
有很多朋友问eBPF可以做啥项目? 这个问题的内涵应该是eBPF能为自己现在干的活增添啥新能力。要回答这个问题,就要先明确自己干的是啥领域,与eBPF的应用范围是否能搭上边。eBPF官方把应用领域分为可观测性、跟踪分析、安全、网络4大块,实际这4大块往往相互会有引用,通常是多种能力一起出现在实际应用中。
首先是网络领域:eBPF早先就是用于网络抓包用的,后面引入了tracepoint、kprobes等系统内核探针能力(以及引入的eBPF虚拟机与一系列helper方法)后,发现这个其实可以做一些网络相关的工具,比如可以做网络性能分析、网络跟踪、网络数据拦截与转发、网络抓包、网络防火墙等。如果你是从事网络相关产品的开发,那现在必不可少的会接触到eBPF技术,因为它已经渗透进了Linux内核的网络子系统的方方面面。BCC/bpftrace中的大量工具,就是网络领域应用的演绎。
可观测性:这个领域其中更加强调的是云原生,因为现实落地的就是这个领域。eBPF官方项目展示墙https://ebpf.io/applications/,上面列举的eBPF相关工具,一大半都是云原生领域的。社区上负责eBPF子系统与框架开发的人员,也多是国内外该领域的精英人员。eBPF的helper方法与扩展都是围绕着云原生领域应用而催生的。可以关注内核bpf讨论组:https://lore.kernel.org/bpf/。这里讨论的是eBPF相关正在更新以及即将引入的eBPF特性与能力。eBPF对于云原生能干啥?那可干的就多了!这其实是其它三个领域在云原生中的结合,比如分析集群中pod的运行状态、网络阻塞与数据传送情况、分析单个pod都执行了什么命令,访问了什么文件与资源,发送与接收了哪些网络请求,对网络进行限速与管制等。一些知名的项目有:Cilium、Falco、tetrgon、Tracee、pwru、pulsar。这些工具的用法与原理会在eBPF正式课的第五季进行讲解!
网络:在上面可观测性中已经提到了它的部分应用,虽然云原生强调的是云环境,但丝毫不影响它在单个主机的网络环境中的应用。上在介绍的云原生的工具,多数都可以运行中主机系统上,实现相同的功能。在网络抓包领域,有eCapture工具,可以用于系统网络数据包捕获!dae工具可以实现高性能的网络代理。Cilium还提供了网络转发与限速等功能。网络抓包在eBPF正式课的第二季进行讲解!
跟踪分析:这个领域强调的是对实体资源的跟踪。比如文件跟踪opensnoop、进程执行跟踪execsnoop、系统退出事件跟踪exitsnoop、glibc库跟踪(本人开发)glibcsnoop、安卓NDK接口跟踪(本人开发)ndksnoop、系统调用跟踪(本人开发)syscallsnoop。还有网络数据包跟踪pwru、系统调用与事件跟踪Falco与Tracee这类工具。所有的snoop工具在eBPF第一、二、三季进行讲解,云原生跟踪分析工具在eBPF第五季进行讲解。
安全:相信关注本篇文章的朋友,很大一部分是从事安全相关工作的。安全又可以细分一下,安全开发、逆向工程、业务安全等。安全开发方面,eBPF可以结合上面跟踪分析的应用,开发自动化分析工具、安全分析沙箱等,从事主机开发开发的,还可以开发基于eBPF的IDS与杀软等。从事红队工具开发的朋友,比如Rootkit开发,有现成的几个仓库可以参考,目前使用eBPF开发的Rootkit,隐藏级别比传统方法更高,危害性吏强;逆向工程的朋友,可以使用snoop系列工具来分析目标程序的行为,配合eBPF内核数据与代码读写能力(本人开发),可以实现更高级别的安全 对抗;对于安卓安全相关的朋友,eBPF第二完整的展示了安卓上bpftrace/BCC在上面的应用,第三季展示了ndksnoop/syscallsnoop的巨大威力,第四季展示了eBPF在安卓安全对抗上的一些应用。
eBPF的能力与内核模块能力相比如何?
优点上:理论上eBPF多数的事情(除了XDP与相关网络应用)内核模块都能做,那为何现在eBPF的使用比内核模块更多的?原因在于eBPF具备高可扩展性与安全性。你看看传统的SystemTap那么多年,为嘛不火,而bpftrace一出就火了?!bpftrace基本是把基于内核模块实现的SystemTap用eBPF实现了一遍,但它安全啊,不会对系统有任何安全方面的影响,SystemTap的安全稳定性需要它的内核模块编译能力提供,如果SystemTap编译出的内核模块出了问题,那带来的后果可能就是系统当机,这对于业务环境,这是毁灭性的!
再比如,Linux系统上IDS与安全相关的产品,国外不说,国内的很多是不会上内核扩展功能的!比如之前某团一篇讲IDS安全的文章,balabala很长一篇都是讲产品架构,涉及到agent部分却只有几句话,因为它用的Auditd子系统,完全没有采用内核模块,问了一下原因,对方说内核模块不好开发,不稳定!可见,国内大厂在技术选型时,是多么重视产品稳定性的!可以说,只有那些必须使用内核模块才能实现功能的场景,才会有人用它来做开发。
eBPF的能力与Frida能力相比如何?
eBPF由于提供了现代化的Hook框架,因此很多安全从业人员喜欢拿它与Frida相比较。毫无疑问,Frida是用户态程序Hook框架中最强大的,没有之一。Frida的实现原理是将Frida内核Hook与运行时注入到目标程序中,可实现目标程序的跟踪分析、以及代码与数据的补丁、指令跟踪等调用功能。eBPF与其相比,只能用于代码的跟踪分析,单纯的代码跟踪分析比较,eBPF要强出一头,因为它可以同时跟踪分析用户态与内核态,而且实现上更稳定,并且结合参数与数据的代码,目前可以做到无痕迹的Hook,这是Frida做不到的!Frida本身就带了非常多的特征,在现在对抗激烈的环境下,软件壳几乎都会检测Frida的存在,即使我现在更新的strong-frida过了多数检测,也难以过内存inline hook的CRC校验,这个对于eBPF来说,目前是不存在,也没有厂家检测,是安全分析工具的蓝海!
eBPF能否实现脱壳功能?回答是目前不能,原理上实现脱壳比较困难,需要结合动态库注入,借助第二阶段的动态库实现。这点上与Hook Java方法一样,eBPF可以Hook安卓java方法,但是要取它的参数与Java结构体信息就困难,这点上是eBPF的短板!但这些不影响eBPF其它优秀的功能使用。比如内核接口与系统调用的跟踪与参数修改,这些在安全对抗中非常好用,而Frida又做不到,配合内核代码与数据补丁(本人开发),可以实现动态库注入隐藏,在实际应用中,可以结合Frida一起使用,相得益彰!
说了这么多,回到最初的问题,eBPF能落地啥项目?如果看到这里,还是没有答案,只能说eBPF虽然光彩夺目,但可能不太适合您!
如果您对eBPF安全开发感兴趣,请猛戳点击阅读原文!