如何使用BPF过滤内核函数参数?

Win*_*ser 5 chroot sandbox linux-kernel seccomp bpf

如何使用Berkeley Packet Filter(BPF)过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用.此外,最好能够取消引用函数参数中的指针以进行验证.

我搜索了互联网,但找不到任何用例.大多数材料仅描述了如何使用seccomp/seccomp-BPF.

似乎整合了eBPF和kprobe/jprobe来实现挂钩.但我无法在网上找到一个好的例子.

Qeo*_*ole 4

eBPF可能就是您想要的。如果您还没有找到它们,您应该查看bcc(BPF 编译器集合)工具提供的示例。

\n\n

特别是,示例工具argdist确实依赖于 kprobes,并且您可能会感兴趣:

\n\n
\n

argdist 探测您指定的函数并将参数值收集到直方图或频率计数中。这可用于了解某个参数所取值的分布,过滤并打印感兴趣的参数,而无需附加调试器,并获取各种函数的一般执行统计信息。

\n\n

例如,假设您想要查找应用程序中常见的分配大小:

\n\n
# ./argdist -p 2420 -C \'p:c:malloc(size_t size):size_t:size\'\n[01:42:29]\np:c:malloc(size_t size):size_t:size\n       COUNT      EVENT\n[01:42:30]\np:c:malloc(size_t size):size_t:size\nCOUNT EVENT\n
Run Code Online (Sandbox Code Playgroud)\n\n

[\xe2\x80\xa6]

\n
\n\n

(摘自argdist 示例使用)。

\n\n

根据记录,到目前为止我发现的大多数 eBPF 示例都位于以下位置之一:

\n\n
    \n
  • linux/samples/bpf在 Linux 内核源码下。
  • \n
  • bcc/toolsbcc的目录下。
  • \n
  • (对于涉及 的网络示例tc,位于iproute2/examples/tciproute2 包源目录下。)
  • \n
\n