Construir módulos del kernel fuera del árbol no suele ser recomendable para los novatos como yo, así que para evitar problemas como vermagic
desajuste :
config MODVERSIONS
...
Por lo general, hay que utilizar módulos compilados con el kernel. Decir Y aquí hace que a veces sea posible usar módulos compilados para diferentes kernels, añadiendo suficiente información a los módulos para (con suerte) detectar cualquier cambio que los haga incompatibles con el kernel que estás ejecutando.
También el advertencia :
cargar un módulo fuera del árbol contamina el kernel
Carga forzada de módulos puede llevar a situaciones como símbolos / referencias no definidas (funciones / variables exportado y disponible en /proc/kallsyms
).
He investigado y he descubierto que hay que firmar el módulo para cargarlo
...
Pero tampoco tiene sentido cuando pienso en cómo cualquier desarrollador podría ampliar el núcleo escribiendo módulos si existe esta barrera.
Es el comportamiento deseado :
La firma de módulos aumenta la seguridad al dificultar la carga de un módulo malicioso en el kernel.
Y por eso MODULE_SIG_FORCE
está ahí. En los ordenadores UEFI Secure Boot
requiere necesariamente que el kernel y los módulos estén firmados como parte de la cadena de arranque seguro. El sistema Android Verified Boot
signos enteros boot
que, a su vez, con la ayuda de dm-verity
- asegura /system
y /vendor
las particiones que posiblemente incluyan los módulos cargables del kernel. Así que firmar los módulos no parece necesario:
La firma de los módulos no es obligatoria y no se comprueba
Citado en Módulos del núcleo cargables .
Supongo que no hay forma de obtener la clave privada que el kernel utilizó originalmente al compilar.
Tienes razón. El par de claves públicas/privadas se genera (usando openssl
) al construir el kernel. La clave pública está integrada en el kernel y puede verse en /proc/keys
o por:
~# keyctl list %:.system_keyring
Si el núcleo se construyó con IKCONFIG_PROC
, el algoritmo de hash puede ser visto por:
~# zcat /proc/config.gz | grep MODULE_SIG_HASH
Un perl script es también parte del árbol de fuentes del kernel que puede ser usado para firmar módulos:
~$ sign-file <algorithm> <priv_key_file> <pub_key_file> <module>.ko
¿Hay alguna manera de desactivar la aplicación de la firma del kernel y cargar el módulo que he creado?
No.
Alternativamente, ¿puedo firmar de alguna manera mi módulo y cargarlo?
Pida al desarrollador del kernel que le proporcione la misma clave privada (si es posible), de lo contrario la única opción es reconstruir todo el kernel. Obtenga la configuración del kernel en ejecución desde /proc/config.gz
si está disponible y es necesario. No olvide desactivar CONFIG_MODULE_SIG
o bien, establecer CONFIG_MODULE_SIG_ALL
.
FUENTE: Construcción de módulos externos