Soy nuevo en la codificación del kernel y en este momento estoy trabajando con archivos ELF que se han modificado un poco por motivos de seguridad, por lo que necesito ver algunos de sus encabezados de sección personalizados y extraer la clave de cifrado de código único para el CPU para descifrar el contenido del ELF modificado.
En la actualidad, la lógica anterior se ha implementado dentro de la función load_elf_binary en el archivo fs/binfmt_elf.c en el árbol fuente del núcleo, sin embargo, solo se trata de 250 líneas de cambio de código para las que necesito volver a compilar todo el núcleo, por lo que estoy buscando improvisar esta funcionalidad implementándola como un módulo de kernel cargable (LKM) para que cada vez que se cargue un ELF compruebe si es el ELF modificado o no y, si lo es, extraiga la clave de la sección correspondiente.
EDITAR: para resumirlo, estoy buscando hacer un módulo de kernel cargable para leer las secciones de un ELF y obtener el contenido de una sección personalizada que contiene la clave de cifrado y los metadatos relacionados y establecer esos valores en los registros de la CPU.
Sí, es posible , pero definitivamente no es fácil. Incluso hay una instalación de kernel compatible "kprobes" que le permite insertar llamadas a su propio código desde ubicaciones específicas (consulte Documentation/kprobes.txt ). Si insertar llamadas a su propio código no es suficiente, creo que necesitaría usar el mismo tipo de mecanismos que kprobe: parchear la ubicación deseada sobrescribiendo las instrucciones con jmp s o call s en su propio código.
Una vez trabajé en una empresa cuyo producto de seguridad instalaba sus ganchos al parchear en tiempo de ejecución el kernel de Windows. Esto es más o menos lo mismo, aunque al menos con Windows en ese momento había un número finito de versiones que debían ser compatibles.
Entonces, definitivamente es posible, pero no me gustaría intentarlo. Será muy frágil; en efecto, estará tratando de alcanzar un objetivo en movimiento. Es probable que cada parche de seguridad del kernel o actualización de versión rompa su código.