我在加载我自己编译并签名用于安全启动的内核模块时遇到了困难。有问题的模块是ec_sys
,位于drivers/acpi
内核树的目录中。
我正在使用 Debian 11 稳定版,内核版本 5.10.0-14-amd64,内核版本 5.10.113-1。
简而言之,问题是我尝试加载模块,例如使用:
sudo modprobe -f ec_sys
以错误结束
modprobe:错误:无法插入“ec_sys”:操作不允许
dmesg 输出结果如下:
锁定:modprobe:未签名的模块加载受到限制;请参阅 man kernel_lockdown.7
如果我理解正确的话,锁定应该会阻止加载未签名模块进入内核,但我确实签署了,关注 Debian 关于此主题的官方文档一切顺利,没有任何问题。我不知道为什么它仍然被阻止。
只是为了实际加载模块,我甚至尝试通过 SysRq+x 组合完全禁用内核锁定,但它似乎在该内核版本中不受支持(根本无法识别“x”命令)。
为了提供更多的背景信息,下面是我在注册机器所有者密钥并用它对模块进行签名之前构建模块所执行的步骤。
# Get the source code
apt source linux
cd linux-5.10.113
# Generate .config
make localmodconfig
# Enable ec_sys via menuconfig (or just set CONFIG_ACPI_EC_DEBUGFS=m in .config)
make menuconfig
# Prepare modules
make modules_prepare
# Build acpi modules as they're the only ones of interest to me
make modules M=drivers/acpi
编译成功,但出现警告:
警告:缺少符号版本转储“Module.symvers”。模块可能没有依赖项或 modversion。MODPOST drivers/acpi/Module.symvers 警告:modpost:缺少 vmlinux 的符号信息。未解析的符号检查将被完全跳过。
之后,我将模块复制到 /lib/modules/$(uname -r),注册新的 MOK(如前所述)并对该模块进行签名。
注意:截至目前,尝试加载不使用 -f 标志的模块会导致以下错误:
modprobe: ERROR: could not insert 'ec_sys': Exec format
sudo modinfo ec_sys
我认为这与上面提到的警告以及回报有关
版本:5.10.113 SMP mod_unload modversions
而对于任何其他模块它返回
版本:5.10.0-14-amd64 SMP mod_unload modversions
但这并不让我担心——apt source linux
下载了 5.10.113 源代码,因为我的实际内核版本是 5.10.113。它应该与我的内核版本 (5.10.0-14) 兼容,对吧?
因此,只是为了澄清问题:
- 为什么内核锁定会阻止已签名的内核模块的加载?
- 您能否告诉我,我对整个编译/签名/加载过程的理解有什么明显误解,并且可能会影响结果?
任何帮助都将受到赞赏。