Blindando nuestro Kernel: Round 3

En este tercer post de la saga vamos a evitar que el malware pueda insertarse en nuestro kernel. Para ello compilaremos nuestro propio kernel para que no permita los LKM (loadable kernel modules).

Lo primero será descargar de kernel.org la versión que se adapte a aquello que estamos usando actualmente (uname -r). En mi caso estoy en un Ubuntu 16.04.2 LTS, de modo que descargamos la versión 4.4.84 y la extraemos, pero para que no nos falte ningún módulo actual copiaremos /boot/config-$(uname -r) como .config dentro de la carpeta que se generó en la extracción. Al copiar los módulos actualmente instalados evitaremos problemas después del reinicio, ya que hay características que podrían quedar desactivadas.

Modificando el .config del kernel que vamos a compilar observaremos que la característica CONFIG_DEVMEM está activa, esto limita el acceso a la memoria física y CONFIG_STRICT_DEVMEM restringirá su acceso. Ambas quedarán marcadas con una «n». Esto es así porque el kernel tiene un espacio reservado única y exclusivamente para él, por motivos de seguridad. Con el comando make menuconfig también se pueden desmarcar estas opciones.

Ahora solo nos queda compilar nuestro Custom kernel con el comando make, o si nuestro ordenador dispone de 4 u 8 núcleos, en mi caso make -j4. Mientras éste se compila podemos salir a pasear al perro y cuando regresemos solo faltaría instalar los módulos del nuevo kernel con un make modules_install install, pero no sin antes desactivar la carga de módulos también en /etc/sysctl.conf, simplemente añadiendo o modificando esta línea «kernel.modules_disabled = 1» ya que «0» habilita la carga de módulos. Este archivo sysctl.conf contiene características del kernel, por ejemplo, la de desactivar módulos, tal y como acabamos de ver.

Como habréis observado al final del output durante la compilación nos regenerará el boot tal y como lo hemos configurado en el .config, de hecho, si abrimos el nuevo fichero config-(uname -r) en /boot observaremos que los módulos que no nos interesan están marcados con una «n».

El siguiente paso será modificar el menú de inicio llamado grub, desde el que se pueden marcar distintas opciones de arranque. Ahora modificaremos el grub (/etc/default/grub) para cambiar el GRUB_TIMEOUT y subirlo a 10 segundos.

Ahora solo faltará lanzar el update-grub2 para actualizar la configuración, de este modo nuestro nuevo kernel protegido saldrá marcado por defecto en el menú de inicio. ¡Es hora de reiniciar y comprobar que todo funciona correctamente!.

Para comprobar si todo funciona como debe podemos hacer todo el procedimiento anterior, ahora el kernel ya no soportará la característica LKM (carga de módulos). Ahora ningún módulo puede insertarse dentro del kernel: hemos forzado que no admita la carga de nuevos módulos.

Son muchos los métodos y consejos que existen para este tipo de amenazas, estos son algunos.

NOTA:

Si te perdiste el round 1, aún estás a tiempo: Blindando nuestro kernel. Round 1 y sigue con el Round 2 para iniciar la fase defensiva.

Nos vemos en el próximo post: ¡¡PROTEGEROS!!

Múltiples vulnerabilidades en sistemas mac OS