2 votos

¿Cómo puedo cargar un módulo del kernel sin firma en mi kernel que aplica la firma?

He compilado un módulo del kernel (wacom.ko) utilizando el código fuente del kernel adecuado para mi dispositivo y la cadena de herramientas de Google. Cuando intenté insmod el módulo, aparecía un mensaje de error que decía

llaves necesarias no disponibles

Investigué y descubrí que es necesario firmar el módulo para cargarlo en el kernel si éste utiliza la aplicación de la firma (que en mi caso, lo hace). Supongo que no hay forma de obtener la clave privada que el kernel utilizó originalmente al compilar. Pero tampoco tiene sentido cuando pienso en cómo cualquier desarrollador podría ampliar el núcleo escribiendo módulos si existe esta barrera.

¿Hay alguna manera de desactivar la aplicación de la firma del kernel y cargar el módulo que he creado? Alternativamente, ¿puedo de alguna manera firmar mi módulo y cargarlo?

1voto

Jack Wade Puntos 231

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

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X