文/徐清伟:龙力社区eBPF技术探索SIGGroupMaintainer高级内核技术专家,对Linux内核和系统稳定性有深入研究。01启示录新约启示录认为魔鬼其实是天使,但大天使路西法背叛了天堂,翅膀变黑,堕入地狱,成为了魔鬼。这些恶魔主宰着黑暗势力,阻碍着人类与上帝的交流,无所不用其极。所以可以说,天使和恶魔本来就是一体的,只是命运不同罢了。随着eBPF技术在各行业的使用和普及,人们在享受技术变革红利的同时,也遭受着无孔不入的恶意攻击,就像任何事物都有两面性一样。没有任何技术具有优越的优点而没有缺点。只有更加清晰地分析eBPF的核心,才能推动其不断进步,趋利避害,尽可能发挥积极作用。那么,eBPF是天使,还是魔鬼?日益严峻的Linux安全形势据安全分析公司ESGCloudNativeSecurityResearch(文章末尾的链接)称,88%的网络安全专业人士表示,他们的云原生应用程序和基础设施在过去12个月内遭到破坏。攻击。然而,许多旨在保护Linux的云安全解决方案可能是繁琐且具有破坏性的,因为它们是从Mac或Windows操作系统移植而来的,而且这些解决方案有时会影响Linux系统的处理能力,甚至做出改变。在Linux领域,很多安全公司都发布了自研的MDR、XDR、EDR产品。大多数解决方案基于轻量级代理,它们静默收集遥测数据,同时最大限度地减少任何可能的性能影响,并将主机检测和响应扩展到系统的本地和云端,通常构建有基于规则的自动响应和分析功能,例如SanerNow、Automox、Cyber??eason、SyxsenseSecure、SangforEndpointSecure等,一般具有以下特点:从端点监控和收集可能暗示威胁的活动数据评估收集的数据以确定威胁模式自动响应已识别的威胁以消除或遏制它们并通知安全人员使用取证和分析工具研究已识别的威胁并寻找可疑活动目前在Linux环境中,对于EDR,XDR产品也提出了更严格的要求:Linux威胁和攻击向量与Windows/MacOS对应物不同,策略需要单独构建。Linux通常是生产系统的基础,产品的中断或中断不会对业务产生负面影响。构建轻量级LinuxEDR传感器针对Linux构建和优化,对系统的影响最小。基于Linux的云原生基础设施和云原生应用的结合是CI/CD持续集成和交付API、容器、VM和Serverless功能的结合。保护这些应用程序、底层基础设施和协调其部署的自动化平台需要重新审视威胁模型、获得组织一致性并利用有目的的控制。此外,随着安全和DevOps的不断融合,云安全控制正在得到整合。将孤立的方式发展为统一的策略来保护云原生应用和平台是目前众多安全厂商的目标,也是甲方的真实诉求。与此同时,更多的安全厂商正在尝试整合云安全态势管理(CSPM)、云工作负载保护(CWP)、容器安全等解决方案集成到云安全套件中,从而提高自有安全产品的市场份额。互联网的竞争力和话语权,也避免了安全产品的碎片化。云原生基础设施包括CPU硬件、指令集、操作系统等,增强操作系统的高性能和安全性。也是目前eBPF技术正在深化的领域。因此,eBPF本身的安全能力也是在考验技术是否可行。可持续发展的重要指标。02eBPF:魔鬼面孔eBPF(扩展伯克利数据包过滤器)席卷了Linux世界。它于2013年首次推出以支持可编程网络,现在用于可观察性、安全性、网络等。许多大公司——包括Meta、谷歌、微软和Netflix——都致力于帮助开发和支持它,尤其是在云原生的重要性日益增加的情况下。注意:“eBPF”和“BPF”实际上是同义词,社区经常互换使用这两个术语,部分原因是eBPF几乎完全取代了经典的BPF技术。过去几年,黑产组织一直在研究利用eBPF开发和扩展Linux恶意软件的作用,安全研究人员也在不断修复漏洞,试图提前感知和预测0-day漏洞。近期,DEFCON、BlackHat等顶级安全会议上频频出现一些与eBPF相关的CVE报告实例,也让人们对eBPF的安全性更加关注和担忧。下面这个话题,后面会逐步翻译验证,同步分享:EvileBPFIn-Depth:PracticalAbusesofanIn-KernelBytecodeRuntimeWarpingReality-creatingandcounteringthenextgenerationofLinuxrootkitusingeBPFeBPF,我想我们是朋友!有了像eBPF这样的朋友,谁还需要敌人?修复内存取证盲点:Linux内核跟踪现在让我们深入研究eBPF机制,看看黑客如何使用这些强大的功能来实现他们的目标。bpf_probe_write_user利用:eBPF程序可以访问内核中内置的一组有限的辅助函数。基于eBPF的恶意攻击的帮助程序是bpf_probe_write_user。此函数允许eBPF程序写入当前正在运行的进程的用户空间内存。恶意攻击可以利用这种能力在系统调用期间修改进程的内存,例如bad-bpfsudo在读取/etc/sudoers时写入用户空间内存。它注入了一个额外的代码,允许特定用户使用sudo命令。限制:(1)如果内存被换出或未标记为可写,该函数将失败。(2)向内核日志打印一条警告消息,说明正在使用该函数。这是为了警告用户程序正在使用具有潜在危险的eBPF辅助函数。bpf_override_return利用:另一个eBPF辅助函数bpf_override_return允许程序覆盖返回值。黑客可以利用它来防止恶意利用。例如,如果你想运行kill-9,黑客可以将kprobe附加到适当的内核函数来处理kill信号,返回错误,并有效地防止系统调用发生。开源项目ebpfkit使用它来防止可能导致发现控制eBPF程序的用户空间进程的操作。局限性:(1)内核构建打开选项:CONFIG_BPF_KPROBE_OVERRIDE(2)当前仅支持x86(3)只能与kprobesXDP和TC一起使用利用:ebpfkit利用XDP和TC进行隐式通信。下图来自Blackhat会议上的演示文稿,其中ebpfkit的创建者(GuillaumeFournier、SylvainAfchain和SylvainBaubeau)概述了如何使用XDP和TC隐藏发送到ebpfkit的命令,使其不被运行在ebpfkit上的XDP程序接收。主持并处理请求。该程序将此识别为对主机上运行的恶意攻击的请求,并将数据包修改为对主机上运行的Web应用程序的正常HTTP请求。在出口,ebpfkit使用TC程序捕获来自Web应用程序的响应,并使用来自ebpfkit的响应数据修改其输出。限制:XDP程序运行得太早以至于数据与进程或套接字无关,因此数据包周围几乎没有上下文。https://www.blackhat.com/us-2...03eBPF:angelfaceeBPF的核心是一个指令集架构(ISA),可以运行在类似Linux内核中的虚拟机结构中,有寄存器,指令和堆栈等。为了使用eBPF,用户创建eBPF程序并将它们附加到系统上的适当位置,通常在内核中。当与附加点关联的事件发生时,程序运行并有机会从系统读取数据并将该数据返回给用户空间中的控制应用程序。总之,eBPF允许用户动态安装在内核上下文中执行的代码,但可以从用户空间进行编程。它有点像用户空间应用程序和Linux内核模块之间的混合体。eBPF的基础知识就不用赘述了。网上已经有太多丰富的教程和分析文章了。个人建议初学者可以从官网开始了解eBPF的前世今生,或者直接从内核源码的具体例子中学习。核实。eBPF在为众多Linux内核开发者提供便利的同时,也为恶意软件开发者提供了一个新的利用领域,这就是“天使与恶魔”混血的源头。下图总结了eBPF程序的整个生命周期:安全优势:套接字过滤器套接字过滤器是经典BPF的原始用例。套接字过滤器是一个可以附加到套接字的eBPF程序。然后该程序可以过滤该套接字的传入流量。BerkleyPacketFilter的名称意味着它是一种旨在过滤数据包数据的技术。此功能甚至已保留到现代eBPF中。字节码eBPF程序通常以“受限”C程序开始。受限意味着堆栈大小、程序大小、循环、可用函数等与普通C程序相比受到限制。C代码被编译成eBPF字节码。验证器在eBPF代码完全加载到内核之前,它会通过验证器运行。验证者的工作是确定eBPF程序是否可以安全运行。“安全”意味着它不会陷入无限循环,没有不安全的内存操作,并且低于最大复杂度/代码大小。安全策略:确保非特权eBPF被禁用。今天,要安装eBPF程序,您通常需要root-或者至少需要CAP_SYS_ADMIN和/或CAP_BPF。这并非总是如此。围绕内核4.4引入了非特权eBPF。请务必通过运行以下命令检查此配置选项:sysctlkernel.unprivileged_bpf_disabled以禁用您不需要的功能。管理员可以编程方式禁用kprobes之类的东西:echo0>/sys/kernel/debug/kprobes/enabled来构建内核而不支持kprobes、基于eBPF的TC过滤器或完整的eBPF支持(尽管这可能不是很多人的选择).ONFIG_BPF_KPROBE_OVERRIDE除非绝对必要,否则不要设置Ensure。安全检查:从安全周期的角度来看,一次检查分为三个主要阶段:事前(运营前)、事中(运行时)和事后(攻击后)。安全人员希望在运行前通过一系列的静态分析手段发现异常,将问题扼杀在萌芽状态。但现实往往事与愿违。更多的异常检测场景发生在运行时。这时候安防人员就需要设计出具有较强白黑检测能力的产品模型,这也是最终解决方案成功的基石。从eBPF和LinuxTracing的角度看具体解决方案:lookingforunexpectedkprobesloaded。#cat/sys/kernel/debug/kprobes/listffffffff8ad687e0rip_local_out+0x0[FTRACE]ffffffff8ad687e0kip_local_out+0x0[FTRACE]使用bpftool列出系统中使用eBPF的程序。#bpftoolprog176:cgroup_skbtag6deef7357e7b4530gplloaded_at2022-10-31T04:38:09-0700uid0xlated64Bjited54Bmemlock4096B185:kprobetaga7ce508aab49e47fgplloaded_at2022-10-31T10:03:16-0700uid0xlated112Bjited69Bmemlock4096Bmap_ids40#bpftoolperfpid543805fd22:prog_id3610kprobefunctcp_v4_connectoffset0pid543805fd23:prog_id3610kprobefunctcp_v6_connectoffset0pid543805fd25:prog_id3611kretprobefunctcp_v4_connectoffset0pid543805fd26:prog_id3611kretprobefunctcp_v6_connectoffset0pid543805fd28:prog_id3612kretprobefuncinet_csk_acceptoffset0查找加载的XDP程序。$iplinkshowdev
