【CSDN引言】eBPF目前早已成了安全研究人员和黑客手中强悍的工具,亦正亦邪,取决于使用者的选择。
作者|许庆伟责编|王子彧
出品|OpenAnolis(龙蜥)
启示录
圣经新约启示录觉得:恶魔虽然本身是天使,但炽天使长路西法背弃了天堂,翅膀弄成了红色,倒塌地狱,堕落成为恶魔。这种恶魔主宰著黑暗势力,妨碍人类与上帝沟通,无所不用其极。所以可以说天使和恶魔原本是一体的,只是命运不同。
随着eBPF技术在各类行业领域上的使用和普及,人们在享受着技术改革红利的同时,也遭到着无孔不入的恶意功击,如同任何事物都有两面性一样。没有任何一项技术只有高高在上的优势linux空间,而没有隐忧,只有愈发清晰的刨析清楚eBPF的内核,能够促进它不断的进步,趋利避害,尽可能发挥正向的作用。
这么,eBPF是天使,亦或恶魔?
越来越严峻的Linux安全形势
按照安全剖析机构ESG云原生安全研究(链会见文末),88%的网路安全专业人士表示,在过去12个月中,她们的云原生应用程序和基础设施遭到过功击。但是,许多致力保护Linux的云安全解决方案可能很麻烦且具有破坏性,由于它们是从Mac或Windows操作系统上移植而至,这种方案有时会影响到Linux系统的处理能力,甚至进行修改。
在Linux领域,好多安全公司都发布了自研的MDR、XDR、EDR产品,大多数方案是基于轻量级代理在沉静搜集遥测数据,同时最大限度地降低任何可能的性能影响,并将托管测量和响应扩充到系统的本地和云上,一般建立有基于规则的手动响应和剖析功能,例如SanerNow、Automox、Cybereason、SyxsenseSecure、SangforEndpointSecure等等,大致有以下特性:
1.从端点监视和搜集可能暗示恐吓的活动数据
2.评估搜集的数据以确定恐吓模式
3.手动响应已辨识的恐吓以去除或杜绝它们,并通知安全人员
4.使用取证和剖析工具研究已辨识的恐吓并找寻可疑活动
目前在Linux环境下,对于EDR、XDR产品也提出愈加严格的要求:
1.Linux恐吓和功击媒介与Windows/MacOS对应物不同,须要单独建立策略。
2.Linux一般是生产系统的基础,不能由于产品的中断或干扰会对业务形成负面影响。
3.建立重型LinuxEDR传感专为Linux建立和优化,对系统的影响降到最小。
基于Linux系统的云原生基础构架设施
云原生应用程序的组合是CI/CD持续集成和交付的API、容器、VM和无服务器功能的组合。保护那些应用程序、底层基础设施和协调其布署的手动化平台,须要重新考量恐吓模型、获得组织一致性并借助有目的的控制。据悉,随着安全性和DevOps不断融合,云安全控制正在得到整合。将孤立的方式发展为统一的策略,以保护云原生应用程序和平台是目前好多安全厂商加码的目标,也是乙方实实在在的需求。与此同时,更多的安全厂商正在尝试将云安全态势管理(CSPM)、云工作负载保护(CWP)、容器安全等方案linux内核24版源代码分析大全(清晰版),整合到集成的云安全套件中,进而减小自身安全产品在市场上的竞争力和话语权,也防止安全产品的碎片化。
云原生的基础设施包含CPU硬件、指令集,操作系统等,提高操作系统的高性能和安全性,也是目前eBPF技术正在深入的领域,所以eBPF自身的安全能力,也是检验该项技术是否有可持续发展的重要指标。
eBPF:恶魔脸孔
eBPF(扩充的Berkeley数据包过滤器)肆虐了Linux世界。它于2013年首次推出以支持可编程网路,现今用于可观察性、安全性、网络等。许多大公司——包括Meta、谷歌、微软和Netflix——都旨在于帮助开发和支持它,尤其是在云原生领域的重要性越来越高。注意:“eBPF”和“BPF”实际上是同义词,社区常常互换使用这种术语,部份缘由是eBPF几乎完全替代了精典的BPF技术。
在过去的几年里,黑产组织仍然在研究借助eBPF来开发并扩大Linux恶意软件方面的作用,安全研究人员则不停的修补漏洞,并企图提早感知预测0-day漏洞。近来,有一些eBPF相关的CVE报告示例频繁的出现在DEFCON和BlackHat等顶尖安全大会上,也让人们愈加的注重和害怕eBPF的安全性,如下topic,后续我会逐渐翻译验证,并同步分享下来:
如今让我们深入了解eBPF机制,瞧瞧黑客是怎样借助这种强悍功能来达到功击的目的。
bpf_probe_write_user
借助:eBPF程序可以访问一组有限的辅助函数,这种函数外置于内核中。基于eBPF恶意借助的一个助手就是bpf_probe_write_user。此函数容许eBPF程序写入当前正在运行的进程的用户空间显存。恶意借助可以使用这些能力在系统调用期间更改进程的显存,比如bad-bpfsudo在读取时写入用户空间显存/etc/sudoers。它注入了一个额外code,准许特定用户使用该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)只能与kprobes一起使用
XDP和TC
借助:ebpfkit借助XDP和TC进行隐式通讯。右图来自Blackhat大会讲演PPT,其中ebpfkit的创建者(GuillaumeFournier、SylvainAfchain和SylvainBaubeau),在讲演中,她们概述了怎样使用XDP和TC隐藏发送到ebpfkit的命令linux内核24版源代码分析大全(清晰版),主机上运行的XDP程序接收并处理恳求。该程序将其辨识为对主机上运行的恶意借助的恳求,并将数据包更改为对主机上运行的Web应用程序的普通HTTP恳求。在出口处,ebpfkit使用TC程序捕获来自webapp的响应,并使用来自ebpfkit的响应数据更改其输出。
限制:
(1)XDP程序运行得太早,数据与进程或套接字无关,因而数据包周围几乎没有上下文。
#with-friends-like-ebpf-who-needs-enemies-23619
eBPF:天使脸孔
eBPF的核心是可以在Linux内核中类似虚拟机结构中运行的一种指令集构架(ISA),拥有寄存器、指令和堆栈等。为了使用eBPF,用户可以创建eBPF程序并将它们附加到系统的适当位置,一般是在内核中。当与附加点相关的风波发生时,程序运行并有机会从系统读取数,将该数据返回给用户空间中的控制应用程序。总而言之,eBPF容许用户动态安装在内核上下文中执行,但可从用户空间编排的代码。它有点像用户空间应用程序和Linux内核模块之间的混和体。
关于eBPF的基础知识无需赘言,网路上早已有太多丰富的教程和剖析文章,个人建议初学者可以先从官方网站上开始了解eBPF的前生今世,也可以直接在kernel源码具体实例小学习和验证。eBPF在为众多Linux内核开发者提供便利的同时,也为恶意软件的开发者提供了新的借助领域linux解压命令,这也就是“天使恶魔”的混和体来源。
右图总结了eBPF程序的整个生命周期:
安全优势:
1.Socketfilters套接字过滤器是精典BPF的原始用例。套接字过滤器是一个可以附加到套接字的eBPF程序。之后该程序可以过滤该套接字的传入流量。BerkleyPacketFilter的名称暗示它是一种致力过滤数据包数据的技术。这个功能甚至仍然保留到现代eBPF中。
2.ByteCodeeBPF程序一般以“受限”C程序开始。受限意味着堆栈大小、程序大小、循环、可用函数等与普通C程序相比遭到限制。C代码被编译成eBPF字节码。
3.Verifier在eBPF代码完全加载到内核之前,它会通过验证器运行。验证者的工作是确定eBPF程序是否可以安全运行。“安全”是指它不会深陷无限循环,没有不安全的显存操作,而且高于最大复杂度/代码大小。
安全策略:
1.确保非特权eBPF被禁用。现在,要安装eBPF程序,您一般须要root——或起码须要CAP_SYS_ADMIN和/或CAP_BPF。情况并非总是这么。围绕内核4.4引入了非特权eBPF。请勿必通过运行以下命令检测此配置选项:
sysctl kernel.unprivileged_bpf_disabled
2.禁用不须要的功能。管理员可以通过编程方法禁用例如kprobes之类的东西:
echo 0 > /sys/kernel/debug/kprobes/enabled
3.在不支持kprobes、基于eBPF的TC过滤器或完全支持eBPF的情况下建立内核(虽然这可能不是许多人的选择)。
4.ONFIG_BPF_KPROBE_OVERRIDE除非绝对必要,否则不设置Ensure。
安全检查:
从安全周期的角度来看,一场检查分为三个大阶段:事前(运行前)、事中(运行时)、事后(功击后)。安全人员都希望可以在运行前通过一系列的静态剖析方式来测量出异常,因而将问题抹杀在摇篮里。但现实往旧事与愿违,更多的异常测量场景发生在运行时,这个时侯就须要安全人员设计的产品模型具有很强的鉴白和鉴黑能力,这也是绝对了最终方案是否成功的基石。
从eBPF以及LinuxTracing的维度来瞧瞧具体方案:
1.找寻加载的意外kprobes。
#cat /sys/kernel/debug/kprobes/列表
ffffffff8ad687e0 r ip_local_out+0x0 [FTRACE]
ffffffff8ad687e0 k ip_local_out+0x0 [FTRACE]
2.用bpftool列举系统中正在使用eBPF的程序。
# bpftool prog
176: cgroup_skb tag 6deef7357e7b4530 gpl
loaded_at 2022-10-31T04:38:09-0700 uid 0
xlated 64B jited 54B memlock 4096B
185: kprobe tag a7ce508aab49e47f gpl
loaded_at 2022-10-31T10:03:16-0700 uid 0
xlated 112B jited 69B memlock 4096B map_ids 40
# bpftool perf
pid 543805 fd 22: prog_id 3610 kprobe func tcp_v4_connect offset 0
pid 543805 fd 23: prog_id 3610 kprobe func tcp_v6_connect offset 0
pid 543805 fd 25: prog_id 3611 kretprobe func tcp_v4_connect offset 0
pid 543805 fd 26: prog_id 3611 kretprobe func tcp_v6_connect offset 0
pid 543805 fd 28: prog_id 3612 kretprobe func inet_csk_accept offset 0
3.查找加载的XDP程序。
$ ip link show dev
1: lo: mtu 65536 xdpgeneric qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
prog/xdp id 220 tag 3b185187f1855c4c jited
4.检测bpffs(BPF文件系统)中是否有任何pinnedobjects。
$ mount | grep bpf
…
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
…
#ls -la /sys/fs/bpf/
5.检测是否加载了任何TC程序。
#tc filter show dev
6.监视系统日志中是否提到BPF帮助程序生成的警告消息。
#dmesg -k | grep ‘bpf_probe_write_user’
尾声
其实,eBPF目前早已成了安全研究人员和黑客手中强悍的工具,亦正亦邪,取决于使用者的选择。因为这些范式将过去施行恶意借助的方法和流程进行了转变,对于安全人员也提高了要求,须要研究和理解新兴恐吓的前沿技术及借助。
随着不断地地剖析并认识到了怎样辨识和测量eBPF的恶意滥用,我们未来将更深入地了解这种借助的原理、行为方法以及测量它的最佳方法,后续研究剖析将持续分享。
作者简介:
许庆伟:龙蜥社区eBPF技术探求SIG组Maintainer、高级内核技术专家,对Linux内核、系统稳定性领域有深入研究。
参考链接:
eBPF技术探求SIG主页:
安全剖析机构ESG云原生安全研究:
本文经授权转自陌陌公众号OpenAnolis(龙蜥)