>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Seguridad
C

Singularity: cómo funcionan los rootkits modernos para Linux y por qué son tan difíciles de detectar

1699 estrellas

Imagina este escenario: inicias sesión en un servidor, ejecutas ps aux y todo parece perfectamente normal. Revisas las conexiones de red con ss — limpio. Revisas los registros con dmesg — ninguna entrada sospechosa. Pero en ese mismo momento, un proceso oculto con privilegios de root se está ejecutando en el sistema, interceptando tus acciones y filtrando datos directamente en la memoria del kernel.

¿Suena como algo de películas de hackers? En realidad, esta es la realidad de los rootkits LKM modernos (Linux Kernel Modules). Hoy examinaremos el proyecto Singularity del desarrollador MatheuZSecurity — una herramienta avanzada para investigar capacidades de sigilo en kernels Linux 6.x.

¿Qué es Singularity y por qué un investigador lo necesita?

Singularity no es solo otro juguete para cambiar el UID del usuario. Es un proyecto de investigación completo creado para probar los límites de los sistemas de seguridad modernos. El autor se hizo la pregunta: "¿Hasta dónde puede llegar un rootkit si ya ha logrado inyectarse en el kernel?"

El proyecto se dirige a kernels modernos (rama 6.x) y utiliza la infraestructura de ftrace para la interceptación de llamadas al sistema. Esto lo hace extremadamente interesante para programadores de sistemas y especialistas en seguridad de la información (DFIR), ya que demuestra cómo evadir gigantes de la seguridad como eBPF (Falco, Tracee) y LKRG (Linux Kernel Runtime Guard).

Características principales: el arte de permanecer invisible

Singularity es un verdadero cuchillo suizo para operaciones encubiertas. Repasemos las capacidades más impresionantes.

1. Camuflaje a nivel fantasma

El rootkit no solo oculta archivos o procesos — lo hace sistemáticamente:

  • Procesos: Cualquier PID puede volverse invisible para ps, top e incluso /proc. Además, Singularity rastrea y oculta automáticamente todos los procesos hijos.
  • Archivos: El ocultamiento funciona por patrones. Si creaste un directorio con un nombre "secreto", desaparecerá de la salida de ls y find, aunque aún puedes acceder a los archivos dentro si conoces la ruta.
  • Red: Las conexiones en puertos específicos (por ejemplo, tu reverse shell) no serán vistas ni por netstat ni por tcpdump.

2. Evadir eBPF y EDR modernos

Esta es probablemente la parte más técnicamente compleja. La mayoría de los sistemas de monitoreo modernos (como Falco) dependen de eBPF para el seguimiento de eventos en tiempo real. Singularity no bloquea eBPF (eso sería demasiado notorio), sino que filtra cuidadosamente los datos que los programas eBPF transmiten al espacio de usuario. Sustituye resultados en los buffers, haciendo que los recursos ocultos sean invisibles para los "ojos" del monitoreo.

3. Manipulación de privilegios mediante señales

Olvídate de los exploits complejos. Singularity implementa un mecanismo elegante:

kill -59 $$

Enviar una señal específica (en este caso, la 59) al proceso actual eleva instantáneamente sus privilegios a root. Simple, efectivo y muy peligroso en las manos equivocadas.

4. Luchando contra la investigación forense (Evasión forense)

El proyecto incluso puede engañar a herramientas de análisis de disco de bajo nivel, como debugfs. Intercepta las llamadas al sistema de lectura/escritura y "sobre la marcha" elimina las menciones de sí mismo de los buffers de salida, reemplazándolas con espacios. Esto permite mantener la integridad del sistema de archivos (los checksums no se rompen), mientras oculta la presencia de código malicioso.

¿Cómo funciona internamente?

La arquitectura de Singularity está construida sobre un sistema modular. En el repositorio encontrarás archivos separados para cada tarea: hiding_tcp.c para redes, bpf_hook.c para contramedidas de eBPF, lkrg_bypass.c para evasión de protección del kernel.

La implementación de logging es interesante. El rootkit hace hooking de la función do_syslog, lo que le permite filtrar el ring buffer del kernel. Si el sistema intenta generar un mensaje sobre la contaminación del kernel por cargar un módulo de terceros, Singularity simplemente elimina esa cadena.

Demostración de ocultamiento de procesos

Valor práctico para desarrolladores

¿Por qué un desarrollador debería estudiar código de rootkits?

  1. Comprensión de los entresijos de Linux: El código del proyecto es un excelente libro de texto sobre trabajo con llamadas al sistema, estructuras de task_struct, la pila de red y el subsistema de ftrace.
  2. Diseño de sistemas de seguridad: Para construir una fortaleza sólida, necesitas saber cómo funcionan las armas de asedio. Estudiando los métodos de evasión de eBPF en Singularity, puedes configurar mejor tus reglas en Falco o Tracee.
  3. Desarrollo de kernel: Este es un ejemplo práctico de cómo escribir LKM (Linux Kernel Modules) para versiones modernas del kernel, teniendo en cuenta los cambios en la API.

Precauciones de seguridad

Importante: Singularity es una herramienta poderosa que se oculta a sí misma después de cargarse (lsmod no lo mostrará). No tiene función de descarga, ya que eso crearía un vector de detección adicional. Para deshacerte de él, se requerirá un reinicio.

El autor recomienda encarecidamente probar el proyecto solo en máquinas virtuales. Y, por supuesto, usarlo exclusivamente con fines educativos y de investigación.

Singularity es un ejemplo impresionante de lo sofisticados que se han vuelto los métodos de sigilo en Linux. El proyecto demuestra que incluso las herramientas de seguridad más modernas no son una bala de plata si el atacante ha obtenido un punto de apoyo a nivel del kernel.

Para quienes quieran profundizar, recomiendo revisar include/core.h y ver cómo se implementan los hooks. Esta lectura podría ser más cautivadora que cualquier novela policíaca.

Pruébalo (¡en una VM!): GitHub MatheuZSecurity/Singularity

Por cierto, ¿qué piensas — ¿usar eBPF para seguridad es un callejón sin salida si los rootkits han aprendido a evadirlo? ¡Comparte tus pensamientos en los comentarios!

Proyectos relacionados