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

时间:2016-07-30 06:28:47

标签: linux-kernel sandbox chroot bpf seccomp

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

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

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

1 个答案:

答案 0 :(得分:3)

eBPF 可能就是您想要的。如果您还没有找到它们,则应该查看the bcc (BPF Compiler Collection) tools提供的示例。

特别是,the example tool argdist确实依赖于kprobes而且可能对您有一些兴趣:

  

argdist探测您指定的函数并将参数值收集到a中   直方图或频率计数。这可以用来理解分布   值的某个参数需要,过滤和打印有趣的参数   无需附加调试器,并获取常规执行统计信息   各种功能。

     

例如,假设您要查找常见的分配大小   你的申请:

# ./argdist -p 2420 -C 'p:c:malloc(size_t size):size_t:size'
[01:42:29]
p:c:malloc(size_t size):size_t:size
       COUNT      EVENT
[01:42:30]
p:c:malloc(size_t size):size_t:size
COUNT EVENT
     

[...]

(摘自argdist example uses)。

为了记录,我到目前为止发现的大多数eBPF示例都位于其中一个位置:

  • 在Linux内核源代码中的linux/samples/bpf下。
  • 在密送的bcc/tools目录中。
  • (有关涉及tc的网络示例,位于iproute2包源中的iproute2/examples/tc目录下。)