系统调用 openat 和 sys_enter_openat 有什么区别?

火狐

我看到对于 python BCC 实现,系统调用__x64_sys_openat用于附加 kprobe,但是在libbpf 实现中,kprobe 附加到sys_enter_openat. 似乎两者都捕获openat()系统调用,我用cat file.txt.

它们之间有什么区别?哪一个更可靠?

Qeole

__x64_sys_openat是Linux 内核中某个函数的名称,BCC 附加了一个 kprobe。

sys_enter_openat是 Linux 中跟踪点的名称,这意味着这是一个(或多或少)稳定的接口,您可以将其挂钩以进行跟踪,包括使用 eBPF 程序。您可以通过列出 下的条目来查看系统上的可用跟踪点/sys/kernel/debug/tracing/events/我认为 BCC 也有一个实用程序tplist来帮助它。

如果可以选择,我建议尽可能挂在跟踪点上,因为它们往往比内核内部更稳定:例如,参数__x64_sys_openat或该函数的名称可能会在不同的内核版本之间发生变化;或者名称会在其他架构上更改,等等但是,跟踪点不太可能改变。请注意,对于带有 CO-RE 的 eBPF,内核内部的不稳定性在一定程度上得到了缓解。

那么并不总是可以挂钩到跟踪点:您只能使用内核中现有的跟踪点之一。如果您想挂钩到另一个不存在跟踪点的随机函数(并假设此函数在编译时未内联 - 通过在 中查找来检查/proc/kallsyms),那么您想使用 kprobe。

有时您还需要特别注意钩住的位置。例如,对于安全用例(即阻止系统调用),系统调用跟踪点(或相应的内核函数,显然)并不总是最好的挂钩点,因为它们可能使您容易受到 TOCTOU 攻击。LSM 挂钩可能是该用例的一个很好的解决方案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章