bpf_probe_write_user 利用:eBPF 程序可以访问一组有限的辅助函数,这些函数内置于内核中。基于 eBPF 恶意利用的一个助手就是 bpf_probe_write_user。此函数允许 eBPF 程序写入当前正在运行的进程的用户空间内存。恶意利用可以使用这种能力在系统调用期间修改进程的内存,例如 bad-bpfsudo 在读取时写入用户空间内存 /etc...
利用:eBPF 程序可以访问一组有限的辅助函数,这些函数内置于内核中。基于 eBPF 恶意利用的一个助手就是 bpf_probe_write_user。此函数允许 eBPF 程序写入当前正在运行的进程的用户空间内存。恶意利用可以使用这种能力在系统调用期间修改进程的内存,例如 bad-bpfsudo 在读取时写入用户空间内存 /etc/sudoers。它注入了一...
实现这个功能需要使用到 eBPF 的 bpf_probe_write_user 功能,它可以修改用户空间的内存,因此能用来修改 getdents64 返回的结果。 下面,我们会详细介绍如何在内核态和用户态编写 eBPF 程序来实现进程隐藏。 内核态 eBPF 程序实现 接下来,我们将详细介绍如何在内核态编写 eBPF 程序来实现进程隐藏。首先是 eBPF 程序...
(1)bpf_probe_read:安全地从内核空间读取数据 (2)bpf_probe_write_user:尝试以一种安全的方式向用户态空间写数据 (3)bpf_override_return:用于error injection,可以用于修改kprobe监控的函数返回值 这些helper提供了读写整个机器上任意进程用户态空间的功能,同时提供了内核空间的读取数据功能,当攻击者能向内核加载eB...
在图1所示的流程中,我们既可以在eBPF程序中使用辅助函数bpf_probe_read_user读取read操作获取到的文件内容(图1中buf指针指向的用户态内存数据),又可以使用辅助函数bpf_probe_write_user改写这个文件内容。这种可以在内核中读取和改写用户态内存的能力非常强大,它不仅为我们实现复杂的安全审计和拦截需求提供了支持,同时也...
基于 eBPF 恶意利用的一个助手就是 bpf_probe_write_user。此函数允许 eBPF 程序写入当前正在运行的进程的用户空间内存。恶意利用可以使用这种能力在系统调用期间修改进程的内存,例如 bad-bpfsudo 在读取时写入用户空间内存 /etc/sudoers。它注入了一个额外 code,允许特定用户使用该 sudo 命令。
要实现进程隐藏,关键在于操作/proc/目录。在 Linux 中,getdents64系统调用可以读取目录下的文件信息。我们可以通过挂接这个系统调用,修改它返回的结果,从而达到隐藏文件的目的。实现这个功能需要使用到 eBPF 的bpf_probe_write_user功能,它可以修改用户空间的内存,因此能用来修改getdents64返回的结果。
不仅如此,eBPF 还有能力往用户空间任意进程的任意地址写入数据(bpf_probe_write_user[7]),有限度地修改内核函数的返回值(bpf_override_return[8]),甚至在内核态直接执行某些系统调用[9];所幸的是,eBPF 在加载进内核之前对字节码会进行严格的安全检查,确保没有内存越界等操作,同时,许多可能会扩大攻击面、带来安全...
基于 eBPF 恶意利用的一个助手就是 bpf_probe_write_user。此函数允许 eBPF 程序写入当前正在运行的进程的用户空间内存。恶意利用可以使用这种能力在系统调用期间修改进程的内存,例如 bad-bpfsudo 在读取时写入用户空间内存 /etc/sudoers。它注入了一个额外 code,允许特定用户使用该 sudo 命令。限制 (1)如果内存...
应用发起read/write/connect等系统调用 TCP 发生重传 网络包达到网卡 这很类似hook系统函数的行为,我们知道hook系统函数修改原有逻辑很容易会造成系统崩溃,那么 Linux 内核是如何实现 eBPF 程序的安全和稳定的呢? 首先,ebpf程序并不是传统意义上的一个ELF执行程序,而是一段BPF字节码,这段字节码会交给内核的ebpf虚拟机...