подписывание модулей ядра

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

подписывание модулей ядра

Непрочитанное сообщение Olej » 01 авг 2022, 17:03

Всё чаще в новых версиях дистрибутивов, при сборке даже самых элементарных модулей ядра, получаем такую картину:

Код: Выделить всё

olej@nvme:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Linuxmint
Description:    LMDE 5 (elsie)
Release:        5
Codename:       elsie

Код: Выделить всё

olej@nvme:~$ uname -a
Linux nvme 5.10.0-16-amd64 #1 SMP Debian 5.10.127-2 (2022-07-23) x86_64 GNU/Linux

Код: Выделить всё

olej@nvme:~/2022/OwnBooks/BHV.kernel/examples/tools/signed$ make
make -C /lib/modules/5.10.0-16-amd64/build M=/home/olej/2022/OwnBooks/BHV.kernel/examples/tools/signed modules
make[1]: вход в каталог «/usr/src/linux-headers-5.10.0-16-amd64»
  CC [M]  /home/olej/2022/OwnBooks/BHV.kernel/examples/tools/signed/hello_printk.o
  MODPOST /home/olej/2022/OwnBooks/BHV.kernel/examples/tools/signed/Module.symvers
  CC [M]  /home/olej/2022/OwnBooks/BHV.kernel/examples/tools/signed/hello_printk.mod.o
  LD [M]  /home/olej/2022/OwnBooks/BHV.kernel/examples/tools/signed/hello_printk.ko
make[1]: выход из каталога «/usr/src/linux-headers-5.10.0-16-amd64»

Код: Выделить всё

olej@nvme:~/2022/OwnBooks/BHV.kernel/examples/tools/signed$ sudo insmod hello_printk.ko
[sudo] пароль для olej:

Код: Выделить всё

olej@nvme:~/2022/OwnBooks/BHV.kernel/examples/tools/signed$ dmesg | tail -n4
[ 2911.727484] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
[ 5397.637583] hello_printk: loading out-of-tree module taints kernel.
[ 5397.637613] hello_printk: module verification failed: signature and/or required key missing - tainting kernel
[ 5397.637804] Hello, world!
Вот это место! Вот те 2 сообщения исходящие при загрузке модуля.
И помним, что любые, даже предупреждения, крайне опасны в программировании модулей ядра!

Код: Выделить всё

olej@nvme:~/2022/OwnBooks/BHV.kernel/examples/tools/signed$ lsmod | head -n2
Module                  Size  Used by
hello_printk           16384  0
Видим, что модуль в данном случае загрузился, тем не менее, как планировали...

Код: Выделить всё

olej@nvme:~/2022/OwnBooks/BHV.kernel/examples/tools/signed$ modinfo hello_printk.ko
filename:       /home/olej/2022/OwnBooks/BHV.kernel/examples/tools/signed/hello_printk.ko
author:         Oleg Tsiliuric <olej.tsil@gmail.com>>
license:        GPL
depends:
retpoline:      Y
name:           hello_printk
vermagic:       5.10.0-16-amd64 SMP mod_unload modversions

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: подписывание модулей ядра

Непрочитанное сообщение Olej » 01 авг 2022, 17:06

Olej писал(а):
01 авг 2022, 17:03

Код: Выделить всё

[ 5397.637583] hello_printk: loading out-of-tree module taints kernel.
[ 5397.637613] hello_printk: module verification failed: signature and/or required key missing - tainting kernel
Эти сообщения связаны с тем, что модуль полписан (signed) или не подписан публичным ключом ядра...
Это всё - составная часть безумия, развернувшегося вокруг secure boot ... и всем что вокруг.
И поведение определяется параметрами сборки ядра:

Код: Выделить всё

olej@nvme:~$ cat /boot/config-`uname -r` | grep CONFIG_MODULE_SIG
CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
# CONFIG_MODULE_SIG_ALL is not set
# CONFIG_MODULE_SIG_SHA1 is not set
# CONFIG_MODULE_SIG_SHA224 is not set
CONFIG_MODULE_SIG_SHA256=y
# CONFIG_MODULE_SIG_SHA384 is not set
# CONFIG_MODULE_SIG_SHA512 is not set
CONFIG_MODULE_SIG_HASH="sha256"
CONFIG_MODULE_SIG_KEY=""

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: подписывание модулей ядра

Непрочитанное сообщение Olej » 01 авг 2022, 17:57

