4. EDR探针开发基础

EDR探针的核心任务,是在终端上持续、低开销地获取“谁在什么时候做了什么”的行为证据。围绕这一目标,业界形成了五类主流采集技术:用户态进程注入、内核回调、ETW、eBPF以及macOS的Endpoint Security Framework(ESF)。它们并非互相替代,而是分别占据不同的观测层次与信任边界。理解每类技术的触发位置、可见范围与代价,是探针架构选型的第一步。

五类技术的观测位置

从观测层次看,进程注入运行在目标进程的用户态地址空间内,通过挂钩API或加载代理DLL获取调用参数;内核回调运行在操作系统内核中,注册进程、线程、映像加载、注册表、文件系统等回调,在系统调用路径上被触发;ETW是Windows提供的内核级事件追踪设施,由内核和用户态Provider统一上报;eBPF在Linux内核中通过验证器加载安全程序,挂接到kprobe、tracepoint、LSM等钩子;ESF则是macOS在内核与用户态之间提供的受控事件通道,由系统扩展接收AUTH和NOTIFY事件。

EDR采集技术观测层次与信任边界 用户态(Ring 3) 进程注入 API Hook / DLL 注入 ETW 消费者 用户态会话接收 ESF 客户端 系统扩展接收事件 eBPF 用户态 加载/读取 map 内核态(Ring 0) 内核回调 PsSetCreateProcessNotify CmRegisterCallback 等 ETW Provider 内核事件源 Kernel Logger ESF 内核通道 AUTH / NOTIFY 受控事件分发 eBPF 程序 kprobe/tracepoint LSM 钩子 系统调用 / 内核接口边界 采集数据流 原始事件 字段归一化 进程树关联 本地缓存/上报 选型关键维度 可见性深度 性能开销 稳定性/蓝屏风险 对抗绕过难度 跨平台可移植性

各技术的触发机制与典型能力

进程注入的典型做法是向目标进程写入远程线程或使用AppInit、SetWindowsHookEx等机制加载代理模块,再对CreateFileW、RegSetValueEx等API做Inline Hook或IAT Hook。它的优势是能拿到完整的调用参数和调用栈,适合做细粒度的行为拦截;代价是兼容性差、易被反注入检测,且对每个目标进程都要维护一份注入状态,资源占用随进程数增长。

内核回调通过注册系统提供的回调函数,在进程创建、线程创建、映像加载、注册表修改、文件操作等关键路径上被内核调用。以Windows为例,进程创建回调原型为:

NTSTATUS PsSetCreateProcessNotifyRoutineEx(
    PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
    BOOLEAN Remove
);

VOID NotifyRoutine(
    PEPROCESS Process,
    HANDLE ProcessId,
    PPS_CREATE_NOTIFY_INFO CreateInfo
);

回调在进程创建完成前触发,CreateInfo中携带映像路径、命令行、父进程ID等字段,可在此时做阻断决策。内核回调的可见性高、难以从用户态绕过,但一旦回调函数中发生异常或死锁,会直接导致系统蓝屏,因此对代码质量要求极高。

ETW由Provider、Session、Consumer三部分组成。内核自带Microsoft-Windows-Kernel-Process、Kernel-File、Kernel-Registry等Provider,应用也可注册自定义Provider。探针以消费者身份订阅会话,通过EventRecordCallback接收事件。ETW的优势是开销可控、事件格式统一、无需注入;局限在于部分高价值事件(如进程内存操作)默认不提供,且事件在用户态消费存在一定延迟,不适合做实时阻断。

eBPF在Linux上通过bpf()系统调用加载程序,验证器会检查内存访问与循环边界,确保程序不会导致内核崩溃。典型挂接点包括kprobe(内核函数入口)、tracepoint(静态追踪点)、LSM(安全钩子)。例如挂接在sys_enter_execve上可捕获进程执行:

SEC("tracepoint/syscalls/sys_enter_execve")
int handle_execve(struct trace_event_raw_sys_enter *ctx) {
    char comm[16];
    bpf_get_current_comm(&comm, sizeof(comm));
    bpf_printk("exec: %s\n", comm);
    return 0;
}

eBPF程序通过map与用户态交换数据,性能开销低、可动态加载,但需要较新的内核版本,且不同发行版的内核配置差异会影响可用钩子。

ESF是macOS上唯一受官方支持的深度采集通道。系统扩展注册后,可接收ES_EVENT_TYPE_AUTH_EXEC、ES_EVENT_TYPE_NOTIFY_WRITE等事件。AUTH类事件要求客户端在指定时间内返回允许或拒绝,否则系统按默认策略处理;NOTIFY类事件仅用于记录。ESF取代了早期的Kauth和内核扩展,稳定性更好,但需要用户授权、签名和公证,部署门槛较高。

选型对比与组合策略

技术 观测层次 典型事件 性能开销 稳定性风险 实时阻断
进程注入 用户态 API调用参数、调用栈 中高 低(进程级) 支持
内核回调 内核态 进程/线程/映像/注册表 低 高(蓝屏) 支持
ETW 内核+用户态 进程、文件、网络、注册表 低 低 不支持
eBPF 内核态 系统调用、LSM、网络 低 低(验证器保护) 支持(LSM)
ESF 内核+用户态 进程、文件、网络、挂载 低 低 支持(AUTH)

实际工程中很少只用一种技术。一个可落地的组合策略是:Windows上以ETW作为基础事件源覆盖进程、文件、网络行为,用内核回调补充进程创建与映像加载的实时阻断能力,对高价值目标进程按需注入以获取参数级细节;Linux上以eBPF的tracepoint和LSM为主,配合audit子系统做兜底;macOS上以ESF为唯一深度通道,辅以统一日志做补充。这样既控制了稳定性风险,又保证了关键行为的可见性与可阻断性。

选型时先明确三个问题:需要观测到什么粒度?是否要求实时阻断?目标平台的内核版本与安全策略是否允许?答案会直接缩小技术组合的范围。

一个可执行的选型判断流程

假设要为某企业终端开发跨平台探针,可按以下顺序判断:第一步,列出必须采集的事件类型,例如进程创建、文件写入、网络连接、注册表修改;第二步,对每类事件标注是否需要阻断;第三步,按平台匹配可用技术,Windows优先ETW+内核回调,Linux优先eBPF,macOS优先ESF;第四步,评估内核版本与签名要求,确认eBPF所需内核版本是否满足、ESF扩展能否通过公证;第五步,做开销基线测试,在空闲与高负载两种场景下测量CPU占用与事件丢失率,若ETW会话丢失率超过1%则需调整缓冲区大小或减少订阅Provider。

需要强调的是,任何采集技术都存在被绕过的可能。直接系统调用、内核模块对抗、ETW Patch等手段在真实攻击中并不罕见。因此探针设计应遵循“多源交叉验证”原则:同一行为尽量由两个独立来源覆盖,当两者结果不一致时触发告警。例如进程创建既由内核回调上报,也由ETW上报,若某进程在ETW中缺失但回调中存在,则可能提示ETW被篡改。

内核回调与eBPF程序一旦出错,影响范围是整个操作系统。开发阶段应在虚拟机中充分测试异常路径,并为回调函数设置超时与降级逻辑,避免因单点故障导致终端不可用。

综上,五类技术各有其不可替代的观测位置。选型的本质是在可见性、开销、稳定性与部署成本之间找到与业务目标匹配的平衡点,并通过多源组合弥补单一技术的盲区。