Ubuntu16.04下内核模块验证失败(签名/密钥缺失)求助
我看到你在Ubuntu 16.04 LTS上编译加载自定义内核模块时,碰到了「Module verification failed: signature and/or required key missing - tainting kernel」的警告,而且修改Makefile里的CONFIG_MODULE_SIG参数后也没解决这个问题。先别着急,咱们一步步来分析:
首先从你的系统日志能看出来,这个警告其实不影响模块的正常功能——你的模块已经成功完成初始化和清理操作了,只是内核因为加载了未签名的模块,把自己标记为"tainted"(受污染)状态而已。
先把你提供的相关代码和信息整理一下:
你的内核模块代码
#include<linux/module.h> int proc_init (void) { printk(KERN_INFO "helloModule: kernel module initialized\n"); return 0; } void proc_cleanup(void) { printk(KERN_INFO "helloModule: performing cleanup of module\n"); } MODULE_LICENSE("GPL"); module_init(proc_init); module_exit(proc_cleanup);
你的原始Makefile
CONFIG_MODULE_SIG=n obj-m += helloModule.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
相关系统日志片段
[ 1092.186460] helloModule: module verification failed: signature and/or required key missing - tainting kernel [ 1092.188510] helloModule: kernel module initialized [ 2245.128462] helloModule: performing cleanup of module [ 2250.667037] helloModule: kernel module initialized [ 2305.815511] helloModule: performing cleanup of module [ 2357.490185] helloModule: kernel module initialized ...(后续模块加载/卸载日志)
问题原因
你修改CONFIG_MODULE_SIG后没生效,是因为Ubuntu 16.04的内核构建系统优先级更高,你在自己Makefile开头定义的这个变量,会被内核自带的Makefile覆盖掉,所以根本没起到禁用签名验证的作用。
解决办法
这里给你几个不同场景的解决方案:
1. 编译时强制传递禁用签名参数(推荐用于开发测试)
修改你的Makefile,把CONFIG_MODULE_SIG=0直接传递给内核的make命令,这样就能确保参数被内核构建系统接收:
obj-m += helloModule.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules CONFIG_MODULE_SIG=0 clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
重新编译模块后,再加载就不会出现这个警告了。
2. 临时禁用内核签名验证(单次生效)
如果只是临时测试,不想改Makefile,可以通过修改内核启动参数来关闭签名验证:
- 重启系统,在GRUB启动菜单出现时按
e进入编辑模式 - 找到以
linux开头的那一行,在末尾添加module.sig_unenforce - 按下
Ctrl+X启动系统,这次启动内核就不会验证模块签名了
3. 永久禁用内核签名验证(不推荐,有安全风险)
如果你需要长期禁用这个功能(比如持续开发模块),可以修改GRUB配置:
- 编辑
/etc/default/grub文件,找到GRUB_CMDLINE_LINUX_DEFAULT行,添加module.sig_unenforce,修改后类似:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash module.sig_unenforce"
- 更新GRUB配置:
sudo update-grub
- 重启系统后,内核就会永久关闭模块签名验证(注意:这会降低系统安全性,生产环境不要这么做)
最后补充
再次强调,这个警告本身不会影响模块的正常运行,如果你只是开发测试,用方案1或者临时禁用就足够了。如果是生产环境的模块,建议还是按照内核要求给模块签名,而不是禁用验证机制。
内容的提问来源于stack exchange,提问作者BitByte

