ebpf-linux 安全“双刃剑”


风晓
风晓 2024-01-04 11:05:02 54699
分类专栏: 资讯

EBPF 技术简介
eBPF全称 extended BPF,Linux Kernel 3.15 中引入的全新设计, 是对既有BPF架构进行了全面扩展,一方面,支持了更多领域的应用,另一方面,在接口的设计以及易用性上,也有了较大的改进。

eBPF 是一个基于寄存器的虚拟机,使用自定义的 64 位 RISC 指令集,能够在 Linux 内核内运行即时本地编译的 “BPF 程序”,并能访问内核功能和内存的一个子集。

发展历史


工作机制
 

ebpf带来的安全威胁
eBPF的hook点功能包括以下几部分:

1. 可以在Storage、Network等与内核交互之间;

2. 也可以在内核中的功能模块交互之间;

3. 又可以在内核态与用户态交互之间;

4. 更可以在用户态进程空间。

eBPF的功能覆盖XDP、TC、Probe、Socket等,每个功能点都能实现内核态的篡改行为,从而使得用户态完全致盲,哪怕是基于内核模块的HIDS,一样无法感知到这些行为。

网络层恶意利用ebpf


 以一个SSH、WEB服务的服务器为例,在IDC常见网络访问策略中,开放公网web 80端口允许任意来源的IP访问。而SSH服务只允许特定IP,或者只开放内网端口访问。

假设这台服务器已经被黑客入侵,黑客需要留下一个后门,且需要一个隐藏、可靠的网络链路作为后门通道,那么在eBPF技术上,会如何实现呢?

XDP/TC层修改TCP包
为了让后门隐藏的更好,最好是不开进程,不监听端口(当前部分我们只讨论网络层隐藏)。而eBPF技术在XDP、TC、socket等内核层的功能,能够实现流量信息修改,这些功能常被应用在L3、L4的网络负载均衡上。比如cilium的网络策略都是基于eBPF XDP实现。eBPF hook了XDP点后,更改了TCP包的目标IP,系统内核再将该数据包转发出去。

按照XDP与TC在Linux内核中,处理ingress与egress的位置,可以更准确地确定hook点。

系统层恶意利用ebpf

实现流程
回顾eBPF的hook点,作用在syscall的kprobe、tracepoint事件类型,倘若用在后门rootkit场景,是十分可怕的。比如,修改内核态返回给用户态的数据,拦截阻断用户态行为等为所欲为。而更可怕的是,常见的HIDS都是基于内核态或者用户态做行为监控,这恰恰就绕开了大部分HIDS的监控,且不产生任何日志.

tracepoint事件类型hook
在SSHD应用中,当用户登录时,会读取/etc/passwd等文件。用户态sshd程序,调用open、read等系统调用,让内核去硬件磁盘上检索数据,再返回数据给sshd进程。

用户态生成payload
用户态实现`/etc/passwd`、`/etc/shadown`等文件payload的生成,并通过eBPF的`RewriteConstants`机制,完成对elf .rodata的字段值替换。

内核态通过ebpf调用完成了随机用户名密码的root账号添加。在鉴权认证上,也可以配合`eBPF网络层恶意利用`的demo,利用eBPF map交互,实现相应鉴权。 但rootkit本身并没有更改硬盘上文件,不产生风险行为。并且,只针对特定进程的做覆盖,隐蔽性更好。

安全防御应对

运行前
在恶意程序运行前,减少攻击面,这个思路是不变的。

环境限制
不管是宿主机还是容器,都进行权限收敛,能不赋予SYS_ADMIN、CAP_BPF等权限,就禁止掉。若一定要开放这个权限,那么只能放到运行时的检测环节了。

seccomp限制
在容器启动时,修改默认seccomp.json,禁止bpf系统调用,防止容器逃逸,注意此方法对于Privileged特权容器无效。

内核编译参数限制
修改函数返回值做运行时防护时,需要用到bpf_override_return,该函数需要内核开启CONFIG_BPF_KPROBE_OVERRIDE编译参数,因此非特殊情况不要开启该编译参数。

非特权用户指令
大部分eBPF程序类型都需要root权限的用户才能调用执行。但有几个例外,比如BPF_PROG_TYPE_SOCKET_FILTER和BPF_PROG_TYPE_CGROUP_SKB这两个类型,就不需要root。但需要读取系统配置开关。

运行时
监控
Linux系统中,所有的程序运行,都必须进行系统调用,eBPF程序也不例外。需要调用syscall为321的SYS_BPF指令。并且,所有的eBPF程序执行、map创建都必须进行这个syscall调用。那么,在这个必经之路进行拦截监控,是最好的方案。

根据程序白名单筛选
在一些BPF应用的业务服务器上,本身业务行为会产生大量调用,会给安全预警带来较大审计压力。对于已知的进程,我们可以根据进程特征过滤。

获取当前进程pid、comm等属性,根据用户态写入eBPF map的配置,决定是否上报、是否拦截。

根据SYSCALL类型筛选
在BPF syscall里,子命令的功能包含map、prog等多种类型的操作,bpf() subcommand reference 里有详细的读写API。在实际的业务场景里,“写”的安全风险比“读”大。所以,我们可以过滤掉“读”操作,只上报、审计“写”操作。

运行后
如果恶意程序比检查工具运行的早,那么对于结果存在伪造的可能。

安全工程师需要根据不同场景作不同的溯源策略:

命令bpftool prog show,可以看到当前系统正在运行的BPF程序、关联的BPF map ID,以及对应的进程信息等。

命令bpftool map show,通过查看map信息,可以与程序信息作辅助矫正。并且,可以导出map内数据用来识别恶意进程行为。

bpflist-bpfcc -vv命令可以看到当前服务器运行的“部分”BPF程序列表。

bpftool net show dev ens33 -p命令可以用于查看网络相关的eBPF hook点。

结语
EBPF目前作为一门相对热门的技术,在越来越多技术人员了解到其方便性和高效率的同时,也会带来相当一大部分的“滥用”和“恶意利用”。正越来越成为安全领域不可回避的一个安全隐患甚至安全风险。

安全技术人员,既需要理解ebpf的实现机制,熟悉常用ebpf工具,又要能够了解并发现系统中被有心或者无意引入的这些ebpf的“泛滥”使用,加以封堵和规范,才能真正的用好ebpf,这把linux内核的安全“双刃剑”。

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=34731
赞同 0
评论 0 条
风晓L1
粉丝 1 发表 522 + 关注 私信
上周热门
服贸会|范渊荣获年度创新领军人物!王欣分享安恒信息“AI+安全”探索  3508
WPS City Talk · 校招西安站来了!  3424
字节跳动“安全范儿”高校挑战赛来袭!三大赛道,赢 80 万专项基金!  3349
阿B秋招线下宣讲行程来啦,速速报名!  3236
2024海洋能源产业融合发展论坛暨博览会同期活动-海洋能源与数字化智能化论坛成功举办  3231
烽火通信2025届校园招聘宣讲行程发布!!  3191
有在找工作的IT人吗?  3175
麒麟天御安全域管平台升级!为企业管理保驾护航  3161
字节跳动校招 | 电商业务 2025 校园招聘进行中!五大职类热招,等你来投!  3068
华为全联接大会2024丨软通动力分论坛精彩议程抢先看!  3010
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
如何玩转信创开放社区—从小白进阶到专家 15
信创开放社区邀请他人注册的具体步骤如下 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

加入交流群

请使用微信扫一扫!