Lockdown, la nueva adopción del Kernel de Linux para limitar el acceso root al nucleo
Se dio a conocer recientemente la noticia de que Linus Torvalds adoptó un nuevo componente, el cual será incluido en una versión futura del núcleo de “Linux 5.4” este nuevo componente tiene como nombre “lockdown” el cual fue propuesto por David Howells (que ya anteriormente es el que ha implementado este componente en el Kernel de Red Hat) y Matthew Garrett (desarrollador de Google).
La función principal de lockdown es limitar el acceso del usuario root en el núcleo del sistema y esta funcionalidad se ha movido al módulo LSM cargado opcionalmente (Linux Security Module), que establece una barrera entre el UID 0 y el núcleo, limitando ciertas funciones de bajo nivel.
Esto permite que la función de bloqueo esté basada en políticas en lugar de codificar una política implícita dentro del mecanismo, con lo que el bloqueo incluido en Linux Security Module proporciona una implementación con una simple política destinada a uso general. Esta política proporciona un nivel de granularidad controlable a través de la línea de comandos del núcleo.
Esta protección de acceso al Nucleo es debido a que:
Si un atacante logra ejecutar código con privilegios de root como resultado del ataque, también puede ejecutar su código a nivel del núcleo, por ejemplo, reemplazando el núcleo con kexec o leyendo y/o escribiendo memoria a través de /dev/kmem.
La consecuencia más obvia de esta actividad puede ser omitir el arranque seguro UEFI o recuperar datos confidenciales almacenados a nivel del núcleo.
Inicialmente, las funciones de restricción de root se desarrollaron en el contexto de fortalecer la protección del arranque verificado y las distribuciones han estado utilizando parches de terceros durante mucho tiempo para bloquear la derivación de arranque seguro UEFI.
Al mismo tiempo, tales restricciones no se incluyeron en la composición central del núcleo debido a los desacuerdos en su implementación y el temor a la interrupción de los sistemas existentes. El módulo de “lockdown” incorpora parches ya utilizados en distribuciones, que se procesaron en forma de un subsistema separado que no está vinculado al arranque seguro UEFI.
Cuando está habilitado, varias piezas de la funcionalidad del núcleo están restringidas. Por lo que las aplicaciones que dependen del acceso de bajo nivel al hardware o al el núcleo puede dejar de funcionar como resultado, por lo tanto, esto no debería ser habilitado sin una evaluación adecuada de antemano. Comenta Linus Torvalds.
En modo de bloqueo, restringe el acceso a /dev/mem, /dev/kmem, /dev/port, /proc/kcore, debugfs, debugfs, debugfs kprobes, mmiotrace, tracefs, BPF, PCMCIA CIS (card information secure), algunos ACPI y los registros MSR de la CPU, las llamadas kexec_file y kexec_load están bloqueadas, el modo de suspensión está prohibido, el uso de DMA para dispositivos PCI está limitado, la importación de código ACPI desde variables EFI está prohibida, las manipulaciones con puertos de entrada/salida, incluido el cambio del número de interrupción y el puerto de entrada/salida para puerto serie no están permitidos.
De forma predeterminada, el módulo de bloqueo no está activo; se crea cuando la opción SECURITY_LOCKDOWN_LSM se especifica en kconfig y se activa mediante el parámetro de kernel “lockdown =”, el archivo de control “/sys/kernel/security/lockdown” o las opciones de compilacion LOCK_DOWN_KERNEL_FORCE_ * , que puede tomar los valores de “integridad” y “confidencialidad”.
En el primer caso, las funciones que permiten realizar cambios en el núcleo de trabajo desde el espacio del usuario están bloqueadas, y en el segundo caso, además de esto, la funcionalidad que se puede utilizar para extraer información confidencial del núcleo está deshabilitada.
Es importante tener en cuenta que el bloqueo solo limita las capacidades regulares de acceso al kernel, pero no protege contra modificaciones como resultado de la explotación de vulnerabilidades. Para bloquear los cambios en el núcleo en funcionamiento cuando el proyecto Openwall utiliza exploits , se está desarrollando un módulo LKRG (Linux Kernel Runtime Guard) separado.
La función lockdown ha tenido comentarios y revisiones de diseño importantes en muchos subsistemas. Este código ha estado en Linux-next durante algunas semanas, con algunas correcciones aplicadas en el camino.