我们的eBPF工具库
Trail of Bits开发了一套开源库来简化eBPF应用的创建和部署。这些库支持高效的进程/网络事件监控、函数追踪、内核调试符号解析和eBPF代码生成。传统部署方式受限于Linux内核版本差异和C到eBPF字节码的外部转换工具,我们通过创新库解决了这些问题——它们利用最新eBPF和Linux内核特性减少外部依赖。这些工具适用于构建主机代理和云原生监控,兼容多种Linux发行版和内核版本,部分已被osquery终端可视化框架集成。
核心组件
该套件包含四个库:
- linuxevents:无运行时依赖的容器感知进程监控库
- ebpfpub:支持多内核版本的函数追踪库
- btfparse:解析BTF格式内核调试符号的C++库
- ebpf-common:辅助开发eBPF工具的C++基础库
linuxevents:零依赖的容器感知监控库
该库通过Linux内核的BTF调试数据(借助btfparse库)自动识别函数原型和内核数据结构,无需准确内核头文件或预编译eBPF字节码。其特点包括:
- 运行时代码生成能力,支持动态创建探针
- 比传统系统调用挂钩快3倍(如直接挂钩
sched_process_exec
而非多个exec变体) - 通过内核VFS层直接提取路径信息,避免高开销的文件描述符关联操作
演示:使用linuxevents库实现的execsnoop示例
当前该库作为实验性功能集成在osquery中,提供跨容器可见性的进程追踪示例。
ebpfpub:Linux函数追踪库
支持通过自定义语言从函数原型自动生成eBPF探针,可采用三种底层机制:
- 内核跟踪点(tracepoints)
- 动态探针(kprobes)
- 用户态探针(uprobes)
包含五个实用示例:
execsnoop
:通过execve()跟踪程序执行kprobe_execsnoop
:改用kprobes机制的exec跟踪readline_trace
:挂钩readline库监控交互式shellsockevents
:追踪socket连接建立过程systemd_resolved
:实时监控systemd的DNS查询
虽然仍被osquery用于进程/socket事件捕获,但新项目建议改用linuxevents方案。
btfparse:BTF格式解析库
BTF(二进制类型格式)是Linux内核4.20+引入的紧凑调试数据格式,特点包括:
- 比DWARF体积小50%
- 支持结构体/联合体/枚举等复杂类型表达
- 提供标准化跨编译器类型数据
该库可直接在C++项目中读取BTF数据并生成内存头文件,配套工具btf-dump
可转储内核镜像中的BTF信息。
ebpf-common:eBPF开发基础库
作为所有工具的核心支撑,提供以下关键功能:
- 通过LLVM/clang实现内存中C代码到eBPF字节码的编译
- 简化eBPF数据结构(哈希表/数组/环形缓冲区等)的访问接口
- 支持perf事件读写机制
- 管理kprobes/uprobes等事件触发器
- 通过LLVM实现eBPF辅助函数
参考《All your tracing are belong to BPF》获取完整使用指南。
配套工具与资源
-
ebpfault:基于eBPF的系统调用故障注入器,支持:
- 针对性进程故障注入
- JSON配置故障概率与错误码
- 避免传统内核驱动崩溃风险
-
技术深度解析:
- 博客文章详解从零构建eBPF追踪工具
- 演讲《Monitoring Linux events》分享运行时代码生成实践
-
生态贡献:
- ebpf-verifier:实现内核外eBPF程序验证
- Solana ARM64 JIT编译器:将区块链智能合约移植到Apple Silicon
- Windows版CMake支持:改进eBPF在Windows的构建体验
未来展望
这些工具已为osquery等系统提供高质量监控数据。eBPF在云原生监控领域潜力巨大,我们将持续分享开发经验。所有项目已在GitHub开源,欢迎开发者参与共建。