kvm:模块验证失败:签名和/或必需的密钥丢失 - 污染内核

use*_*743 27 c linux kvm kernel-module linux-kernel

我正在使用Ubuntu 14.04 LTS和内核版本3.13.11.4.
我正在尝试加载修补的KVM模块kvm,kvm-intel并且我收到以下错误

kvm: module verification failed: signature and/or required key missing - tainting kernel
kvm: module has bad taint, not creating trace events.

使用的源与创建我当前正在运行的映像的源相同.
我检查了符号,并确保错误不是因为不包括EXPORT_SYMBOL_GPL()在我导出函数的修补文件中.

我也看到了一些关于不同内核版本的问题导致了这个错误,但我构建了我用我用来创建补丁kvm模块的相同源代码启动的内核.
一切都编译没有警告.任何帮助表示赞赏!

art*_*rtm 22

module verification failed可以通过在模块本身CONFIG_MODULE_SIG=n的顶部添加一行来解决此错误(),而不是重新配置内核Makefile:

CONFIG_MODULE_SIG=n

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
    obj-m := hello.o

# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
Run Code Online (Sandbox Code Playgroud)

  • 你尝试过吗?我发现添加“CONFIG_MODULE_SIG=n”仍然打印“`模块验证失败:签名和/或所需密钥丢失 - 污染内核`”消息。 (4认同)
  • 真是个糟糕的答案!在编译模块时,定义`CONFIG_MODULE_SIG = n`导致不正确的`module.h`解析.你会发现内核和模块的结构布局有所不同.为什么这么多人赞成? (3认同)
  • 我同时使用Suse(3.12)和RHEL 7(3.10.0),结果是一样的。我还在 [kernelnewbies.org](http://lists.kernelnewbies.org/pipermail/kernelnewbies/2015-November/015330.html) 上讨论了这个问题,但现在似乎没有满意的答案。您能帮忙检查一下这个邮件吗?非常感谢! (2认同)
  • 这绝对适用于我的另一个模块:`rtl8188`和Ubuntu`15.1` (2认同)
  • @IlyaMatveychikov 我记得当 Linux 设备驱动程序中的某些示例模块无法在 Ubuntu 14.04 上构建时尝试解决此问题。我发现它对我有用,无需对 Ubuntu 默认内核进行任何更改。我想您知道更好的方法 - 您介意发布答案来解决此问题吗?我的猜测是其他人也遇到这个问题(尽管它可能不适用于较新的内核 - 不确定) (2认同)

tan*_*grs 12

您的系统供应商似乎已在您的内核上启用了内核模块签名验证,这意味着它不会加载供应商尚未签署的任何模块.换句话说,您的修补模块没有签名(正确),内核将拒绝加载它.

这应该是为了防止恶意软件和rootkit加载恶意内核模块.

我建议你联系你的供应商.您的平台上可能有一个选项可以禁用签名检查.否则,您的供应商可能会为您签署该模块.您甚至可能拥有签名验证算法的密钥和详细信息,并且可以自己签名.

在不知道您正在运行什么平台的情况下,很难提供更具体的建议.


ask*_*skb 11

通常,如果您正在构建自定义内核并使用make oldconfig.这将从/ boot复制现有的config-*文件.现在大多数内核模块需要由linux供应商签名.因此,在编译内核之前,请编辑.config并禁用CONFIG_MODULE_SIG_ALL和CONFIG_MODULE_SIG.

CONFIG_MODULE_SIG=n
CONFIG_MODULE_SIG_ALL=n
# CONFIG_MODULE_SIG_FORCE is not set 
# CONFIG_MODULE_SIG_SHA1 is not set
# CONFIG_MODULE_SIG_SHA224 is not set
# CONFIG_MODULE_SIG_SHA256 is not set
# CONFIG_MODULE_SIG_SHA384 is not set
Run Code Online (Sandbox Code Playgroud)

  • 那么内核需要在这里重新编译吗?抱歉,也许我的问题很蹩脚,但我是 Linux 初学者,重新编译内核对我来说是红灯。只是想让以太网连接正常工作。看起来我需要额外的软件包,但我不必这样做(而且我不会这样做,因为 wifi 也无法工作) (2认同)

小智 11

转到内核源目录并执行(例如):

./scripts/sign-file sha512 ./signing_key.priv ./signing_key.x509 /lib/modules/3.10.1/kernel/drivers/char/my_module.ko
Run Code Online (Sandbox Code Playgroud)

对于内核4.4.*,键位置应如下所示:

./scripts/sign-file sha512 ./certs/signing_key.pem ./certs/signing_key.x509 path/to/your/kernel/module.ko 
Run Code Online (Sandbox Code Playgroud)

通过.configCONFIG_MODULE_SIG配置值中打开并读取内核,查看内核使用的摘要算法.

CONFIG_MODULE_SIG=y CONFIG_MODULE_SIG_ALL=y CONFIG_MODULE_SIG_SHA512=y CONFIG_MODULE_SIG_HASH="sha512"
Run Code Online (Sandbox Code Playgroud)

  • 这应该是答案,它签署了自定义构建模块。 (2认同)