土法炼钢 · 系统与基础设施

【Tetragon / eBPF】对照替代路径:Falco、auditd、Cilium CNP/Hubble 与 seccomp

文章导航

分类入口
kubernetessecurity
标签入口
#tetragon#falco#auditd#seccomp#cilium#toctou#runtime-security#v1.7.0

目录

前 13 篇把一次运行时安全事件从 exec_id 与 hook 讲到选择器、强制执行与五轴排障。接下来的问题不是「Tetragon 功能全不全」,而是:什么时候内核态 TracingPolicy 的税不值得付——Falco 规则库已经覆盖检测、主机 auditd 已满足合规留存、东西向只需 Cilium NetworkPolicy 与 Hubble、或 seccomp 白名单已经卡住 syscall 编号。

本文不做 CPU 或内存排行榜。跨方案开销比较需要固定内核、规则规模、是否开强制执行、导出是否全量;单个百分比是口径欺骗。站内 linux/ebpf-security 对照表里的 CPU% 与「约 200MB / 150MB」本系列不引用。产品勾选级对照见 observability/15,本篇不重写那一节。这里只钉机制分歧:过滤在哪发生,阻断能不能跟这次内核操作同一条路径。

本篇在系列中的位置

篇目 核心内容
第 13 篇 · 排障坐标系 按五轴归因
第 14 篇 · 对照替代路径 Falco / auditd / CNP·Hubble / seccomp
第 15 篇 · Runtime Hooks OCI hook 与容器边界
系列目录 全部篇目

版本锚定:Tetragon v1.7.0。对照结论是机制判断。Falco / auditd / seccomp 版本随各自发行说明;CVE-2022-26316 钉的是 Falco 低于 0.31.1 的检查窗口,不是「今日 Falco 仍未修」。


一、对照 Falco:驱动采集,规则在用户态

Falco 官方把内核事件源称为 driver:现代 eBPF probe(文档中的默认路径之一)或内核模块。libscap 从 driver 取 syscall 事件,libsinsp 做状态富化,规则引擎在用户态求值(见 Falco Kernel Events / Kernel Events Architecture 与 falcosecurity/libs 对 libscap/libsinsp 的分工)。Tetragon 的 TracingPolicy 选择器默认在 BPF 程序内匹配,匹配后可以 PostOverrideSignal第 7 篇第 10 篇)。

这不是「谁也用了 eBPF」的同义词。eBPF 在 Falco 里首先是把 syscall 上下文送出内核的驱动;在 Tetragon 里首先是策略判定与可选强制执行的挂载点。Falco 的规则库、插件源、生态响应流程是它赢的前提;Tetragon 赢在与 Kubernetes CRD 同一控制面、以及(在内核能力允许时)inline Override。

工业反例:GHSA-6v9j-2vm2-ghf7 / CVE-2022-26316

GitHub Advisory GHSA-6v9j-2vm2-ghf7(CVE-2022-26316,2022-03-11,影响 Falco 低于 0.31.1,修复 0.31.1)写明:处理 connectopenopenatcreat 时,Falco 在 syscall 退出时用户态缓冲区再读部分参数。恶意程序可以拉长这次 syscall,并在调用发出之后、执行完成之前改掉自己地址空间里的缓冲区。Falco 随后把改过的数据当成「这次调用的输入」,规则可能被绕过。公告给出两类具体窗口:慢 TCP 握手的 C2 connect(),以及经 FUSE/SSHFS 等引入额外 IO 延迟的文件名隐藏。内核模块、eBPF probe、用户态 instrumentation 均受影响。

这是 B 级工业反例,不是 Falco 百科,也不是「Falco 不可用」的判决。它验证的是 Garfinkel NDSS 2003 §4.3.3 的 argument race:监视器读到的用户内存,不必等于内核稍后真正使用的那一份。修复版本改变了采集窗口;机制问题并没有从操作系统里消失。任何仍在用户态解析 argv/sockaddr 的工具,都要重新回答「检查与使用是否同一副本」。

Tetragon 把匹配下沉到 kprobe/LSM 等 hook,读的是进入该 hook 时的参数视图,并可用 Override 让函数不执行。这缩小的是「用户态规则引擎 vs 内核已完成的 syscall」这一段,不是 Bishop & Dilger 意义上的全部 TOCTTOU(路径在 check 与 use 之间仍可被并发改写)。官方 TracingPolicy 文档自己警告低层配置会引入 TOCTOU。对照应写成:过滤位置不同,剩余竞态不同,而不是「Tetragon 消灭了竞态」。


二、对照 auditd:内核审计通道,不是 inline 策略机

Linux Audit(auditd(8)audit.rules(7)、内核 CONFIG_AUDIT / CONFIG_AUDITSYSCALL)把选定 syscall 与文件监视编成记录,经 netlink 送给用户态 auditd。规则可以在内核侧按列表类型(user / exit / exclude 等)过滤,也可以在用户态再筛。它解决的是可审计留存与合规证明,不是 TracingPolicy 那种「匹配则改返回值」。

机制问题 auditd 典型答案 Tetragon v1.7.0
事件何时产生 内核审计钩子写出记录 kprobe/tracepoint/LSM/fentry 等 sensor
丰富规则 审计规则语言;字段相对固定 TracingPolicy selector + 可选 CEL-in-BPF(本系列不展开 CEL 全书)
能否让本次调用失败 不提供函数级 Override Override / Signal(各有保证,见第 10、13 篇)
与 K8s 身份 需自行拼容器元数据 TracingPolicyNamespaced / podSelector;无 hook 时 best-effort
失败方言 backlog 丢记录、auditd 停写 五轴:加载键、BTF、sink、Override config

auditd 赢在的前提:合规要的是主机 syscall 账本,编制已有 audit 规则与 SIEM 解析器,不需要按 Pod 标签 inline 阻断。Tetragon 赢在的前提:要在 hook 上按二进制/参数/K8s 选择器做同一套观测与强制执行,并接受 BTF 与策略运维税。

不要把 audit 的「exit 记录」读成「调用被拒绝」。记录出现只证明审计钩子认为这次调用发生过。


三、对照 Cilium CNP / Hubble:包路径身份,不是进程路径

Cilium NetworkPolicy / CiliumNetworkPolicy 把 selector 蒸馏成 numeric identity,在东西向 eBPF 数据面做 L3/L4(可选 L7)判定;Hubble 导出的是 flow verdict,不是 process_exec策略编译 钉 NP/CNP → policy map;Hubble 信号 钉 flow 与 metrics 口径;Cilium 选型终章 把 Tetragon 标成运行时安全续作,而不是把 CNP 写成 syscall 强制执行。

机制问题 CNP + Hubble Tetragon
主对象 包、连接、identity 进程、syscall/文件/能力 hook
策略键 identity + 端口/协议(及 L7 时 Envoy) hook 参数 + 进程血缘 + 可选 K8s 过滤
阻断点 TC/策略 map drop Override 返回值或 Signal
观测出口 Hubble flow JSON file / gRPC 事件
回答的问题 这条流该不该过 这个进程这次操该不该做完

只需要「哪些身份可以访问哪些端口」,排除树停在 Cilium 数据面,不必为运行时安全再付 TracingPolicy 税。已经用 Hubble 看清 Policy denied,却拿 Tetragon 去「再确认一次连接」,是把轴用错:包路径的 deny 不会自动长出 exec_id

两者可以同集群部署,版本正交(本系列钉 Tetragon v1.7.0,Cilium 系列钉 v1.20.0)。联合归因的 runbook 仍是开放问题(第 16 篇),本文不编造「identity 与 exec_id 已自动 join」。


四、对照 seccomp:syscall 编号白名单,不解引用路径

Seccomp-BPF 的输入是 struct seccomp_data:syscall 号、arch、指令指针、原始寄存器参数。经典 BPF 不能把用户态路径指针解引用成字符串。容器运行时在启动时装上 profile 之后,进程能做的调用集合被卡住;SECCOMP_RET_ERRNO / KILL 发生在 syscall 入口,属于 inline 拒绝,但拒绝的依据几乎只有编号与整数参数。

这与 Tetragon 的分工是:seccomp 先收窄「允许发出哪些 syscall」;Tetragon 再在仍被允许的调用上按路径、套接字、能力、血缘做上下文策略。 站内 ebpf-security 用过「Seccomp 看不到 /etc/shadow 路径」这一结构;本篇只保留机制句,不沿用该文未核实的开销表。更深的 cBPF vs eBPF VM 差异见 eBPF 系列

seccomp 赢在的前提:发行版/运行时默认 profile 已够,威胁模型是「多余 syscall 不要存在」,编制不想维护 TracingPolicy。Tetragon 赢在的前提:攻击者已经在白名单 syscall 里做文章(openat 指向宿主机文件、connect 指向 C2),需要对象级上下文。LSM 谱系(Wright, Cowan, Smalley, Morris, Kroah-Hartman, Linux Security Modules, USENIX Security 2002)把「参数已解析后的对象」定为 hook 点;Tetragon 的 LSM sensor 吃的是这条学术前身,不是「实现了 LSM 框架」。


五、机制差:过滤位置与能否 inline 阻断

flowchart LR
  sc["Syscall or hook"]
  sc --> sec["seccomp cBPF\nnumber and raw args"]
  sc --> aud["audit rules\nrecord path"]
  sc --> fal["Falco driver\nthen userspace rules"]
  sc --> tet["Tetragon in-kernel\nselector"]
  sc --> cnp["Cilium identity\npacket path"]
  tet --> ov["Override or Signal"]
  fal --> alert["Alert after copy"]
  aud --> log["audit record"]
  sec --> ret["ERRNO or KILL"]
  cnp --> drop["Policy drop"]
路径 过滤主要发生在 能否 inline 阻断「这一次操作」 典型前提
seccomp syscall 入口,cBPF,原始参数 能拒绝该 syscall 号;看不到路径字符串 运行时 profile 已是基线
auditd 内核审计规则 + 用户态 auditd 不能 Override 函数返回值 合规账本、既有解析器
Falco 用户态规则引擎(driver 只负责采集) 传统主路径是告警;不是 Tetragon 式 Override 规则库与响应流程已存在
Tetragon v1.7.0 BPF selector(导出过滤另算,且 JSON ≠ gRPC) Override 需 CONFIG_BPF_KPROBE_OVERRIDE;SIGKILL 不保证当前 syscall 无副作用 编制能运维五轴与 BTF
CNP + Hubble 包路径 policy map 能 drop 包;不解释进程 syscall 东西向身份策略已是主需求

表后必须说清假设。Falco 在 0.31.1 之后修补了公告里那类「退出时再读用户缓冲」窗口,不等于变成了内核 inline 策略机。Tetragon 有 Override,不等于所有 hook、所有内核都能改返回值。CNP drop 不等于容器内 write() 没做完。

谱系可以收成一句:Bishop & Dilger 1996 定义文件绑定上的 TOCTTOU → Garfinkel 2003 把它写成系统调用拦截工具的通用陷阱(含参数竞态)→ CVE-2022-26316 是用户态再读缓冲的工业实例 → Tetragon 用 in-kernel 匹配与 Override 换一段窗口,仍把 TOCTOU 留在 TracingPolicy 警告里。选型若离开这些名字,讨论退回安装量与品牌口号。

不做的事:不引用未标定的「Tetragon 比 Falco 少百分之几 CPU」;不把 Falco 规则生态写成缺陷;不承诺本站另开 Falco 全书。


参考资料

规范 / 官方文档 / 源码(A)

论文 / 谱系

工业反例(B)

站内对照

实验台账


上一篇:排障坐标系 · 下一篇:Runtime Hooks 与容器边界 · 系列目录

读完这篇,下一步读什么

优先读同系列或同问题的下一篇,把单篇消费变成主题集群。

2026-08-17 · kubernetes / security

Tetragon / eBPF 运行时安全:从进程血缘到 TracingPolicy

补齐站内 Cilium 数据面与可观测对照之上的运行时安全内核层:进程模型、Sensor/Hook、TracingPolicy 与内核过滤、强制执行、事件导出与节流,并以排障与相对 Falco/CNP 的选型收束。

2026-08-18 · kubernetes / security

【Tetragon / eBPF】强制执行:Override 与 SIGKILL 各自保证什么

按 Tetragon v1.7.0 官方 Enforcement 文档钉死:Override 使函数不执行并返回 argError;SIGKILL 终止进程但不保证当前 syscall 无副作用;monitor 与 enforce 如何把动作抹掉;以及 Bishop–Dilger–Garfinkel 的 TOCTOU 谱系落到 bpf_enforcer.c 的边界。


By .