Singularity - Como Funcionam os Rootkits Modernos para Linux e Por Que São Tão Difíceis de Detectar
Imagine este cenário: você faz login em um servidor, executa ps aux e tudo parece perfeitamente normal. Você verifica as conexões de rede com ss — limpo. Você revisa os logs dmesg — sem entradas suspeitas. Mas naquele exato momento, um processo oculto em nível root está sendo executado no sistema, interceptando suas ações e filtrando dados diretamente na memória do kernel.
Parece algo de filmes de hacker? Na realidade, esta é a realidade dos rootkits LKM modernos (Linux Kernel Modules). Hoje vamos examinar o projeto Singularity do desenvolvedor MatheuZSecurity — uma ferramenta avançada para pesquisar capacidades de stealth em kernels Linux 6.x.
O que é o Singularity e por que um pesquisador precisa dele?
Singularity não é apenas outro brinquedo para mudar UID de usuário. É um projeto de pesquisa completo criado para testar os limites dos sistemas de segurança modernos. O autor fez a pergunta: "Até onde um rootkit pode chegar se já conseguiu injetar no kernel?"
O projeto visa kernels modernos (branch 6.x) e usa infraestrutura ftrace para interceptação de chamadas de sistema. Isso o torna extremamente interessante para programadores de sistemas e especialistas em segurança da informação (DFIR), pois demonstra como contornar gigantes da segurança como eBPF (Falco, Tracee) e LKRG (Linux Kernel Runtime Guard).
Principais Recursos: A Arte de Permanecer Invisível
Singularity é uma verdadeira faca suíça para operações sigilosas. Vamos percorrer as capacidades mais impressionantes.
1. Camuflagem em Nível Fantasma
O rootkit não apenas oculta arquivos ou processos — ele faz isso sistematicamente:
- Processos: Qualquer PID pode ser tornado invisível para
ps,tope até/proc. Além disso, o Singularity rastreia e oculta automaticamente todos os processos filhos. - Arquivos: A ocultação funciona por padrões. Se você criou um diretório com um nome "secreto", ele desaparecerá da saída de
lsefind, embora você ainda possa acessar arquivos dentro se souber o caminho. - Rede: Conexões em portas específicas (por exemplo, seu reverse shell) não serão vistas nem por
netstatnem portcpdump.
2. Contornando eBPF e EDRs Modernos
Esta é provavelmente a parte mais tecnicamente complexa. A maioria dos sistemas modernos de monitoramento (como Falco) depende de eBPF para rastreamento de eventos em tempo real. O Singularity não bloqueia o eBPF (isso seria muito perceptível), mas filtra cuidadosamente os dados que os programas eBPF transmitem para o espaço do usuário. Ele substitui resultados em buffers, tornando recursos ocultos invisíveis para os "olhos" do monitoramento.
3. Manipulação de Privilégios via Sinais
Esqueça exploits complexos. O Singularity implementa um mecanismo elegante:
kill -59 $$
Enviar um sinal específico (neste caso, 59) para o processo atual eleva instantaneamente seus privilégios para root. Simples, eficaz e muito perigoso nas mãos erradas.
4. Lutando Contra a Forense (Evasion de Forense)
O projeto pode até enganar ferramentas de análise de disco de baixo nível, como debugfs. Ele intercepta chamadas de sistema de leitura/escrita e "em tempo real" remove menções de si mesmo dos buffers de saída, substituindo-os por espaços. Isso permite manter a integridade do sistema de arquivos (checksums não quebram), enquanto oculta a presença de código malicioso.
Como Funciona Internamente?
A arquitetura do Singularity é construída em um sistema modular. No repositório, você encontrará arquivos separados para cada tarefa: hiding_tcp.c para rede, bpf_hook.c para contramedidas eBPF, lkrg_bypass.c para bypass de proteção do kernel.
A implementação de logging é interessante. O rootkit faz hook da função do_syslog, permitindo filtrar o ring buffer do kernel. Se o sistema tentar produzir uma mensagem sobre contaminação do kernel pelo carregamento de um módulo de terceiros, o Singularity simplesmente remove essa string.
Valor Prático para Desenvolvedores
Por que um desenvolvedor deveria estudar código de rootkit?
- Entendendo o Funcionamento Interno do Linux: O código do projeto é um excelente livro-texto sobre trabalho com chamadas de sistema, estruturas
task_struct, a pilha de rede e o subsistemaftrace. - Projetando Sistemas de Segurança: Para construir uma fortaleza forte, você precisa saber como funcionam as armas de cerco. Estudando métodos de bypass de eBPF no Singularity, você pode configurar melhor suas regras no Falco ou Tracee.
- Desenvolvimento de Kernel: Este é um exemplo prático de como escrever LKM (Linux Kernel Modules) para versões modernas do kernel, considerando mudanças de API.
Precauções de Segurança
Importante: Singularity é uma ferramenta poderosa que se oculta após o carregamento (lsmod não mostrará). Ele não tem função de descarregamento, pois isso criaria um vetor adicional de detecção. Para se livrar dele, será necessário reinicializar.
O autor recomenda fortemente testar o projeto apenas em máquinas virtuais. E, claro, usá-lo exclusivamente para fins educacionais e de pesquisa.
Singularity é um exemplo impressionante de quão sofisticados se tornaram os métodos de stealth do Linux. O projeto mostra que mesmo as ferramentas de segurança mais modernas não são uma bala de prata se o atacante conquistou uma posição no nível do kernel.
Para quem quer se aprofundar, recomendo verificar include/core.h e ver como os hooks são implementados. Esta leitura pode ser mais fascinante do que qualquer romance policial.
Experimente (em uma VM!): GitHub MatheuZSecurity/Singularity
A propósito, o que você acha — usar eBPF para segurança é um beco sem saída se os rootkits aprenderam a contorná-lo? Compartilhe suas opiniões nos comentários!
Projetos relacionados