一,工具简介

inject工具可以保证在给定调用链和一组可选的predicate的情况下,指定注入模式(kmalloc、bio等)的适当错误返回。此外,还可以选择打印生成的BPF程序,以供修改/调试之用。

生成的程序在PID索引的堆栈上运行。一般来说,为了实现“仅在此调用链和这些predicate存在时失败”的目标,会在每个中间函数的kprobe/kretprobe上进行记录。

Top层函数(调用链末端的函数)负责在kprobe中创建pid_struct,并在kretprobe中将其从映射中删除。

中间层函数(位于should_fail_whatever和顶级函数之间)负责在其入口探测中更新堆栈,以指示“我已被调用,并且我的一个或多个predicate已通过”。在其出口探测中,它们执行相反的操作,弹出堆栈以保持正确性。此实现旨在确保在递归调用等边缘情况下的正确性,因此在pid_struct中存储了一些额外的信息。

在底层函数(should_fail_whatever)中,我们进行简单的检查,以确保在注入错误之前所有必要的调用/predicate都已通过。

注意:目前有一些技巧可以绕过各种重写器/验证器问题。使能该工具,需要我们内核在编译时,支持CONFIG_BPF_KPROBE_OVERRIDE的配置。

上面的predicate,特别是在BPF中,通常指的是一个布尔函数,它基于某些条件返回真(true)或假(false)。在BPF中,predicate可以用来决定是否应该执行某个特定的动作,比如是否应该丢弃一个网络包,或者是否应该收集某些类型的信息。

02-25 14:32