【云攻防系列】玩转eBPF---关于内核运行时安全的那些事儿
字数 1379 2025-08-26 22:11:22
eBPF与内核运行时安全教学文档
1. 知识背景
1.1 运行时防护现状
当前运行时防护主要集中在以下场景:
- 主机安全
- 终端安全
- 云原生安全
流行的云原生运行时防护方案:
- Falco
- Tracee
- Tetragon
- Datadog-agent
- KubeArmor
这些方案主要基于eBPF技术实现,通过挂载内核函数并编写过滤策略,在内核层检测异常攻击并触发预置策略。
1.2 eBPF方案的优缺点
优点:
- 可自定义和自动化配置策略
- 快速修改检测和阻断规则
- 过滤条件丰富(进程、网络、文件等)
- 内核直接处理事件,减少数据传输和上下文切换的性能损耗
- 特别适合网络和Tracing等大数据量场景
缺点:
- 管控粒度只能到进程级别
- 误报时杀死进程会影响系统稳定性和业务连续性
1.3 内核安全现状
- 内核社区传统上更注重性能和功能而非安全性
- 全球内核安全开发者数量稀少
- 主要安全机制维护者:
- SELinux (NSA)
- AppArmor (OpenSuSE/Ubuntu)
- PaX/grsecurity (Spender)
- 2021年1-8月有超过110个内核漏洞获得CVE编号
- 内核安全补丁应用周期长,版本适配困难
2. KRSI (Kernel Runtime Security Instrumentation)
2.1 KRSI概述
KRSI是基于eBPF的更细粒度管控方案,通过LSM(Linux Security Module)形式实现,可将eBPF程序挂载到内核的安全挂钩点(hook)上。
2.2 内核安全的两大方面
- Signals:可能指示系统异常活动的迹象和事件
- Mitigations:检测到异常后采取的补救措施
2.3 KRSI实现原理
KRSI基于LSM实现,主要关注点:
- 全面监视系统行为以检测攻击
- 可视为内核审计机制的扩展
- 使用eBPF提供比内核审计子系统更高级别的可配置性
2.4 关键数据结构
struct krsi_hook {
const char *name;
enum krsi_hook_type h_type;
struct dentry *h_dentry;
struct mutex mutex;
struct bpf_prog_array __rcu *progs;
};
2.5 参数传递
KRSI将三个参数直接传递给挂载的BPF程序:
vma指针:了解受影响的内存区域vma->vm_mm:获取调用进程的顶层内存管理数据(mm_struct结构体)- 通过这些参数,BPF程序可以获取大量系统信息
示例函数原型:
int security_file_mprotect(struct vm_area_struct *vma,
unsigned long reqprot,
unsigned long prot);
2.6 工作流程
- 特权用户可将BPF程序挂载到LSM提供的数百个钩子
- KRSI在
/sys/kernel/security/bpf下导出文件系统层次结构,每个钩子对应一个文件 - 使用
bpf()系统调用将BPF程序(类型为BPF_PROG_TYPE_LSM)挂载到钩子上 - 一个钩子可挂载多个BPF程序
- 触发安全钩子时,依次调用所有挂载的BPF程序
- 任一BPF程序返回错误状态,请求的操作将被拒绝
3. 结论与展望
- 内核安全问题影响深远,特别是运行时安全
- eBPF新型program类型为signals和mitigation提供统一API策略
- 优化了LSM框架和现有机制易丢失系统调用的问题
- 通过阻断函数调用实现更细粒度、更合理的检测方案
- 在内核Livepatch、漏洞检测和防御提权攻击方面有发展空间
eBPF结合LSM的方案仍在持续演进,功能和性能不断完善。可关注内核社区LSM邮件列表或https://lore.kernel.org/all/?q=eBPF+LSM获取最新进展。