как подписать свой собственный модуль ядра в linux?

Вопрос или проблема

Я написал простой модуль ядра hello world в Linux и попытался загрузить его в ядро. Но это не удалось, потому что я получил ошибку при попытке его загрузить.

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

Я пытался найти решение этой проблемы, но все, что я нашел, касалось виртуальных машин, а не реальной системы.

У меня отключен защищенный загрузчик, и я не хочу менять конфигурацию ядра и пересобирать его.

Я также пытался создать ключ с помощью 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
имя файла:       /home/###/Documents/kernel/hello.ko
описание:    Это описание модуля.
автор:         ###
лицензия:        Dual BSD/GPL
зависимости:        
retpoline:      Y
имя:           hello
vermagic:       5.11.0-16-generic SMP mod_unload modversions 
sig_id:         PKCS#7
подписавший:         ###
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
подпись:      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: ОШИБКА: не удалось вставить модуль hello.ko: Неверный формат модуля

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

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

(Но если вы попытаетесь отправить отчет об ошибке ядра, который включает сообщения об ошибках/сбоев с пометкой загрязнения, вам, скорее всего, ответят: “Пожалуйста, попробуйте воспроизвести ошибку без каких-либо нестандартных модулей ядра сначала или покажите исходный код вашего пользовательского модуля, так как это может быть актуально для устранения неполадок”. Это помогает сэкономить время разработчиков ядра и сопровождающих дистрибутивов, так как люди иногда отправляют отчеты об ошибках, не упоминая, что они пытаются что-то экспериментальное.)

Debian упаковывает утилиту sign-file в пакет linux-kbuild-<версия ядра>. И, я верю, Ubuntu делает то же самое. Поэтому вам нужно убедиться, что пакет linux-kbuild-5.11 установлен. Путь утилиты sign-file будет /usr/lib/linux-kbuild-5.11/scripts/sign-file.

Однако, когда защищенный загрузчик отключен, shimx64.efi просто загрузит grubx64.efi, обойдя все шаги защищенного загрузчика, включая загрузку MOK. Без загруженного MOK ядро не сможет распознать подпись вашего модуля как действительную. И при отключенном защищенном загрузчике подписанный модуль с недействительной подписью отклоняется, в то время как неподписанные модули просто получают предупреждение и пометку загрязнения в любых будущих сообщениях об ошибках/сбоях.

insmod: ОШИБКА: не удалось вставить модуль hello.ko: Неверный формат модуля

После любой неудачи загрузки модуля ядра вам следует проверить вывод dmesg: он может содержать более конкретное сообщение об ошибке. В этом случае это, вероятно, указывает на то, что подпись модуля не прошла проверку действительности.

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

#модули-ядра #MOK #подписание

Ответ или решение

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

Шаг 1: Установите необходимые пакеты

Убедитесь, что у вас установлены пакеты для сборки ядра, включая linux-kbuild для вашей версии ядра. Для этого выполните:

sudo apt install linux-kbuild-$(uname -r)

Это обеспечит наличие утилиты sign-file, которая хранится в /usr/lib/linux-kbuild-$(uname -r)/scripts/sign-file.

Шаг 2: Создание ключа для подписи

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

# Создание приватного ключа
openssl genrsa -out MOK.priv 2048

# Создание сертификата
openssl req -new -x509 -key MOK.priv -out MOK.der -days 36500 -subj "/CN=My Kernel Module Signing Key"

Шаг 3: Регистрация ключа в системе

Теперь вам нужно зарегистрировать ключ. Для этого используйте утилиту mokutil, которая позволяет добавлять Machine Owner Keys (MOK). Вам потребуется перезагрузить систему и выполнить действие в меню MOK.

sudo mokutil --import MOK.der

Следуйте инструкциям, чтобы установить пароль и перезагрузите систему. В меню MOK выберите "Enroll MOK" и введите свой пароль.

Шаг 4: Подписание модуля

После перезагрузки и регистрации ключа вы можете подписать ваш модуль. Используйте утилиту sign-file, чтобы подписать ваш модуль. Например:

sudo /usr/lib/linux-kbuild-$(uname -r)/scripts/sign-file sha256 MOK.priv MOK.der /path/to/your/module.ko

Шаг 5: Проверка подписи

Чтобы убедиться, что ваш модуль подписан правильно, вы можете использовать команду modinfo:

modinfo /path/to/your/module.ko

Проверьте, что для поля signature отображается информация, соответствующая вашему ключу.

Шаг 6: Загрузка модуля

Теперь, когда ваш модуль подписан, вы можете его загрузить:

sudo insmod /path/to/your/module.ko

Шаг 7: Проверка ошибок

Если вы всё еще сталкиваетесь с проблемами, проверьте вывод команды dmesg для получения подробной информации об ошибках:

dmesg | tail

Это поможет вам выявить дополнительные проблемы, такие как ошибки формата модуля или проблемы с подписью.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...