ebpf-linux 安全“双刃剑”

news2024/10/7 1:17:17

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内核的安全“双刃剑”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PySpark基础入门(6):Spark Shuffle

PySpark基础入门(6):Spark Shuffle - 掘金 (juejin.cn) 目录 shuffle的执行 ShuffleManager Hash Shuffle Sort Shuffle Manage Spark在DAG调度阶段会将一个Job划分为多个Stage,上游Stage做map工作,下游Stage做r…

RN系统精讲-----基础了解

原生基础 安装SDK与Tools preference > appearance > systemSetting > Android sdk 如何连接设备,以及开发中的常用的adb命令 USB连接设备 adb devices 查看连接设备 wifi网络连接设备 adb connect ip(手机自己的ip地址,可以通过…

画图以及代码分析结合的循环队列的实现

循环队列的实现 概念以及结构实现初始化判空判满入队出队从队头获得元素从队尾获得元素释放 概念以及结构 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”…

优化| 割平面算法(2): Cover Cuts, Strengthening, Separation及其拓展(理论与实战详解)

【MIP Cutting plane method】-1: Cover cuts MIP的标准形式什么是Cover CutsCover Cuts的详细案例Stronger Cover Cuts及其案例Separation for Cover Cuts用Separation生成 Cover Cuts的详细例子调用Gurobi验证Cover Cuts和Stronger Cover Cuts的作用线性松弛模型的解加入Cove…

领域分类/识别方案

将用户输入与预定义的领域进行匹配 针对领域分类任务,如上图所示,我们首先会从不同的业务中收集大量的业务数据,作为基础的训练数据,虽然这些数据来自不同的业务,但是依然存在一些问题,主要有以下两方面&am…

YOLOv7测距+碰撞检测

YOLOv7测距碰撞检测 1. 相关配置2. 测距原理3. 标定和测距4. 碰撞检测4.1 相关代码4.2 主代码 5. 实验效果 相关链接 1. YOLOV5 单目测距(python) 2. YOLOV7 单目测距(python) 3. 具体实现效果已在Bilibili发布,点击…

vscode+gdbserver实现图形化调试Linux应用

一、环境: 1.远程Linux主机Ubuntu22.04; 2.vscode 1.76 二、环境搭建 1.Ubuntu 安装gdb、gdbserver、openssh-server 2.vscode 安装Remote Development、C/C 3.远程连接Linux 点击左下角的绿色按钮,然后选择connect to host----->…

Day1 组队竞赛、删除公共字符

✨个人主页: 北 海 🎉所属专栏: C/C相关题解 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 选择题1.C基础语法 编程题组队竞赛删除公共字符 选择题 1.C基础语法 题目:以下程序的运行结果是&am…

RSA加密为什么能保证安全

问题:我们都知道RSA加密是安全的,但是我们在使用的使用,怎么使用才能保证数据的安全传输呢? 一、原则:公钥机密、私钥解密、私钥签名、公钥验签 公钥私钥都可以加密和解密数据,但是因为持有公钥和私钥的人…

【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~

一、【期刊简介】 中科院2区软计算类SCI (TOP) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区; 【终审周期】走期刊部系统,3-5个月左右录用; 【检索情况】SCI&EI双检;正刊; 【数据库收录年份】2001年&#xff1…

【测试】概念篇

目录 🌟一、了解软件测试 🌈1、什么是软件测试 🌈2、软件测试与开发的区别(常考) 🌈3、一个优秀的软件测试人员应该具备的素质 🌟二、需求与测试用例、软件错误,软件生…

一旦80%的开发人员都开始利用ChatGPT提升工作效率后,挑战与机遇在哪里?

其实我现在已经开始逐渐开始喜欢上ChatGPT了,上班时间摸摸鱼,和ChatGPT畅谈一下理想,遇见一些不太熟练的代码也懒得去上网查了,直接问一问ChatGPT,然后自己再放置到自己的代码里,改一改,很完美。…

快递出入库管理APP开发 收发快递更方便

网购的盛行让收发快递成为很多人日常生活必不可少的一个环节,对于快递公司来说,每天有那么多的快递,如果没有一个好用的管理系统的话,不仅麻烦还很容易出现纰漏,所以快递出入库管理APP软件就显得很必要了。 快递…

python-imageio库简单使用

目录 imread_v2() get_reader() 使用imageio方法将彩色视频变为黑白视频 相关:python-动图制作及分解_觅远的博客-CSDN博客 imageio是一个用于读取和写入图像及视频数据的库,支持多种格式,且可以使用NumPy数组进行操作。常用方法&#xff…

JS逆向 -- 某平台登录加密分析

一、打开网站,使用账号密码登录 账号:aiyou123.com 密码:123456 二、通过F12抓包,抓到如下数据,发现密码加密了 三、加密结果是32位,首先考虑是md5加密。 四、全局搜索pwd,点击右上角&#xf…

C# 纯text文本字符添加上下角标

工作的需求,需要在GridView列HeaderText中插入带入带有上标和下标的字符串,比如这样的一个字符串:。。 解决办法:使用转义字符加Unicode的NumEntity就可以实现了。定义字符串如下:"O"。其中O为 。 实现&…

Linux系统目录树结构以及解释

FHS标准 Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最…

rk平台调试音频(从驱动到apk)

需要实现的功能: 输入:hdmiin、uvc、mic可以实时切换 输出:耳机和HDMI OUT同时输出声音 这里注意:mic是存在hedset情况,4节耳机,即可输出又可输出同时进行 开发情况: 一、先熟悉大致的Andro…

【24】核心易中期刊推荐——图像处理研究大数据及智能处理研究

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

springboot内嵌tomcat文件上传路径不存在问题原因

错误提示: 临时文件目录被删除,导致文件上传报错,我们使用的是linux系统,10天没有使用,就会被删除 代码: 解决办法: 配置文件中自定义临时文件上传目录 server:port: 9090tomcat:basedir: /crm/tmp 特殊情况: 当我上传小文件的时候可以上传成功,大文件的时候上传失败 猜测可…