Contents
Rootkit及检测实验
1.什么是 Rootkit
Rootkit 优势
- 攻击者想要保持 root 权限以持续进行渗透
○ 即使凭证修改或漏洞修补后也能保持权限 -
Hook 系统调用表来获得查看信息和获得控制能力
○ 可以查看所有网络通信
○ 可以隐藏文件和进程
○ 创建 root 权限进程
Rootkit 劣势
- 小 bug 可能会内核崩溃
- 内核的更新可能会有风险
- 有些环境会禁止一些内核模块(比如 Amazon EKS)
2. eBPF 介绍
“How about we add JavaScript-like capabilities to the Linux Kernel?”
— Thomas Graf, Isovalent, 2020
Isovalent 首席技术官兼联合创始人、eBPF 管理委员会主席 Thomas Graf 表示:“虽然 eBPF 已经被广泛部署并仍在快速发展中,但仍处于一个浪潮的开端,我们正在展望一个激动人心的未来,像 JavaScript 和其他语言对 Web 浏览器所做的那样,将 eBPF 看作是使操作系统可编程的方式。”
eBPF 技术允许用户在用户态编写代码,被 verifier 扫描鉴定无问题后,送入内核执行。
eBPF 技术能够在不修改内核代码的前提下,查看内核数据或修改内核功能。
eBPF 可以在 Linux 系统的各个地方插桩,在执行到指定位置时,执行用户自定的代码,实现数据的搜集和修改。
- eBPF (extended Berkeley Packet Filtering)
- Sandboxed programs in the Linux kernel
- eBPF allows you to create programmable trace points in the kernel
- Programs can be attached to:
○ Network Interfaces
○ Kernel functions
○ User mode functions - eBPF programs are guaranteed to be:
○ Safe
○ Efficient
○ Portable
3. eBPF Rootkit 相比传统 Rootkit 优势
- 不会使内核崩溃
- 最小的性能开销
- eBPF的安全并不是绝对的安全
○ 内核中存在一个Kernel eBPF Verifier
○ 只有特权进程才可以执行 bpf 系统调用
○ BPF 程序不能包含无限循环
○ BPF 程序不能导致内核崩溃
○ BPF 程序必须在有限时间内完成
4. eBPF Rootkit 效果示例
在 Black Hat 2021 的峰会中, Datadog 工程师 Guillaume Fournier 分享了《With Friends Like eBPF, Who Needs Enemies?》 介绍了 eBPF 的恶意利用,如何构建一个 rootkit ,入侵者会如何利用。 并把代码放在https://github.com/Gui774ume/ebpfkit 上,包括检测防御代码。
以及 DEF CON29 上的演讲
代码来源于 DEF CON29 峰会上安全研究员 Pat Hogan 分享的一篇关于 eBPF 的恶意利用案例:《Warping Reality – creating and countering the next generation of Linux rootkits using eBPF》 ,介绍了 eBFP rootkit 的应用场景,包括网络、运行时等,以及如何检测 eBPF 的恶意利用等。代码在https://github.com/pathtofile/bad-bpf 。
以 Hogan 分享的一篇关于 eBPF 的恶意利用案例:《Warping Reality – creating and countering the next generation of Linux rootkits using eBPF》 代码为例讲解
https://github.com/pathtofile/bad-bpf
bad-bpf 编译出的可执行文件
4.1 隐藏进程
pidhide 程序通过 hook getdents64 系统调用来取消与PID相关联的 /proc/ 文件夹的链接,而 ps 是通过查找 /proc/ 中的每个子文件夹工作的。
4.1.1 查看原始进程
docker 运行了 ubuntu 镜像的 “/bin/bash”命令,进程 pid 为 19538
4.1.2 运行 eBPF Rootkit
运行 eBPF Rootkit 后,查看进程
查看 /proc 文件夹
4.1.3 隐藏进程 Rootkit 检测
这种简单的 hook 方式会被常用的 Rootkit 检测工具检查出来,如 chkrootkit
4.2 劫持新建进程
exechijack 程序会劫持所有用于创建新进程的 execve 系统调用,转而调用 /a :只输出 uid 和 argv[0]
4.2.1 运行 eBPF Rootkit
多命令同时使用时成功率较高
4.2.2 劫持进程 Rootkit 检测
此时由于新建进程都会被劫持,所以无法启动 chkrootkit 检测程序
改进:可以对于常见的 Rootkit 检测程序,可以定制化启动为虚假检测程序,来骗过用户
4.3 低权限用户提权
该程序允许通常低权限的用户使用 sudo 成为 root。
它的工作原理是拦截 sudo 对 /etc/sudoers 文件的读取,并用
4.3.1 查询用户权限
查询 lowpriv-user 在本机是否拥有 sudo 权限
4.3.2 运行 eBPF Rootkit
运行后,lowpriv-user 用户可以暂时成为 root 用户
4.3.3 用户暂时提权 Rootkit 检测
未能检测出明显问题
5. eBPF Rootkit 的检测手段
5.1 Datadog 的方法
5.1.1 从源码入手
根据 GPL 协议要求代码开源,并查看源码中的敏感 eBPF 调用
5.1.2 构建工具
使用工具“ ebpfkit-monitor ”
ebpfkit-monitor 是一个可用于静态分析 eBPF 字节码或在运行时监控可疑的 eBPF 活动的程序。它是专门为检测 ebpfkit 而设计的。
clang/llvm 编译生成的 target 为 bpf 的 ELF 文件,使用 load_bpf_file 函数加载进入内核
因此 ebpfkit-monitor 侧重于分析 ELF 文件
5.2 pathtofile 的方法
5.2.1 禁用所有的 eBPF 调用
优点:安全
缺点:需要重新编译内核,关闭 eBPF ,会缺失很多功能,且不一定都适用
示例如下
该程序向任何尝试使用 ptrace 系统调用的程序发出 SIG_KILL 信号,例如 strace
5.2.2 对 eBPF 代码进行签名
优点:对 eBPF 代码进行签名会防止 eBPF 的滥用,并加强安全性
缺点:对 JIT 编译器有要求