LKRG, un módulo diseñado para detectar y bloquear ataques y violaciones en el Kernel de Linux

junio 29, 2020 , 0 Comments

El proyecto Openwall ha publicado el lanzamiento del módulo del núcleo LKRG 0.8 (Linux Kernel Runtime Guard), diseñado para detectar y bloquear ataques y violaciones de la integridad de las estructuras del núcleo.

El módulo es adecuado tanto para organizar la protección contra exploits ya conocidos para el kernel de Linux (por ejemplo, en situaciones donde es problemático actualizar el kernel en el sistema), como para exploits opuestos para vulnerabilidades desconocidas.

¿Qué hay de nuevo LKRG 0.8?

En esta nueva version se ha cambiado el posicionamiento del proyecto LKRG, que ahora no se divide en subsistemas separados para verificar la integridad y determinar el uso de exploits, sino que se presenta como un producto completo para identificar ataques y diversas violaciones de integridad;

En cuanto a la compatibilidad, de esta nueva version, podremos encontrar que es compatible con los núcleos de Linux de 5.3 a 5.7, así como con los núcleos compilados con optimizaciones agresivas de GCC, sin las opciones CONFIG_USB y CONFIG_STACKTRACE o con la opción CONFIG_UNWINDER_ORC, así como con los núcleos en los que no hay funciones interceptadas por LKRG si puede prescindir.

Además de que se añadió el soporte experimental para plataformas ARM de 32 bits (probado en Raspberry Pi 3 Modelo B), mientras que para el soporte disponible anterior para AArch64 (ARM64) se complementa con la compatibilidad con Raspberry Pi 4.

Por otra parte, se han agregado nuevos ganchos, que incluyen un manejador de llamadas «hook()» para identificar mejor las vulnerabilidades que manipulan las «capabilities», en lugar de los identificadores de proceso.

En los sistemas x86-64, se verifica y aplica el bit SMAP (Prevención de acceso en modo supervisor), diseñado para bloquear el acceso a los datos en el espacio del usuario desde el código privilegiado ejecutado a nivel del núcleo. Protección SMEP (Supervisor Mode Execution Prevention) se implementó anteriormente.

Se ha aumentado la escalabilidad de la base de datos de seguimiento de procesos: en lugar de un solo árbol RB protegido por un spinlock, está involucrada una tabla hash de 512 árboles RB, protegida por 512 bloqueos de lectura y escritura, respectivamente;

Se implementa y habilita un modo por defecto, en el que la verificación de integridad de los identificadores de proceso a menudo se realiza solo para la tarea actual, y también opcionalmente para las tareas activadas (despertar). Para otras tareas que están en estado de suspensión o que funcionan sin una llamada a la API del núcleo controlada por el LKRG, la verificación se realiza con menos frecuencia.

Además de que el archivo de la unidad systemd se ha rediseñado para cargar el módulo LKRG en una etapa temprana de carga (la opción de línea de comandos del kernel se puede usar para desactivar el módulo);

Durante la compilacion, se realizó una comprobación de algunas de las configuraciones obligatorias del núcleo CONFIG_ * para generar mensajes de error significativos en lugar de fallas poco claras.

De los demás cambios que se destacan de esta nueva version:

  • Soporte agregado para los modos de espera (ACPI S3, suspensión a RAM) y suspensión (S4, suspensión a disco).
  • Soporte agregado para DKMS en el Makefile.
  • Se propone una nueva lógica para determinar los intentos de salir de las restricciones de espacio de nombres (por ejemplo, de los contenedores Docker).
  • En el proceso, la configuración de LKRG se coloca en una página de memoria, generalmente de solo lectura.
  • La salida a los registros de información que pueden ser más útiles para ataques (por ejemplo, información sobre direcciones en el núcleo) está limitada por el modo de depuración (log_level = 4 y superior), que está deshabilitado de manera predeterminada.
  • Se agregaron nuevos parámetros de sysctl y módulo para ajustar LKRG, así como dos sysctl para una configuración simplificada eligiendo entre los perfiles preparados por los desarrolladores.
  • La configuración predeterminada se cambia para lograr un equilibrio más equilibrado entre la velocidad de detección de violaciones y la efectividad de la reacción, por un lado, y el impacto en la productividad y el riesgo de falsos positivos por el otro.
  • Según las optimizaciones propuestas en la nueva versión, la disminución del rendimiento al aplicar LKRG 0.8 se estima en 2.5% en el modo predeterminado («pesado») y 2% en el modo ligero («ligero»).

Si quieres conocer mas la respecto, puedes consultar los detalles aqui. 


Some say he’s half man half fish, others say he’s more of a seventy/thirty split. Either way he’s a fishy bastard.