Blindando nuestro Kernel: Round 1

En esta primera entrada hablaremos sobre los conceptos básicos que debemos entender antes de profundizar en materia, de modo que …. ¿Qué es el kernel? Es posible que hayáis oído hablar de él en alguna ocasión, pero ¿cuál es la verdadera función de esta parte del sistema? Todas las acciones que el sistema operativo necesita hacer son procesadas por este núcleo. Podríamos decir que lo engloba todo: desde las teclas que pulsamos hasta lo que muestra la pantalla. Dado que tiene control total de los eventos internos que suceden en el sistema, es una parte muy crítica y atacada, sobre todo en los sistemas unix, desde FreeBSD hasta los más conocidos en la actualidad (Ubuntu, Debian, CentOS, etc…).

Este software tan poderoso está programado mayoritariamente en “C”, excepto algunos controladores muy concretos. Para que pueda gobernar nuestro sistema de manera eficiente se necesita involucrar a muchas de las partes en las que se divide. La parte en la que nos centraremos ahora será la tabla de llamadas que el kernel expone al usuario. A través de esta syscall le enviamos acciones al sistema. Por ejemplo, para listar los ficheros de un directorio realizaremos la llamada a la función open() en la tabla. Todo esto sucede de manera invisible y automática, sin que el usuario pueda apreciar el proceso. Al igual sucede con la función write() situada en la misma tabla de llamadas, la cual se ejecuta, por ejemplo, cuando un usuario guarda un documento en el disco duro.


Dado que la única parte que el kernel expone es la mencionada tabla, es el vector de ataque que un malware podría usar en caso de querer apoderarse del kernel para tener poder total dentro de nuestro sistema.

Otra parte de la que se encarga el kernel es de gestionar algunos drivers que el sistema necesita. Estos drivers, también llamados controladores, son el software encargado de que el hardware del dispositivo y el kernel encargado de enviar y recibir las órdenes, puedan comunicarse mutuamente. Estos drivers son cargados dentro del kernel a través de módulos que los desarrolladores de software programan. Por ejemplo, en caso de que nuestro sistema no detecte los drivers de la antena wifi, necesitaremos descargarlos y el sistema automáticamente sin que tengamos que preocuparnos, cargará el módulo encargado de la comunicación con la antena.

Supongamos que el driver que dice ser el controlador para nuestra wifi, lo que hace es (a través de la tabla de llamadas), instalar el módulo necesario para poder usar el wifi y, además, modifica la función de la syscall encargada de abrir archivos para que no nos muestre «alguno» de ellos, ocultando algún tipo de malware.

Una vez entendido dónde los ciberdelincuentes podrían ocultar malware en el kernel del sistema y cómo funcionan, ya podemos pasar a la fase defensiva que os explicaré en el siguiente post de la serie.

Blindando nuestro Kernel: Round 2