内核锁定不允许加载自编译和自签名的树内内核模块

mdx*_*mdx 5 linux debian kernel kernel-module secure-boot

我在加载我自己为安全启动编译和签名的内核模块时遇到困难。有问题的模块是ec_sys,位于drivers/acpi内核树的目录中。

我使用的是 Debian 11 stable,内核版本 5.10.0-14-amd64,内核版本 5.10.113-1。


简而言之,问题是我尝试加载模块,例如:

sudo modprobe -f ec_sys
Run Code Online (Sandbox Code Playgroud)

以错误结束

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
Run Code Online (Sandbox Code Playgroud)

编译成功,但有警告:

警告:符号版本转储“Module.symvers”丢失。模块可能没有依赖项或模组版本。MODPOST drivers/acpi/Module.symvers 警告:modpost:vmlinux 的符号信息丢失。未解析的符号检查将被完全跳过。

之后,我将模块复制到 /lib/modules/$(uname -r),注册新的 MOK(如前所述)并签署该模块。


注意:到目前为止,尝试加载不带 -f 标志的模块会导致以下错误:

modprobe: ERROR: could not insert 'ec_sys': Exec format 
Run Code Online (Sandbox Code Playgroud)

sudo modinfo ec_sys我认为这与上面提到的警告有关,也与返回的事实有关

vermagic: 5.10.113 SMP mod_unload modversions

而对于任何其他模块,它返回

vermagic:5.10.0-14-amd64 SMP mod_unload modversions

但我并不认为这是值得关注的事情 -apt source linux下载了 5.10.113 源代码,因为我的实际内核版本是 5.10.113。它应该与我的内核版本(5.10.0-14)兼容,对吧?


所以,只是为了弄清楚问题:

  1. 为什么内核锁定会阻止加载已签名的内核模块?
  2. 您可以告诉我,我明显误解了整个编译/签名/加载过程,并且可能会影响结果吗?

任何帮助表示赞赏。