加载内核模块
lsmod 读取 /proc/modules,列出已加载模块、占用大小与被引用次数。内核级 rootkit 多以模块形式加载,也可能在加载后把自己从模块链表中摘除。因此核查不能只看清单,还要看模块文件来源、签名状态与内核污点标记。
基本信息
| 适用平台 | Linux 内核 2.6 及以上 |
|---|---|
| 命令 | lsmod、modinfo <模块>、cat /proc/modules、dmesg |
| 污点标记 | /proc/sys/kernel/tainted 位掩码,非 0 需逐位解释 |
| 模块目录 | /lib/modules/$(uname -r)/ |
| 签名信息 | modinfo 的 signer、sig_id、sig_hashalgo 字段(视发行版) |
| 附加属性 | /sys/module/<模块>/taint、refcnt、coresize(视内核版本) |
典型使用场景
- 排查内核级后门与 rootkit 模块
- 变更前后对比模块清单,确认是否新增加载
- 核对第三方驱动来源与签名是否合规
- 结合 dmesg 查模块加载时间与报错
- 内存镜像分析时与 Volatility 的模块插件结果互校
最小示例
最小示例
lsmod | head -20 # 当前加载的模块清单
cat /proc/sys/kernel/tainted # 非 0 表示内核被污染
modinfo nf_conntrack | grep -E 'filename|version|signer|sig_id' # 模块来源与签名信息
grep -H . /sys/module/*/taint 2>/dev/null | head # 部分内核提供该属性
dmesg | grep -iE 'module|taint' | tail -20 # 加载时间与异常提示
lsmod | awk 'NR>1{print $1}' | sort > /tmp/mod_now.txt # 生成当前清单供基线比对输出逐列读法
| 列 | 含义 | 异常信号 |
|---|---|---|
| Module | 模块名 | 不在发行版仓库中的陌生名字 |
| Size | 模块占用字节数 | 与已知模块明显不符或异常大 |
| Used by | 被引用次数与引用者 | 被未知模块引用或计数长期为 0 |
| filename | 模块文件路径(modinfo) | 位于 /tmp、用户家目录等非标准路径 |
| tainted | 内核污点位掩码 | 出现未签名、树外或强制加载相关位 |
污点标记是位掩码,含义随内核版本变化;应参照本机内核源码目录下的文档解释每一位,再判断是否构成风险。
模块加载后可能自我隐藏(从模块链表摘除),此时 lsmod 为空但功能仍在。清单为空不等于无内核痕迹,需结合 dmesg、内存镜像与 /sys/kernel 相关节点。
直接 rmmod 可疑模块可能触发内核崩溃、破坏内存证据或中断业务驱动;先记录信息、评估影响,再决定是否卸载。