通过审计系统库加载行为可有效发现ld_preload注入、/etc/ld.so.preload篡改、dlopen非标路径库、恶意lkm及ebpf加载等运行时劫持行为,尤其适用于voidlink等高级威胁溯源,需结合auditd规则监控execve、openat、bpf等关键系统调用并关联进程上下文分析。

通过审计系统库文件加载行为,能有效发现和阻断非法劫持类攻击(如 LD_PRELOAD 注入、恶意共享库替换、eBPF/LKM 模块加载等),尤其针对 VoidLink 等高级威胁中常见的运行时劫持手法。核心在于捕获“谁在什么时间、以何种方式让系统加载了哪个动态库”,并关联进程上下文进行精准溯源。
重点监控的库加载行为类型
不是所有库加载都可疑,需聚焦高风险路径:
- LD_PRELOAD 环境变量注入:检查进程启动时是否被强制预加载非标准路径下的 .so 文件,特别是 /tmp、/dev/shm、当前工作目录等可写位置
- /etc/ld.so.preload 文件篡改:该文件全局生效,一旦被写入恶意路径,所有动态链接程序都会加载指定库
- dlopen() 动态加载非系统路径库:关注由非 root 进程调用 dlopen 加载的绝对路径(尤其是含点号、数字或随机字符串的文件名)
- 内核模块加载(insmod/modprobe):LKM Rootkit 常通过加载恶意 ko 文件实现持久化,需记录模块名称、签名状态及调用者
- eBPF 程序加载:现代攻击常利用 bpf() 系统调用注入无签名 eBPF 字节码,绕过传统检测,需审计 bpf(BPF_PROG_LOAD, ...)
auditd 规则配置实操要点
使用 auditd 实现细粒度监控,规则应覆盖关键系统调用与敏感路径:
- 监控环境变量读取:
-a always,exit -F arch=b64 -S execve -F argc=2 -F a2&0x7fff -F a2&0x8000 -k lib_preload_check(捕获含 LD_PRELOAD 的 execve) - 审计 /etc/ld.so.preload 访问:
-w /etc/ld.so.preload -p wa -k ld_so_preload - 跟踪 dlopen 调用:
-a always,exit -F arch=b64 -S openat -F path=/ -F perm=w -k dynamic_lib_load(配合后续过滤路径含 .so 且非 /usr/lib 等白名单) - 拦截内核模块操作:
-a always,exit -F arch=b64 -S init_module,finit_module,delete_module -k kernel_module - 捕获 eBPF 加载:
-a always,exit -F arch=b64 -S bpf -F a1&0x2 -k ebpf_load(a1&0x2 表示 BPF_PROG_LOAD)
日志分析与攻击溯源方法
原始 audit 日志需结构化处理才能快速定位问题:
- 用
aureport -m -i -ts recent快速查看最近模块加载事件,结合ausearch -m MODULE_LOAD -i提取完整上下文 - 对 LD_PRELOAD 相关事件,提取
exe(被劫持程序)、comm(命令名)、cwd(当前目录)、env(环境变量快照)字段,判断是否为合法运维操作 - 将可疑 .so 文件路径提交至沙箱或使用
readelf -d/strings检查导入函数(如是否调用connect、fork、setuid) - 关联进程树:用
ausearch -m execve -i | aureport -f -i查看某进程的完整启动链,确认父进程是否异常(如由 cron 或 sshd 启动却加载了 /tmp 下的库)
加固与响应建议
审计只是手段,需配合策略闭环:
- 禁用非必要动态加载:对关键服务(如 sshd、nginx)编译时加
-Wl,-z,now,-z,relro并启用LD_BIND_NOW=1,减少运行时解析风险 - 限制 LD_PRELOAD 使用:在
/etc/sudoers中添加Defaults env_delete+="LD_PRELOAD";对容器环境,在 Dockerfile 中设ENV LD_PRELOAD="" - 校验关键库完整性:用
aide或rpm -V定期比对 /lib64、/usr/lib64 下核心 so 文件的 hash - 部署运行时防护:启用 SELinux/AppArmor 限制进程对非标准路径 so 文件的访问权限;在云环境启用主机安全服务(HSS)的“恶意软件”与“未分类恶意软件”检测策略











