【云攻防系列】玩转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 内核安全的两大方面

  1. Signals:可能指示系统异常活动的迹象和事件
  2. 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程序:

  1. vma指针:了解受影响的内存区域
  2. vma->vm_mm:获取调用进程的顶层内存管理数据(mm_struct结构体)
  3. 通过这些参数,BPF程序可以获取大量系统信息

示例函数原型:

int security_file_mprotect(struct vm_area_struct *vma, 
                          unsigned long reqprot,
                          unsigned long prot);

2.6 工作流程

  1. 特权用户可将BPF程序挂载到LSM提供的数百个钩子
  2. KRSI在/sys/kernel/security/bpf下导出文件系统层次结构,每个钩子对应一个文件
  3. 使用bpf()系统调用将BPF程序(类型为BPF_PROG_TYPE_LSM)挂载到钩子上
  4. 一个钩子可挂载多个BPF程序
  5. 触发安全钩子时,依次调用所有挂载的BPF程序
  6. 任一BPF程序返回错误状态,请求的操作将被拒绝

3. 结论与展望

  1. 内核安全问题影响深远,特别是运行时安全
  2. eBPF新型program类型为signals和mitigation提供统一API策略
  3. 优化了LSM框架和现有机制易丢失系统调用的问题
  4. 通过阻断函数调用实现更细粒度、更合理的检测方案
  5. 在内核Livepatch、漏洞检测和防御提权攻击方面有发展空间

eBPF结合LSM的方案仍在持续演进,功能和性能不断完善。可关注内核社区LSM邮件列表或https://lore.kernel.org/all/?q=eBPF+LSM获取最新进展。

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 关键数据结构 2.5 参数传递 KRSI将三个参数直接传递给挂载的BPF程序: vma 指针:了解受影响的内存区域 vma->vm_mm :获取调用进程的顶层内存管理数据(mm_ struct结构体) 通过这些参数,BPF程序可以获取大量系统信息 示例函数原型: 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获取最新进展。