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

直接监控模块加载系统调用
内核模块加载本质是触发 init_module 系统调用,卸载则对应 delete_module。auditd 可在内核入口处捕获这两个调用,不依赖易被 Rootkit 篡改的用户态接口(如 lsmod 或 /proc/modules),实现源头可信记录。
在 /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 - 查权限异常:匹配
auid!=uid且uid=0的事件,提示提权后隐蔽操作
增强防护的配套建议
仅靠 auditd 规则不够,需配合系统级加固:
- 禁用非必要模块加载:设
kernel.modules_disabled=1(需重启),或运行时执行echo 1 > /proc/sys/kernel/modules_disabled - 启用内核模块签名强制:确保
CONFIG_MODULE_SIG_FORCE=y编译选项开启,并部署可信密钥 - 限制模块路径:通过
install <module_name> /bin/true</module_name>在/etc/modprobe.d/中阻止特定模块加载 - 定期交叉验证:用
rkhunter --check或lsmod | awk '{print $1}' | xargs modinfo 2>/dev/null | grep -E '^(filename|signer)'辅助排查










