【问题标题】:How to use BPF to filter kernel function arguments?如何使用 BPF 过滤内核函数参数?
【发布时间】:2016-12-04 21:24:57
【问题描述】:

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

我搜索了互联网,但找不到任何用例。大部分资料只描述了如何使用seccomp / seccomp-BPF。

eBPF 和 kprobe/jprobe 似乎集成在一起来实现挂钩。但是我在网上找不到一个很好的例子。

【问题讨论】:

    标签: linux-kernel sandbox chroot bpf seccomp


    【解决方案1】:

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

    特别是,the example tool argdist 确实依赖于 kprobes,您可能会感兴趣:

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

    例如,假设您想找出常见的分配大小 您的申请:

    # ./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 目录下。)

    【讨论】:

    • 如果发现错误的函数参数,它可以改变控制流(例如,直接返回)吗?
    • 啊,嗯。我不这么认为,但不能确定:-/ 例如,它可以过滤参数并仅检索“坏”的参数,但return values 似乎不会干扰观察到的函数的执行。 bcc 的开发人员应该能够更准确地回答这个问题——对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2020-08-22
    • 2013-11-18
    相关资源
    最近更新 更多