4. EDR探针开发基础
EDR探针的核心任务,是在终端上持续、低开销地获取“谁在什么时候做了什么”的行为证据。围绕这一目标,业界形成了五类主流采集技术:用户态进程注入、内核回调、ETW、eBPF以及macOS的Endpoint Security Framework(ESF)。它们并非互相替代,而是分别占据不同的观测层次与信任边界。理解每类技术的触发位置、可见范围与代价,是探针架构选型的第一步。
五类技术的观测位置
从观测层次看,进程注入运行在目标进程的用户态地址空间内,通过挂钩API或加载代理DLL获取调用参数;内核回调运行在操作系统内核中,注册进程、线程、映像加载、注册表、文件系统等回调,在系统调用路径上被触发;ETW是Windows提供的内核级事件追踪设施,由内核和用户态Provider统一上报;eBPF在Linux内核中通过验证器加载安全程序,挂接到kprobe、tracepoint、LSM等钩子;ESF则是macOS在内核与用户态之间提供的受控事件通道,由系统扩展接收AUTH和NOTIFY事件。
各技术的触发机制与典型能力
进程注入的典型做法是向目标进程写入远程线程或使用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被篡改。
综上,五类技术各有其不可替代的观测位置。选型的本质是在可见性、开销、稳定性与部署成本之间找到与业务目标匹配的平衡点,并通过多源组合弥补单一技术的盲区。