【Tetragon / eBPF】Sensor 与 Hook:进程传感器、kprobe、tracepoint、uprobe、LSM 与 fentry

💡 原文中文,约12600字,阅读约需30分钟。
📝

内容提要

本文介绍Tetragon v1.7.0的Sensor与Hook机制。核心是`__base__`传感器负责进程生命周期(exec/clone/exit)并维护execve_map,TracingPolicy则按类型另挂kprobe、tracepoint、uprobe、LSM和fentry程序。选错Hook类型会导致无事件、参数错误或TOCTOU问题。LSM需CONFIG_BPF_LSM支持,fentry不支持enforcement。

🔎

延伸解读

选错 Hook 类型的典型失败表象

文章指出,选错 Hook 类型不会导致 YAML 未应用,而是表现为无事件、参数错误或 TOCTOU 问题。例如,kprobe 符号前缀错误导致加载失败;hook sys_open 却读内核 struct file 会得到错误参数;returnCopy 未开启导致缓冲区为空;tracepoint 的 format index 与 raw 原型 index 混用;uprobe 路径指向容器内路径而 agent 看到主机 mount。这些表象可帮助快速定位问题。

LSM 与 fentry 的配置前提

LSM 钩子需要内核 CONFIG_BPF_LSM=y 且 /sys/kernel/security/lsm 列表包含 bpf,否则加载被拒。fentry 在 v1.7.0 中通过 spec.fentries 提供,但明确不支持 enforcement 动作,若选择器含 enforcement 会在用户态加载失败。fentry 依赖 BTF 与 tracing 类程序,加载失败时表象与 kprobe 符号缺失类似,应查 agent 日志与 BTF。

TOCTOU 风险与规避

文章强调,hook 系统调用且参数是用户态指针时存在 TOCTOU 风险:用户态可在 hook 之后、内核消费之前修改内存。要观察内核已拷贝的对象,应改挂稍后的函数或 LSM security_* 钩子。LSM 参数已是内核对象,将检查点移到内核驻留状态,但并非消灭竞态。这为选择 hook 位置提供了依据。

Q&A

Tetragon中__base__传感器的作用是什么?

在Tetragon v1.7.0中,__base__传感器负责进程生命周期事件(exec、clone、exit)并维护execve_map。它加载一组固定程序,如Execve、Fork、Exit等,确保进程事件被正确捕获。TracingPolicy不会替代__base__,而是额外挂载动态hook。

Tetragon支持哪些hook类型?它们分别用于什么场景?

Tetragon v1.7.0支持kprobe/kretprobe、tracepoint/raw tracepoint、uprobe/USDT、LSM和fentry。kprobe用于任意内核函数入口,tracepoint用于稳定内核埋点,uprobe用于用户态函数,LSM用于安全钩子,fentry用于带BTF的函数入口。

在Tetragon中,为什么选择错误的hook类型会导致无事件或参数错误?

选择错误的hook类型会导致事件无法触发或参数解析错误。例如,kprobe需要正确的符号和ABI,tracepoint需要正确的format索引,uprobe需要正确的二进制路径和符号。此外,syscall kprobe存在TOCTOU问题,可能导致读取到用户态指针的过时数据。

Tetragon中LSM hook的使用前提是什么?

使用LSM hook需要内核启用CONFIG_BPF_LSM,并且/sys/kernel/security/lsm列表中包含bpf。否则需要将bpf添加到LSM启动参数并重启。

Tetragon中fentry支持enforcement吗?

不支持。在Tetragon v1.7.0中,如果fentry的选择器包含enforcement动作,加载会在用户态失败,并返回错误“enforcement is not supported for fentry yet”。

Tetragon中uprobe和USDT有什么区别?

uprobe挂载用户态函数的任意位置,需要指定二进制路径和符号;USDT是用户态静态定义的跟踪点,通过ELF stapsdt note定义,每个probe最多支持5个参数。uprobe不支持内核结构体resolve,而USDT可以通过tetra tracingpolicy generate usdts生成策略骨架。

Tetragon中tracepoint和raw tracepoint有何不同?

tracepoint使用perf格式化后的字段,参数布局从format文件读取;raw tracepoint直接使用TRACE_EVENT的原始原型,绕过perf层,通常更快,但参数索引语义不同。

Tetragon中kprobe的TOCTOU问题是什么?如何避免?

TOCTOU问题指在hook系统调用时,用户态指针参数可能在hook之后、内核消费之前被修改,导致读取到不一致的数据。避免方法是挂载更晚的函数或使用LSM security_*钩子,因为此时内核已拷贝参数。

🏷️

标签

➡️

继续阅读