《4.基于eBPF的内核漏洞检测实践---许庆伟.pptx》由会员分享,可在线阅读,更多相关《4.基于eBPF的内核漏洞检测实践---许庆伟.pptx(21页珍藏版)》请在三个皮匠报告上搜索。
1、首届中国首届中国eBPFeBPF研讨会研讨会基于eBPF的内核漏洞检测实践深信服创新研究院许庆伟首届中国首届中国eBPFeBPF研讨会研讨会0102内核安全策略演进eBPF检测Rootkit实例传统内核安全首届中国首届中国eBPFeBPF研讨会研讨会01l 正如Linus Torvalds曾经说过的,大多数安全问题都是bug造成的,而bug又是软件开发过程的一部分,是软件就有bug。l 至于是安全还是非安全漏洞bug,内核社区的做法就是尽可能多的测试,找出更多潜在漏洞这样近似于黑名单的做法;l 内核代码提交走的流程比较繁琐,应用到具体内核版本上,又存在周期长以及版本适配的问题,如下图,所以导致
2、内核在安全方面发展的速度明显慢于其他模块内核安全漏洞的危害首届中国首届中国eBPFeBPF研讨会研讨会01l 随着智能化、数字化、云化的飞速发展,全球基于Linux系统的设备数以百亿计,而这些设备的安全保障主要取决于主线内核的安全性和健壮性;l 当某一内核LTS版本被发有漏洞,这样相关的机器都会面临被攻破利用的局面,损失难以估;Critical&High CVE lifetimes安全策略演进首届中国首届中国eBPFeBPF研讨会研讨会01策略策略阶段阶段概述概述主机/终端黑名单(HIDS、EDR)1.业务场景复杂庞大,检测范围广,应用程序数量浮动变化,是主机端最大的特点以及痛点;2.从进程、
3、网络、文件等维度来看,学习正常行为数据的成本和难度极大,难以描绘出白名单的全部正常行为,所以在主机端的HIDS、EDR主要使用黑名单策略;应用范围:全局场景黑名单策略应用范围:全局场景黑名单策略主机/终端白名单 1.针对特定场景做学习分析,存在数量固定或系统原生自带的特点,相对于HIDS、EDR产品,检测范围小,可以在局部场景下使用;应用应用范围:局部场景白名单策略范围:局部场景白名单策略容器白名单阶段 1.容器的轻量、场景单一的特性,更加能够刻画完备的容器正常行为,使得白名单的构建更加具备可行性;2.一旦构建好容器行为白名单,实现容器权限最小化,缩减攻击面,所有在白名单之外非预期的行为均可阻
4、止,具备更好的防御效果;应用范围:容器场景白名单策略应用范围:容器场景白名单策略 白名单:白名单:允许系统或应用程序进行相关操作的集合;通过动静态方案获取系统或应用的正常行为数据,可以构建权限最小化行为集合;任何不在名单上的动作行为将被阻止运行,适合场景单一、业务范围固定的环境;黑名单:黑名单:阻止系统或应用程序进行相关操作的集合;随着攻击手段的提升和高级化,需持续学习攻击案例来扩充集合;适合复杂化、多元化业务等难以学到完整正常行为的场景;内核安全方案对比首届中国首届中国eBPFeBPF研讨会研讨会01BPF安全特性演进首届中国首届中国eBPFeBPF研讨会研讨会01Seccomp阶段eBPF
5、阶段由于早期Seccomp对syscall管控过于严格,导致该技术没有发展起来。到了2012年,Seccomp+BPF的过滤模式开始兴起;该模式允许开发人员编写 BPF 程序,来确定是否允许给定的系统调用,基于系统调用号和参数(寄存器)值进行过滤。2005年,Linux 2.6.12中的引入了第一个版本的seccomp,最初只有一个模式:严格模式(strict mode),该模式下只允许被限制的进程使用4种系统调用:read(),write(),_exit(),和 sigreturn();一旦为程序施加了严格模式的seccomp,对于其他的所有系统调用的调用,都会触发SIGKILL并立即终止进
6、程;首届中国首届中国eBPFeBPF研讨会研讨会02eBPF检测Rootkit实例eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02l 为了Hook内核函数,必须首先获得想要钩住的对象访问权;l 例如,它可以是保存所有系统调用函数地址的系统调用表。然后,保存函数的原始地址并覆盖它;l 在某些情况下,由于当前位置的内存权限,还需要获取CPU中控制寄存器的权限;首届中国首届中国eBPFeBPF研讨会研讨会02l 通过内核的core_text边界检测来实现这一点。内核中的内存被分为几个部分。其中一个是core_text段,它保存内核中的原始函数;l 此部分注册在特定的内存
7、映射区域中,该区域不受更改或操作的影响;eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02l 使用libbpfgo的helper来获取系统调用表地址,并将其添加到事件内核符号依赖项中;l 注意,detect_hooked_sycalls事件是派生事件。这意味着在我们接收到系统调用的地址并检查它们之后,我们将创建一个新的detect_hooked_sycalls事件;eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02l 将它与系统调用号一起传递,以便使用BPFMa
8、p检查内核空间;eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02l 为了检查内核空间中的那些系统调用,基于security_file_ioctl上的kprobe创建一个事件,它是ioctl系统调用的一个内部函数;l 这样就可以通过使用用户空间的特定参数触发系统调用来控制程序流,接下来用一个特定的命令触发ioctl:eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02l 在内核空间中开始检查ioctl命令是否相同,以及调用该系统调用的进程是否为Tracee。这样就可以验证只有当用户要求Tracee检查时才会发生检测的需求。eBPF检测Roo
9、tkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02l 遍历系统调用映射,通过使用READ_KERN()来获取系统调用表的地址;eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02eBPF检测Rootkit攻击l 在用户空间中,将这些地址与libbpf helpers进行比较;首届中国首届中国eBPFeBPF研讨会研讨会02l 使用insmod函数加载Diamorphine(.ko)的内核对象文件,目标是查看Tracee的检测结果;l 通常,如果选择了detect_hooked_sycall事件,Tracee将发送一个hooked_sycalls事件,以确保系
10、统没有被破坏;eBPF检测Rootkit攻击首届中国首届中国eBPFeBPF研讨会研讨会02eBPF检测Rootkit攻击l Tracee检测到getdents和getdents64这些挂起的系统调用。TNT团队使用它们来隐藏大量加密活动导致的CPU负载过高,以及通常用于从用户空间发送命令来杀死进程的kill函数;l 在这种情况下,rootkit使用kill-63作为用户空间和内核空间之间的通信通道。同样,如果再次运行Diamorphine和Tracee使用json输出,参数将显示Diamorphine的恶意钩子;首届中国首届中国eBPFeBPF研讨会研讨会02eBPF检测Rootkit攻击l 通过Tracee-rules,可以看到有detect_hooked_sycall事件的新签名,即检测到异常rootkit攻击;首届中国首届中国eBPFeBPF研讨会研讨会谢谢大家!