LINUX.ORG.RU

Автоматическая подпись модулей ядра при сборке пакета.

 ,


0

3

Пользуюсь ядром с автоматическим подписыванием всех модулей ядра (CONFIG_MODULE_SIG_ALL). Захотелось прикрутить такую же автоматическую подпись модулей к пакетам, собирающим модули ядра (например, nvidia-drivers).

Написал в env на пакет небольшой скрипт post_pkg_preinst. Проверяет конфиг ядра (благо, все эти пакеты уже тянут в inherit linux-info), ищет find-ом в ${D} модули ядра, накладывает подпись через стандартную утилиту ядра sign-file. Все отлично работает, но т.к. хочется еще и бинарный пакет с подписанными модулями, надо выносить все это дело в post_src_install, где модифицировать бинарные ELF файлы не дает.

Подумал, что это sandbox (первое, что приходит в голову из различий между src_install и pkg_preinst). Выключил его вообще через FEATURES - все тоже самое, хотя при этом без проблем пишу в корень или /sbin прямо из post_src_install (т.е. sandbox 100% не работает). Причем на других пакетах аналогично - не дает модифицировать бинарный ELF файл, ни в ${S}, ни в ${D}. Даже если просто делаю «cat ${D}/file1 ${D}/file2 > ${D}/file3», где file1 - бинарный ELF файл, всегда создает file3 с содержимым только из file1 вне зависимости от содержимого file2 и прав доступа (т.е. не зависит исполняемый это файл или нет), однако, текстовые файлы или файлы с «мусором» соеденяет с помощью «cat» без проблем.

Может, кто-то сталкивался? В идеале, нужно отключить эту защиту на конкретную операцию, но ничего не могу найти в интернете или мануалах.

Upd. Нашел в чем проблема, без FEATURES=«nostrip» режет все «лишнее» в бинарных ELF, считая доп. отладочной информацией.

★★

Последнее исправление: viewizard (всего исправлений: 2)

В общем, если кого интересует, код выглядит следующим образом (например, файл /etc/portage/env/x11-drivers/nvidia-drivers):

FEATURES="nostrip"
post_src_install() {
	if ! $(linux_config_exists) ; then
		eerror "Kernel configuration file not found."
		die
	fi
	MODULE_SIG_HASH=$(linux_chkconfig_string MODULE_SIG_HASH | tr -d '"');
	if [[ ! $MODULE_SIG_HASH ]]; then
		eerror "MODULE_SIG_HASH is not configured in kernel configuration file."
		die
	fi
	if [ ! -x /usr/src/linux/scripts/sign-file ]; then
		eerror "Can't find /usr/src/linux/scripts/sign-file file or file not executable."
		die
	fi
	if [ ! -f /usr/src/linux/certs/signing_key.pem ]; then
		eerror "Can't find /usr/src/linux/certs/signing_key.pem file."
		die
	fi
	if [ ! -f /usr/src/linux/certs/signing_key.x509 ]; then
		eerror "Can't find /usr/src/linux/certs/signing_key.x509 file."
		die
	fi
	MODULES_FOR_SIGN="$(find ${D}/lib/modules/ -type f -name *.ko)"
	for m in ${MODULES_FOR_SIGN[*]} ; do
		/usr/src/linux/scripts/sign-file $MODULE_SIG_HASH /usr/src/linux/certs/signing_key.pem /usr/src/linux/certs/signing_key.x509 ${m} || die
		ewarn "${m#${D}} module signed"
	done
}
Код универсальный, но проверка ориентирована на обязательную подпись ядра (если чего-то не хватает - завершит сборку пакета с ошибкой). Второй нюанс - не отслеживается версия ядра (скрипт ориентирован на версию ядра 4.3.3 или новее), в версиях ядра старше 4.3.3 /usr/src/linux/scripts/sign-file не исполняемый файл, а perl скрипт. Более подробно: https://wiki.gentoo.org/wiki/Signed_kernel_module_support

viewizard ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.