auditd可通过监控init_module和delete_module系统调用实现内核模块加载卸载的源头可信记录,配置规则后结合comm、exe、cwd、auid等字段及关联事件分析,可有效识别lkm rootkit植入行为。

auditd 能直接捕获 init_module 和 delete_module 系统调用,从内核入口记录模块加载卸载行为,不依赖 lsmod 或 /proc/modules 等易被 Rootkit 篡改的用户态接口,是识别 LKM Rootkit 植入的关键防线。
配置精准监控规则
在 /etc/audit/rules.d/10-lkm.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 auditctl -l | grep lkm,应看到两条规则输出。
聚焦高危日志特征
触发后日志写入 /var/log/audit/audit.log,需重点筛查以下字段组合:
-
comm= 值异常:如
sh、python3、perl或为空/不可读名,而非标准insmod或modprobe -
exe= 路径非常规:指向
/tmp/、/dev/shm/、/var/tmp/或非系统路径(如/usr/local/bin/evil_tool) -
cwd= 为临时目录:例如
cwd="/tmp",常见于规避文件完整性检查 -
auid= 为
4294967295(未设置审计 ID),或uid=0但无对应运维操作记录
关联上下文确认攻击链
单条加载日志不足以定性,需结合前后事件构建行为画像:
- 查模块来源:
ausearch -m SYSCALL -sc openat -f '.*\.ko$' --start recent,确认 .ko 文件是否从临时路径写入 - 查签名绕过:
ausearch -m SYSCALL -sc init_module | grep "sig=0",识别未签名模块加载 - 查防御禁用:
ausearch -m SYSCALL -sc write -F path=/proc/sys/kernel/modules_disabled,检查是否尝试关闭模块加载 - 查权限异常:
ausearch -m SYSCALL -sc init_module -F auid!=uid -F uid=0,提示提权后隐蔽操作
配套加固提升整体防线
仅靠 auditd 规则不够,需配合系统级措施:
- 运行时禁用模块加载:
echo 1 > /proc/sys/kernel/modules_disabled;永久生效需设kernel.modules_disabled=1并重启 - 启用强制模块签名:确保内核编译时开启
CONFIG_MODULE_SIG_FORCE=y,并部署可信密钥 - 限制可疑模块路径:在 /etc/modprobe.d/ 中添加
install <module_name> /bin/true</module_name>阻止特定模块加载 - 定期交叉验证:
rkhunter --check或lsmod | awk '{print $1}' | xargs modinfo 2>/dev/null | grep -E '^(filename|signer)'











