kvm: ошибка проверки модуля: отсутствует подпись и / или требуемый ключ - ядро

Я использую 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.
все компилируется без предупреждения. Любая помощь приветствуется!

4 ответов


похоже, что поставщик вашей системы включил проверка подписи модуля ядра на вашем ядре, что означает, что он не будет загружать любой модуль, который поставщик не подписал. Другими словами, ваш исправленный модуль не подписан (правильно), и ядро откажется его загружать.

предполагается, что это предотвращает загрузку вредоносных программ и руткитов из вредоносных модулей ядра.

Я предлагаю вам связаться с вашим поставщиком. Может быть вариант где-то на вашей платформе, чтобы отключить проверку подписи. В противном случае, ваш поставщик может подписать модуль для вас. Вы даже можете иметь ключ и детали алгоритма проверки подписи и можете подписать его самостоятельно.

Не зная, на какой платформе вы работаете, трудно дать более конкретные предложения.


вместо повторной настройки ядра эта ошибка (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

перейдите в исходный каталог ядра и сделайте (для e.g):

./scripts/sign-file sha512 ./signing_key.priv ./signing_key.x509 /lib/modules/3.10.1/kernel/drivers/char/my_module.ko

для ядра 4.4.* , расположение ключей должно быть следующим:

./scripts/sign-file sha512 ./certs/signing_key.pem ./certs/signing_key.x509 path/to/your/kernel/module.ko 

проверьте, какой алгоритм дайджеста использует ваше ядро, открыв .config и читать его в CONFIG_MODULE_SIG значения конфигурации.

CONFIG_MODULE_SIG=y CONFIG_MODULE_SIG_ALL=y CONFIG_MODULE_SIG_SHA512=y CONFIG_MODULE_SIG_HASH="sha512"

В общем случае, если вы создаете пользовательское ядро и используете make oldconfig. Это копирует выходящий файл config - * из /boot. Теперь в течение нескольких дней большинство модулей ядра должны быть подписаны поставщиком 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