Singularity: un rootkit moderno para el núcleo de Linux

Singularity: un rootkit moderno para el núcleo de Linux

Si alguna vez quiso ver de qué es capaz un rootkit LKM moderno, creado no para atacar sino para demostrar los límites de la invisibilidad en Linux, Singularity — Singularity— es un buen ejemplo. Es un proyecto del investigador MatheuZSecurity, cuyo objetivo fue desarrollar un módulo del kernel lo más resistente posible a la detección por las herramientas habituales de diagnóstico y forense. El resultado es una herramienta que incluso hace cuestionar a analistas experimentados de DFIR dónde termina la parte visible del sistema.

Singularity funciona con núcleos modernos de la serie 6.x, se carga como módulo LKM y, tras activarse, oculta completamente su presencia. El autor advierte desde el principio: el módulo no se puede descargar por los medios estándar; para devolver el sistema a su estado normal es necesario reiniciar. Por eso se recomienda probarlo solo en una máquina virtual.

Cómo funciona Singularity

La lógica principal se basa en ganchos de ftrace que interceptan llamadas sistémicas clave —desde getdents y stat hasta openat y readlinkat—. De ese modo, el rootkit se inserta en el flujo de llamadas de las aplicaciones de usuario al kernel, filtrando resultados y sustituyendo metadatos. Por eso los procesos, directorios y puertos de red marcados para ocultación desaparecen no solo de /proc, sino de todas las utilidades de monitorización: ps, top, netstat, ss, lsof e incluso /proc/net/*.

Singularity admite varios métodos de ocultación. Cualquier proceso se puede "esconder" con la señal kill -59 PID: tras eso desaparece de todas las tablas. Los directorios y archivos se filtran mediante una plantilla definida en include/hiding_directory_def.h. Si se crea un directorio con el nombre especificado, inmediatamente se vuelve invisible para ls, find y otras utilidades. El usuario puede cambiar la máscara del filtro y así evitar firmas típicas de detección.

El proyecto incluye, además, ocultación de puertos de red. Cualquier conexión, por ejemplo en el puerto 8081, se excluirá de la salida de todas las herramientas que leen datos de /proc/net. Desde el exterior el sistema parece que ese puerto no está escuchando nada, aunque la conexión esté activa.

Elevación de privilegios y ocultación de rastros

Singularity puede proporcionar acceso root utilizando una variable de entorno "mágica": MAGIC=mtz bash inicia un shell con privilegios de superusuario. El mismo efecto se puede lograr enviando al proceso la señal -59. Este mecanismo está implementado en el módulo become_root.c, donde el gancho modifica directamente la estructura cred en la memoria del kernel.

Para ocultar rastros, el módulo modifica la lectura de los registros del sistema. clear_taint_dmesg.c filtra la salida de dmesg y otros registros, eliminando líneas que podrían indicar la carga del módulo o accesos sospechosos al kernel. Como resultado, el sistema aparenta estar "limpio", incluso si ya está comprometido.

Para evitar la detección a través de sysfs o la lista de módulos, Singularity elimina su propio kobject del árbol de módulos y borra las estructuras asociadas. Incluso la marca de contaminación del kernel (taint) se normaliza periódicamente mediante una función separada para ocultar la intervención.

En el README el autor advierte expresamente: aunque Singularity pasa desapercibido para utilidades estándar como chkrootkit, unhide y rkhunter, un analista experimentado aún puede encontrar rastros si lo desea. Por ejemplo, el módulo puede detectarse con herramientas de bajo nivel para sistemas de archivos, como debugfs. No obstante, el desarrollador recomienda colocar artefactos en /dev/shm, que es un sistema de archivos en memoria al que debugfs no tiene acceso. Este enfoque complica el análisis porque los datos desaparecen tras el reinicio.

Si se activa la carga automática mediante load_and_persistence.sh, el módulo aparece en la lista de arranque /etc/modules-load.d/, por lo que el autor aconseja cambiar el nombre del archivo de configuración y del binario para evitar coincidencias evidentes.

Arquitectura técnica y mapa de ganchos

En el corazón de Singularity está el módulo ftrace_helper.c, responsable de instalar los ganchos. A través de él se conectan los interceptores de llamadas del sistema: getdents oculta directorios y procesos, stat/statx sustituye metadatos, read y write filtran accesos a registros y herramientas de trazado, y hiding_tcp.c elimina entradas de las tablas de red. También hay un gancho en init_module que bloquea intentos de otros módulos de inyectarse en el sistema.

Es interesante que el desarrollador añadió su propio "normalizador de contaminación del kernel": el módulo reset_tainted.c busca periódicamente la variable tainted_mask y restablece las banderas que podrían revelar modificaciones del sistema. De ese modo, incluso tras una inspección profunda el kernel parece "limpio".

Todo esto convierte a Singularity en un ejemplo claro de hasta qué punto se puede interferir flexible y profundamente en el comportamiento de Linux cuando se trabaja a nivel de kernel. Desde la perspectiva de una demostración investigadora, es casi el "jefe final" para los analizadores.

Finalidad y aspectos éticos

El autor subraya que el proyecto está destinado únicamente a fines educativos e investigativos. El código es abierto, pero su uso fuera de entornos de laboratorio controlados puede violar leyes. Por eso Singularity no es una herramienta de ataque, sino una forma de estudiar los límites de los módulos del kernel y comprender mejor cómo detectarlos. Para profesionales de la ciberseguridad es un excelente campo de pruebas: permite ver qué llamadas del sistema se interceptan con más frecuencia, cómo funciona el filtrado de /proc y qué señales permiten detectar la presencia de un rootkit a pesar de sus técnicas de ocultación.

En resumen, Singularity no es solo otro ejemplo de código malicioso, sino un manual sobre la arquitectura de los módulos ocultos. Muestra cómo funcionan los métodos modernos para eludir la forense y por qué combatirlos requiere no solo herramientas, sino un conocimiento profundo de la mecánica del kernel. El proyecto se desarrolla activamente en GitHub y está abierto a mejoras investigativas. Para comunicarse y debatir, el autor invita a la comunidad de Discord Rootkit Researchers

Para practicantes y aficionados a la seguridad de la información, Singularity es una oportunidad poco común de ver la cocina interna del kernel desde la perspectiva de quien sabe ocultarse en él casi sin dejar rastro. Por eso merece estudiarse, pero solo en un entorno seguro.

Alt text