深入解析 eBPF 运行时监控
为容器安全构建安全、只读的内核探针。
eBPF 实际带来了什么
eBPF 无须内核模块或内核补丁,就能在 Linux 内核中运行经过验证的小型程序。加载之前,内核验证器会拒绝可能无限循环、越界读取或访问无权触及内存的程序。因此,可以安全地将代码挂接到系统调用边界等高频路径。
ECRSM 是构建在这条边界上的教学型只读运行时监控器:内核 eBPF 探针、Go 代理和 React 仪表板。它是用于合成教学场景的技术栈,并非生产 EDR;目标是让内核级可见性易于理解。
挂接在哪里
ECRSM 挂接内核 tracepoint 而非 kprobe,因为 tracepoint 在不同内核版本间提供稳定 ABI:
| Tracepoint | 信号 |
|---|---|
execve | 进程执行,观察反向 shell 和可疑二进制的主要入口 |
connect | 出站连接、C2 周期通信和数据外传目的地 |
ptrace | 进程注入和调试器附加 |
mmap | 可执行内存映射,提示 shellcode 准备行为 |
数据路径
- 内核空间,C eBPF 程序在每个 tracepoint 触发,只把元数据复制进环形缓冲区,包括 PID、UID、
comm、argv 长度和目标地址。不采集载荷或秘密。 - 用户空间,Go 代理读取环形缓冲区,为事件补充容器和 Kubernetes 元数据,如 pod、namespace、image,并评估轻量规则。
- 仪表板,事件经 WebSockets 流向 React 界面,使内核系统调用实时变成屏幕上的一行记录。
通过 Helm chart 部署 Kubernetes DaemonSet,确保每个节点恰好运行一个探针。
安全是整个设计的基础
向内核写入可能使机器崩溃,ECRSM 从不这样做:
- 只读观察,tracepoint 仅观察,不修改系统调用参数或包数据。
- 仅元数据,载荷字节、环境变量和文件内容均不会离开内核。
- 最小权限,代理仅以
CAP_BPF/CAP_SYS_ADMIN运行,不附加其他权限。 - 合成模拟,展示的反向 shell、进程注入和可疑执行都是安全脚本场景,让用户在没有真实入侵的情况下学习检测。
使用边界
ECRSM 是学习平台,不提供检测签名,不拦截操作,也不声称能捕获有决心的攻击者。它的教学价值是把抽象的内核可观测性转换成可亲眼看到的事件,并运行在实验后可销毁的基础设施上。