Trail of Bits开源eBPF工具套件:高效内核监控与事件追踪

本文详细介绍Trail of Bits开发的四款eBPF开源工具库,包括容器感知的进程监控库linuxevents、跨内核版本函数追踪库ebpfpub、BTF调试符号解析器btfparse以及eBPF代码生成工具ebpf-common,这些工具已应用于osquery等知名框架。

我们的eBPF工具库

Trail of Bits开发了一套开源库来简化eBPF应用的创建和部署。这些库支持高效的进程/网络事件监控、函数追踪、内核调试符号解析和eBPF代码生成。传统部署方式受限于Linux内核版本差异和C到eBPF字节码的外部转换工具,我们通过创新库解决了这些问题——它们利用最新eBPF和Linux内核特性减少外部依赖。这些工具适用于构建主机代理和云原生监控,兼容多种Linux发行版和内核版本,部分已被osquery终端可视化框架集成。

核心组件

该套件包含四个库:

  1. linuxevents:无运行时依赖的容器感知进程监控库
  2. ebpfpub:支持多内核版本的函数追踪库
  3. btfparse:解析BTF格式内核调试符号的C++库
  4. ebpf-common:辅助开发eBPF工具的C++基础库

linuxevents:零依赖的容器感知监控库

该库通过Linux内核的BTF调试数据(借助btfparse库)自动识别函数原型和内核数据结构,无需准确内核头文件或预编译eBPF字节码。其特点包括:

  • 运行时代码生成能力,支持动态创建探针
  • 比传统系统调用挂钩快3倍(如直接挂钩sched_process_exec而非多个exec变体)
  • 通过内核VFS层直接提取路径信息,避免高开销的文件描述符关联操作

演示:使用linuxevents库实现的execsnoop示例

当前该库作为实验性功能集成在osquery中,提供跨容器可见性的进程追踪示例。


ebpfpub:Linux函数追踪库

支持通过自定义语言从函数原型自动生成eBPF探针,可采用三种底层机制:

  • 内核跟踪点(tracepoints)
  • 动态探针(kprobes)
  • 用户态探针(uprobes)

包含五个实用示例:

  1. execsnoop:通过execve()跟踪程序执行
  2. kprobe_execsnoop:改用kprobes机制的exec跟踪
  3. readline_trace:挂钩readline库监控交互式shell
  4. sockevents:追踪socket连接建立过程
  5. 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》获取完整使用指南。


配套工具与资源

  1. ebpfault:基于eBPF的系统调用故障注入器,支持:

    • 针对性进程故障注入
    • JSON配置故障概率与错误码
    • 避免传统内核驱动崩溃风险
  2. 技术深度解析

    • 博客文章详解从零构建eBPF追踪工具
    • 演讲《Monitoring Linux events》分享运行时代码生成实践
  3. 生态贡献

    • ebpf-verifier:实现内核外eBPF程序验证
    • Solana ARM64 JIT编译器:将区块链智能合约移植到Apple Silicon
    • Windows版CMake支持:改进eBPF在Windows的构建体验

未来展望

这些工具已为osquery等系统提供高质量监控数据。eBPF在云原生监控领域潜力巨大,我们将持续分享开发经验。所有项目已在GitHub开源,欢迎开发者参与共建。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计