![如何在Linux中签署我自己的内核模块?](https://linux22.com/image/190434/%E5%A6%82%E4%BD%95%E5%9C%A8Linux%E4%B8%AD%E7%AD%BE%E7%BD%B2%E6%88%91%E8%87%AA%E5%B7%B1%E7%9A%84%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%EF%BC%9F.png)
我在 Linux 中编写了一个简单的 hello world 内核模块,并尝试将其加载到内核中。但这是不可能的,因为我在想加载它时收到此错误。
module verification failed: signature and/or required key missing - tainting kernel
我试图找到一个解决方案,但发现的所有内容都是关于虚拟机而不是真正的系统。
我的安全启动被禁用,我不想更改内核配置并重建它。
我还尝试使用 openssl 和 MOK 创建密钥并注册它,但在尝试签署模块的最后一步中,我停止了,因为没有这样的文件或目录错误。/scripts/sign-file
我找不到/usr/lib/linux-headers-5.11.0-16-generic
我遵循了这个问题的答案: 签署内核模块
我完全糊涂了!谁能帮我??
我的操作系统是ubuntu,内核版本是5.11.0-16
更新:现在我明白我的模块似乎是通过命令签名的modinfo hello.ko
,这就是结果:
$ modinfo hello.ko
filename: /home/###/Documents/kernel/hello.ko
description: This is the module description.
author: ###
license: Dual BSD/GPL
depends:
retpoline: Y
name: hello
vermagic: 5.11.0-16-generic SMP mod_unload modversions
sig_id: PKCS#7
signer: ###
sig_key: 58:26:4E:F2:6A:5F:2F:DB:F0:21:E0:8C:79:60:E9:C8:78:38:01:3F
sig_hashalgo: sha256
signature: 67:F2:74:BF:6A:AB:D4:AD:6C:EA:BD:35:D6:7A:9A:94:0F:C7:0F:6B:
AD:10:18:26:D1:D9:8A:07:DD:89:36:03:D0:C9:AA:10:A1:52:71:A0:
CF:D0:7D:C6:2E:D7:E2:B1:AF:1D:45:A4:97:13:23:23:C8:B7:99:6D:
4A:F9:60:B7:64:D0:E4:3C:EE:74:9F:68:D2:C5:EC:C0:C9:F3:09:76:
EF:B5:C4:46:62:36:1B:95:EC:4A:D3:4D:B7:2F:87:71:E1:D2:D7:ED:
EE:F3:04:58:3F:F9:EA:16:4C:39:BD:B5:50:60:FC:A7:96:AF:03:74:
F0:03:76:98:95:91:A9:5A:1B:50:17:8A:71:A2:C0:D6:B4:DD:D3:50:
FE:2A:05:29:03:D6:E6:A0:69:F4:18:44:2B:EC:F6:41:6D:A3:E7:EF:
10:3D:98:A8:33:21:56:0E:D6:8E:67:88:18:7F:31:DB:2E:CA:70:F7:
7E:03:42:04:F5:99:64:BD:EE:0F:04:DA:56:50:B5:2E:7A:B7:AE:D0:
ED:07:6B:86:89:45:38:B4:7C:FE:B9:B3:F4:5D:17:1B:6F:04:33:52:
BE:0E:1F:D3:CA:F1:9D:17:AD:EC:A4:DC:84:25:47:73:ED:02:9E:74:
4C:AD:25:35:2B:E4:C0:BE:15:F2:FF:99:CE:89:82:E6
但在插入模块时仍然出现错误:
$ sudo insmod hello.ko
insmod: ERROR: could not insert module hello.ko: Invalid module format
答案1
module verification failed: signature and/or required key missing - tainting kernel
这确实不是意味着你的模块没有加载。这意味着任何内核 oops/panic 消息都会包含一些信息,表明您已经(或在某个时刻)加载了未签名的模块。此消息只是警告,而不是错误。
(但是,如果您尝试提交包含带有污点标记的 oops/panic 消息的内核错误报告,您很可能会得到一个响应“请尝试先在没有任何非标准内核模块的情况下重现该错误,或者显示源代码自定义模块的代码,因为它可能与故障排除相关”。这往往会节省内核开发人员和发行版维护人员的时间,因为人们有时会提交错误报告,而不会提及他们正在尝试一些实验性的东西。)
Debian 将sign-file
实用程序打包到一个linux-kbuild-<kernel version>
包中。我相信 Ubuntu 也是这样做的。因此,您需要确保该软件包linux-kbuild-5.11
已安装。该实用程序的路径sign-file
是/usr/lib/linux-kbuild-5.11/scripts/sign-file
.
然而,当安全启动被禁用时,shimx64.efi
将直接加载真实的grubx64.efi
绕过所有安全启动步骤,包括加载MOK。如果未加载 MOK,内核将无法识别模块上的签名是否有效。禁用安全启动后,具有无效签名的签名模块将被拒绝,而未签名的模块只会在任何未来的 oops/panic 消息上收到警告和污点标记。
insmod: ERROR: could not insert module hello.ko: Invalid module format
任何内核模块加载失败后,您应该检查dmesg
输出:它可能包含更具体的错误消息。在这种情况下,可能表明模块签名未通过有效性检查。