auditd可捕获init_module和delete_module系统调用以监控内核模块加载卸载,通过配置规则-a always,exit -F arch=b64 -S init_module/delete_module并结合日志字段(comm、exe、cwd、key)及关联事件分析,有效识别LKM Rootkit植入行为。

Auditd 是 Linux 内核审计子系统的用户空间组件,它能直接捕获内核级事件,包括模块加载(init_module 和 delete_module 系统调用),这对早期发现 LKM Rootkit 的植入行为极为关键。Rootkit 往往依赖动态加载恶意内核模块实现持久化和高隐蔽性,而 auditd 不依赖 lsmod 或 /proc/modules 等易被篡改的用户态接口,从源头记录真实行为,是防御链中不可替代的一环。
配置 auditd 捕获模块加载/卸载系统调用
内核模块加载本质是触发 init_module 系统调用,卸载则对应 delete_module。auditd 可通过规则直接监控这两个调用:
- 编辑
/etc/audit/rules.d/10-module.rules,添加两行规则:-a always,exit -F arch=b64 -S init_module -k lkm_load-a always,exit -F arch=b64 -S delete_module -k lkm_unload
(若为 32 位系统,将b64替换为b32) - 重载规则:
sudo augenrules --load或sudo systemctl restart auditd - 验证规则生效:
sudo auditctl -l | grep lkm应看到对应条目
识别可疑模块行为的关键日志字段
触发规则后,日志会写入 /var/log/audit/audit.log。一条典型加载日志包含以下关键信息:
-
comm=insmod或comm=modprobe:说明是用户主动操作;若为comm=sh、comm=python或未知进程名,则高度可疑 -
exe="/usr/bin/insmod":正常路径;若exe指向临时目录(如/tmp/、/dev/shm/)或非常规路径,极可能为恶意模块 -
cwd="/tmp":当前工作目录异常,常用于规避文件完整性检查 -
key="lkm_load":便于用ausearch -k lkm_load快速筛选
结合上下文提升检测精度
单看模块加载不够,需关联其他审计事件构建行为画像:
- 检查加载前是否有异常的文件写入:
ausearch -m SYSCALL -sc openat -f /tmp/.*\.ko --start recent,确认模块文件来源 - 检查加载后是否立即修改关键内核结构:
ausearch -m SYSCALL -sc write -F path=/proc/sys/kernel/modules_disabled(禁用模块加载) - 检查是否尝试绕过签名验证:
ausearch -m SYSCALL -sc init_module | grep "sig=0"(无签名模块)
与内核防护机制联动增强实效
auditd 提供的是“看见”,真正阻断需配合内核策略:
- 启用模块签名强制:
echo 'options kvm ignore_msrs=1' > /etc/modprobe.d/hardening.conf并设置kernel.modules_disabled=1(仅限必要时) - 锁定模块加载路径:
echo 'install \* /bin/true' > /etc/modprobe.d/disable-all.conf,再显式允许白名单模块 - 配合
sysctl kernel.kptr_restrict=2和dmesg_restrict=1,防止攻击者读取内核符号辅助 LKM 注入


















