基于 eBPF 技术的内核级 Rootkit 研究项目
eBPFRootkit 是一个实验性的安全研究项目,探索 eBPF(extended Berkeley Packet Filter)技术在 Linux 内核层面的高级应用。本项目深受以下优秀开源项目的启发:
- ebpfkit - 功能完整的 eBPF rootkit,展示了网络监控、容器逃逸和持久化技术
- TripleCross - 强大的 Linux eBPF rootkit,实现了后门、C2、库注入和执行劫持
- bad-bpf - eBPF 恶意行为示例集合,演示内核与用户态交互
本项目旨在通过实践这些技术,帮助安全研究人员和防御工程师更好地理解 eBPF 技术的双刃剑特性,并为构建针对性的检测和防御机制提供参考。
- ✅ 进程隐藏 - 通过 Hook
getdents64系统调用隐藏指定进程 - ✅ 文件隐藏 - 从目录列表中隐藏特定文件
- ✅ eBPF 尾调用 - 突破 eBPF 循环限制,处理大型目录
- ✅ 内核级别操作 - 无需修改文件系统,直接在内核层面实施隐藏
- ✅ CO-RE 支持 - 一次编译,跨内核版本运行
- 🔄 网络流量操控 - 透明代理和流量重定向
- 🔄 系统调用拦截 - 动态修改关键系统调用行为
- 🔄 命令与控制(C2) - 实现隐蔽的远程控制通道
- 🔄 内存注入 - 向目标进程注入代码
- 🔄 持久化机制 - 系统重启后自动加载
- 🔄 反取证技术 - 逃避常见的安全检测工具
┌─────────────────────────────────────┐
│ 用户态 (User Space) │
├─────────────────────────────────────┤
│ rootkit.c (控制程序) │
│ - 加载 eBPF 程序 │
│ - 设置过滤规则 │
│ - 读取内核数据 │
└──────────────┬──────────────────────┘
│ libbpf
┌──────────────▼──────────────────────┐
│ 内核态 (Kernel Space) │
├─────────────────────────────────────┤
│ rootkit.bpf.c (eBPF 程序) │
│ - Tracepoint Hooks │
│ - Kprobe/Kretprobe Hooks │
│ - eBPF Maps (数据存储) │
│ - 尾调用 (Tail Calls) │
└─────────────────────────────────────┘
- eBPF 程序 (
rootkit.bpf.c) - 运行在内核态的核心逻辑 - 用户态控制程序 (
rootkit.c) - 管理和配置 eBPF 程序 - eBPF Maps - 内核与用户态的数据交换通道
- vmlinux.h - BTF 类型信息,实现 CO-RE
- libbpf - eBPF 程序加载和管理库
| 组件 | 技术 | 说明 |
|---|---|---|
| 内核程序 | C + eBPF | 使用 eBPF 字节码在内核态运行 |
| 编译工具链 | LLVM/Clang | 生成 eBPF 字节码 |
| 类型信息 | BTF (BPF Type Format) | 实现 CO-RE 跨内核兼容 |
| 用户态库 | libbpf | eBPF 程序的加载和管理 |
| 构建工具 | Makefile | 自动化编译流程 |
- Linux 内核版本 >= 5.8(支持 BTF 和 CO-RE)
- LLVM/Clang >= 10
- libbpf 开发库
- bpftool
sudo apt update
sudo apt install -y clang llvm libelf-dev linux-headers-$(uname -r) \
build-essential libbpf-dev linux-tools-genericsudo dnf install -y clang llvm elfutils-libelf-devel kernel-devel \
libbpf-devel bpftool# 克隆项目
git clone https://github.com/your-username/ebpfRootkit.git
git submodule update --init --recursive
cd ebpfRootkit
# 编译
make
# 生成的可执行文件
./rootkit# 以 root 权限运行(eBPF 需要 CAP_BPF 或 root 权限)
sudo ./rootkit// 在 rootkit.bpf.c 中配置要隐藏的进程 ID
const volatile char pid_to_hide[MAX_PID_LEN] = "1234";# 列出已加载的 eBPF 程序
sudo bpftool prog list
# 查看 eBPF Map 内容
sudo bpftool map dump name map_buffs# eBPF 程序在用户态程序退出后自动卸载
# 或手动通过 PID 卸载
sudo bpftool prog detach id <prog_id>目标:隐藏指定 PID 的进程,使其在 ps、top 等工具中不可见。
实现原理:
- Hook
sys_getdents64系统调用 - 过滤掉目标 PID 对应的目录项
- 调整返回的目录条目大小
测试步骤:
# 1. 启动一个测试进程
sleep 3600 &
echo $! # 记录 PID,假设为 12345
# 2. 配置并运行 rootkit(修改代码中的 pid_to_hide)
sudo ./rootkit
# 3. 验证隐藏效果
ps aux | grep 12345 # 不会显示该进程
ls -la /proc/ | grep 12345 # /proc 目录中不可见原理:与进程隐藏类似,通过过滤 getdents64 返回结果实现。
- eBPF 官方文档
- libbpf - eBPF libbpf 入门
- BPF CO-RE 参考指南
- 本项目仅用于合法的安全研究和教育目的
- 未经授权在生产环境或他人系统上使用本工具是违法行为
- 作者不对任何滥用行为承担责任
- 使用者需自行承担所有法律风险
- ✅ 在自己的系统上进行安全研究
- ✅ 获得明确授权的渗透测试
- ✅ 学术研究和教学
- ✅ 安全产品的检测能力测试
- ❌ 未经授权访问他人系统
- ❌ 窃取机密信息
- ❌ 破坏系统功能
- ❌ 任何形式的非法活动
欢迎提交 Issue 和 Pull Request!贡献前请阅读以下规范:
- 代码风格遵循 Linux 内核编码规范
- 提交前请确保代码可以编译通过
- 添加必要的注释和文档
- 新功能需要包含使用说明
本项目的实现参考和学习了以下优秀开源项目:
| 项目 | 作者 | 特点 | 链接 |
|---|---|---|---|
| ebpfkit | Gui774ume | 完整的 eBPF rootkit 框架,C2 功能 | GitHub |
| TripleCross | h3xduck | 后门、库注入、执行劫持 | GitHub |
| bad-bpf | pathtofile | eBPF 恶意行为示例集合 | GitHub |
- eBPF 内核程序 (
rootkit.bpf.c) 采用 GPL v2 许可证 - 用户态代码 (
rootkit.c) 采用 GPL v2 许可证
eBPF 程序必须使用 GPL 兼容许可证才能加载到 Linux 内核。
- Issues: 通过 GitHub Issues 报告问题
- 讨论: 通过 GitHub Discussions 参与讨论
⚡ 仅供安全研究和教育使用 ⚡
请负责任地使用技术,共同维护网络安全