Lanzamiento de LKRG 1.0.0 para proteger contra la explotación de vulnerabilidades en el núcleo de Linux

El proyecto Openwall ha publicado el módulo del núcleo LKRG 1.0.0 (Linux Kernel Runtime Guard), destinado a verificar la integridad de las estructuras del núcleo y detectar intentos de explotación de vulnerabilidades en el núcleo. Se señala que la asignación del número de versión 1.0.0 marca el logro de un estado maduro del proyecto. El código del proyecto se distribuye bajo la licencia GPLv2.

El módulo es adecuado tanto para la protección contra ataques, que manipulan vulnerabilidades ya conocidas en el núcleo de Linux, como para contrarrestar exploits que utilizan vulnerabilidades aún no descubiertas, si no se aplican medidas especiales para eludir el LKRG. La protección se basa en la detección de cambios no autorizados en el núcleo en funcionamiento (verificación de integridad) y el seguimiento de cambios en los privilegios de los procesos de usuario (determinación de la aplicación de exploits).

La verificación de integridad se lleva a cabo mediante la comparación de hashes calculados para las áreas de memoria más importantes y las estructuras de datos del núcleo, tales como IDT (Tabla de Descriptores de Interrupción), MSR, tablas de llamadas al sistema, todos los procedimientos y funciones, controladores de interrupciones, listas de módulos cargados, contenido de la sección ".text" de los módulos y atributos de los procesos. El procedimiento de verificación se activa periódicamente por un temporizador o al ocurrir determinados eventos en el núcleo, por ejemplo, al realizar llamadas al sistema setuid, setreuid, fork, exit, execve y do_init_module.

La detección de posibles aplicaciones de exploits y el bloqueo de ataques se realiza en la fase previa a que el núcleo otorgue acceso a los recursos (por ejemplo, antes de abrir un archivo), pero después de que el proceso haya obtenido privilegios no autorizados (por ejemplo, cambio de UID). Al detectar comportamientos no autorizados de los procesos, se lleva a cabo su terminación forzada, lo que es suficiente para bloquear muchos exploits. Se estima que los costos adicionales del funcionamiento del módulo son del 2 al 2.5%.

Se admite el funcionamiento en sistemas con arquitecturas x86-64, AArch64 (ARM64), ARM32 y x86. El funcionamiento de LKRG 1.0.0 ha sido probado con núcleos de diversas distribuciones, comenzando con el núcleo 3.10 de RHEL/CentOS 7 y terminando con el 6.17-rc4 del repositorio donde se está preparando el lanzamiento de Fedora 44. Los paquetes están disponibles para las distribuciones ALT Linux, Arch Linux, Astra Linux, Gentoo, Guix, NixOS, Rocky Linux, Whonix, Yocto y OpenBMC. Los paquetes compilados para Rocky Linux se pueden utilizar en RHEL 8/9 y distribuciones derivadas, como AlmaLinux 8/9, mientras que los paquetes para Whonix en Debian y Ubuntu.

Entre los cambios en la nueva versión:

  • Se garantiza la compatibilidad con núcleos de Linux hasta la versión 6.17-rc4.
  • Al utilizarse con núcleos a partir de 6.13, se ha dejado de interceptar las llamadas remotas override_creds() y revert_creds(), lo que limitó la identificación de ataques que sobrescriben el puntero cred. Las limitaciones intentaron compensarse mediante la adición de verificaciones para sobrescribir el puntero cred en otros lugares del núcleo.
  • Se ha interrumpido el seguimiento excesivo de credenciales para las cuales no se realiza una verificación de integridad. Este cambio ha permitido reducir la base de código en aproximadamente 1500 líneas.
  • Se ha añadido soporte para el mecanismo introducido en el núcleo de Linux 6.10 para crear archivos temporales en el sistema de archivos OverlayFS, utilizando la opción O_TMPFILE (ovl_tmpfile). Este soporte es necesario para prevenir falsas alarmas que se presentan al utilizar contenedores aislados en sistemas con núcleos 6.10-6.12.
  • Para sistemas x86_64, se ha añadido soporte para la tecnología Intel CET (Control-flow Enforcement Technology) para proteger el código ejecutable usando instrucciones IBT (indirect branch tracking), así como protección de software kCFI (kernel Control Flow Integrity) para bloquear la alteración del orden normal de ejecución (control flow) debido a exploits que modifican los punteros de función almacenados en memoria.
  • Se ha utilizado el mecanismo kprobes en lugar de kretprobes para conectar múltiples manejadores, simplificando el código de instalación de hooks y permitiendo una mayor eficiencia.
  • Se ha revisado el manejo de bloqueos (lock) de datos en el núcleo, específicos para el proceso (per-task shadow data). Al eliminar bloqueos innecesarios, se ha mejorado el rendimiento al acceder a estos datos.
  • Se han corregido errores que podían llevar a condiciones de carrera, problemas de integridad y falsas alarmas.
  • Se ha mejorado el soporte para la compilación utilizando Clang.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster