可加载内核模块是能够用驱动程序、文件系统、网络功能或其他子系统扩展正在运行内核的特权代码。模块可以避免将每个可选功能都内置到同一个内核映像中,但加载模块也会扩大可信内核的攻击面。
内核 · 第 6 课
内核模块
学习如何检查、加载、配置并安全移除特定 Linux 内核版本的模块。
列出和检查模块
列出当前已加载的模块:
$ lsmod
输出来自 /proc/modules 等内核状态,包含模块名称、大小以及使用计数或依赖关系。看似为零的计数并不能充分证明可以安全移除;驱动程序仍可能拥有活动设备或参与子系统状态。
检查当前内核可用的某个模块:
$ modinfo MODULE_NAME
modinfo 可以显示文件名、别名、参数、许可证、描述和签名信息。应把元数据视为描述,而不是模块可信或适合当前工作负载的证明。
lsmod 显示什么?
使用 `modprobe` 加载
按名称加载模块:
$ sudo modprobe MODULE_NAME
modprobe 会查询 /lib/modules/$(uname -r)/ 下当前内核的依赖索引、别名和配置。它会加载所需依赖项,并传递已配置的参数。insmod 则直接插入一个指定模块文件,不提供同样的依赖解析流程。
加载前,应确认模块来源、签名策略、内核版本兼容性、参数、预期硬件绑定和回滚方案。安全启动或内核锁定可能拒绝未签名模块;强行加载不兼容代码可能导致崩溃或系统失陷。
为什么通常优先使用 modprobe 而不是直接使用 insmod?
模块参数与启动时加载
持久的参数和别名策略应写入 /etc/modprobe.d/ 下的 .conf 文件:
options example_module mode=careful
该行会影响 modprobe 加载模块的方式,但本身不会请求在启动时加载模块。简单的启动时加载列表通常放在 /etc/modules-load.d/ 下:
example_module
硬件别名通常会触发自动加载,无需显式列表。对于早期启动阶段所需的模块,修改配置后应按照发行版规定的流程更新 initramfs。
/etc/modprobe.d/ 中的 options 行会做什么?
黑名单及其局限
modprobe 配置可以包含:
blacklist example_module
黑名单通常会阻止通过模块别名自动加载。它不会卸载已加载模块,不会将模块从 initramfs 中移除,也不一定能阻止按确切名称显式加载或作为依赖项加载。安全加固需要结合具体威胁,从模块可用性、签名强制、initramfs 内容、启动参数和策略等方面采取措施。
基本的 modprobe blacklist 行主要阻止什么?
安全移除模块
请求移除模块:
$ sudo modprobe -r MODULE_NAME
modprobe 可以根据情况移除不再使用的依赖项。当普通引用跟踪显示模块正忙时,内核会拒绝移除,但不能只依赖这一项安全检查。移除支持活动硬件的代码前,应停止服务、卸载文件系统、分离设备、让网络停止活动,并确认已有其他驱动程序或恢复通道。
绝不要在需要保持稳定的系统上强制卸载模块。移除缺陷或未完成的活动可能导致内核崩溃或数据损坏。
哪个命令会按名称请求以依赖感知方式移除模块?
可通过在 Linux 中管理内核模块,练习操作实验指定的安全模块。
课程已完成
你已完成 内核模块
现在,你可以在充分考虑内核级风险的前提下管理模块。
使用
lsmod查看实时状态,使用modinfo查看可用元数据。使用
modprobe按别名和依赖关系加载模块。区分 modprobe 参数与启动时加载请求。
将黑名单视为有限策略,而不是绝对禁止。
执行
modprobe -r前,让每个使用者停止活动。