Olej писал(а):
01 авг 2022, 17:06
И поведение определяется параметрами сборки ядра:
Для сравнения ... дистрибутив примерно от той же компании сборщиков и примерно того же времени:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/tools/signed$ lsb_release -a
No LSB modules are available.
Distributor ID: Linuxmint
Description:    Linux Mint 20.3
Release:        20.3
Codename:       una

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/tools/signed$ uname -a
Linux R420 5.4.0-122-generic #138-Ubuntu SMP Wed Jun 22 15:00:31 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/tools/signed$ cat /boot/config-`uname -r` | grep CONFIG_MODULE_SIG
CONFIG_MODULE_SIG_FORMAT=y
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
CONFIG_MODULE_SIG_ALL=y
# 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
CONFIG_MODULE_SIG_SHA512=y
CONFIG_MODULE_SIG_HASH="sha512"
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
И никаких сообщений при загрузке модуля:

Код: Выделить всё

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/tools/signed$ sudo insmod hello_printk.ko
[sudo] пароль для olej:       

olej@R420:~/2022/own.BOOKs/BHV.kernel/examples/tools/signed$ dmesg | tail -n3
[10297.379217] perf: interrupt took too long (2518 > 2500), lowering kernel.perf_event_max_sample_rate to 79250
[14210.696139] perf: interrupt took too long (3187 > 3147), lowering kernel.perf_event_max_sample_rate to 62750
[14404.701088] Hello, world!
И для подписи используется совсем другой алгоритм шифрования: SHA512 вместо SHA256

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: подписывание модулей ядра

Непрочитанное сообщение Olej » 02 авг 2022, 00:36

Olej писал(а):
01 авг 2022, 17:06
И поведение определяется параметрами сборки ядра:
Параметры описаны подробно здесь: Kernel module signing facility.
Судя по URL в полной мере эта часть появляется в ядре 4.10
Краткий пересказ:
Средство подписи модулей включается, если в разделе Enable Loadable Module Support конфигурации ядра включить: CONFIG_MODULE_SIG
Требование, чтобы модули были правильно подписаны (CONFIG_MODULE_SIG_FORCE)
Указывает, как ядро должно работать с модулем, имеющим сигнатуру, ключ которой неизвестен, или модулем, который не подписан.

Если выключено (“permissive”), то модули, для которых ключ недоступен, и модули, которые не подписаны, разрешены, но ядро будет помечено как испорченное, а соответствующие модули будут помечены как испорченные, как показано с символом «Е».

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

Независимо от этой настройки, если модуль имеет блок подписи, который не может быть проанализирован, он будет немедленно отклонен.
Автоматически подписывать все модули (CONFIG_MODULE_SIG_ALL)

Если этот параметр включен, модули будут автоматически подписаны на этапе сборки modules_install. Если он выключен, то модули должны быть подписаны вручную с помощью скрипта: scripts/sign-file
Параметры определяющие алгоритм шифрования:
CONFIG_MODULE_SIG_SHA1 Sign modules with SHA-1
CONFIG_MODULE_SIG_SHA224 Sign modules with SHA-224
CONFIG_MODULE_SIG_SHA256 Sign modules with SHA-256
CONFIG_MODULE_SIG_SHA384 Sign modules with SHA-384
CONFIG_MODULE_SIG_SHA512 Sign modules with SHA-512
Там же описывается техника ручного подписывания модулей...
© Copyright 2016, The kernel development community.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: подписывание модулей ядра

Непрочитанное сообщение Olej » 02 авг 2022, 00:54

Olej писал(а):
02 авг 2022, 00:36
Краткий пересказ:
Но когда установлено:

Код: Выделить всё

olej@nvme:~$ cat /boot/config-`uname -r` | grep CONFIG_MODULE_SIG
...
CONFIG_MODULE_SIG=y
# CONFIG_MODULE_SIG_FORCE is not set
# CONFIG_MODULE_SIG_ALL is not set
...
Исключить сообщения о подписи модуля (которая не требуется CONFIG_MODULE_SIG_FORCE, но и не разрешается CONFIG_MODULE_SIG_ALL) можно просто добавивив в начало Makefile сборки строки (1-й):

Код: Выделить всё

olej@nvme:~/2022/OwnBooks/BHV.kernel/examples/tools/signed$ head -n6 Makefile 
CONFIG_MODULE_SIG=n
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
DEST = /lib/modules/$(CURRENT)/misc
TARGET = hello_printk

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей