Singularity - Rootkit furtif pour noyau Linux
"Shall we give forensics a little work?"
Singularity est un puissant rootkit de type module de noyau Linux (LKM) conçu pour les noyaux modernes 6.x. Il offre des capacités de furtivité complètes grâce à un hooking avancé des appels système via l'infrastructure ftrace.
Article de recherche complet (version obsolète) : Singularity: A Final Boss Linux Kernel Rootkit
Étude de cas d'évasion EDR : Bypassing Elastic EDR with Singularity
Vidéo POC : Singularity vs outils de sécurité eBPF : Singularity vs eBPF security tools
Contournement de la sécurité eBPF avec les hooks Singularity : Breaking eBPF
Singularity Rootkit : Évasion de la détection de chargement de module d'Elastic Defend Bypassing Elastic Defend
Qu'est-ce que Singularity ?
Singularity est un rootkit sophistiqué qui opère au niveau du noyau, offrant :
- Dissimulation de processus : Rendre n'importe quel processus complètement invisible au système
- Dissimulation de fichiers et répertoires : Masquer des fichiers grâce à la correspondance de motifs
- Furtivité réseau : Masquer les connexions TCP/UDP, les ports et les entrées conntrack
- Élévation de privilèges : Accès root instantané basé sur les signaux
- Assainissement des journaux : Filtrer les journaux du noyau et les journaux système en temps réel
- Auto-dissimulation : Se retirer des listes de modules et de la surveillance système
- Accès distant : Reverse shell déclenché par ICMP avec dissimulation automatique
- Anti-détection : Évasion des outils de sécurité d'exécution basés sur eBPF (Falco, Tracee), contournement de Linux Kernel Runtime Guard (LKRG) et prévention des tentatives de contournement via io_uring
- Évasion d'audit : Suppression des messages d'audit pour les processus cachés au niveau netlink avec suivi statistique et filtrage des inodes de sockets
- Évasion de la forensique mémoire : Blocage de l'acquisition LiME et AVML ; mise à zéro des pages de modules et des task_structs cachés dans les dumps physiques ; filtrage de /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Filtrage des cgroups : Filtrage des PID cachés dans cgroup.procs
- Évasion de syslog : Hook de do_syslog pour filtrer l'accès au tampon circulaire du noyau via klogctl()
- Évasion de debugfs : Filtrage de la sortie d'outils comme debugfs qui lisent les périphériques bloc bruts
- Filtrage conntrack : Masquer les connexions de /proc/net/nf_conntrack et des requêtes netlink SOCK_DIAG/NETFILTER
- Évasion SELinux : Contournement automatique du mode enforcing de SELinux lors d'un déclenchement ICMP
- Contournement de LKRG : Évasion des mécanismes de détection de Linux Kernel Runtime Guard
- Contournement de la sécurité eBPF : Masquer les processus des outils de sécurité d'exécution basés sur eBPF (Falco, Tracee)
Fonctionnalités
- Élévation de privilèges basée sur les signaux (kill -59)
- Dissimulation complète des processus de /proc et des outils de surveillance
- Dissimulation du système de fichiers basée sur des motifs pour les fichiers et répertoires
- Dissimulation des connexions réseau de netstat, ss, conntrack et des analyseurs de paquets
- Filtrage netlink avancé (SOCK_DIAG, messages NETFILTER/conntrack)
- Filtrage en temps réel des journaux du noyau pour dmesg, journalctl et klogctl
- Auto-dissimulation du module de lsmod et /sys/module
- Normalisation automatique des indicateurs de taint du noyau
- Filtrage des données BPF pour empêcher la détection basée sur eBPF
- Protection io_uring contre le contournement par E/S asynchrones
- Masquage des journaux pour les messages du noyau et les journaux système
- Évasion des détecteurs de rootkits standards (unhide, chkrootkit, rkhunter)
- Suivi et dissimulation automatiques des processus enfants via des hooks tracepoint
- Support multi-architecture (x64 + ia32)
- Filtrage au niveau des paquets réseau avec protection des sockets bruts
- Protection contre toutes les variantes d'E/S de fichiers (read, write, splice, sendfile, tee, copy_file_range)
- Filtrage des messages d'audit au niveau netlink avec suivi statistique pour échapper à la détection d'auditd
- Suivi des inodes de sockets pour une dissimulation réseau complète
- Filtrage des PID de cgroups pour empêcher la détection via
/sys/fs/cgroup/*/cgroup.procs
- Blocage de TaskStats netlink pour empêcher l'énumération des PID
- Résistance à l'acquisition de mémoire physique : kprobe sur
copy_mc_to_kernel intercepte les copies de pages de LiME et redirige les pages de modules et les plages de task_struct cachés vers des tampons mis à zéro ; AVML bloqué via un hook de lecture de /proc/kcore
- Filtrage des lectures de /proc/kcore, /proc/kallsyms, /proc/vmallocinfo
- Hook de do_syslog pour filtrer klogctl() et empêcher les fuites du tampon circulaire du noyau
- Filtrage de la sortie des périphériques bloc pour échapper à debugfs et aux outils de forensique disque similaires
- Filtrage de la sortie de journalctl -k via un hook d'écriture
- Capacité de contournement du mode enforcing de SELinux pour les shells déclenchés par ICMP
- Contournement des vérifications d'intégrité de LKRG pour les processus cachés
- Dissimulation des événements Falco via le ringbuffer BPF et l'interception des événements perf
Installation
Prérequis
- Noyau Linux 6.x
- En-têtes du noyau pour votre noyau en cours d'exécution
- GCC et Make
- Accès root
Installation rapide
cd /dev/shm
git clone https://github.com/MatheuZSecurity/Singularity
cd Singularity
sudo bash setup.sh
cd ..
C'est tout. Le module automatiquement :
- Se cache de lsmod, /proc/modules, /sys/module
- Efface les indicateurs de taint du noyau
- Filtre les chaînes sensibles de dmesg, journalctl -k, klogctl
- Commence à protéger vos fichiers et processus cachés
Notes importantes
Le module se cache automatiquement après le chargement
Il n'y a pas de fonction de déchargement - un redémarrage est nécessaire pour le supprimer
Testez d'abord dans une VM - il ne peut pas être supprimé sans redémarrer
Configuration
Définir l'IP et le port de votre serveur
Modifiez 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
Modifier modules/icmp.c :
#define SRV_PORT "8081" // Change this to your desired port
Modifier modules/bpf_hook.c :
#define HIDDEN_PORT 8081 // Must match SRV_PORT
Modifier modules/hiding_tcp.c :
#define PORT 8081 // Must match SRV_PORT
Important : Toutes les définitions de ports doivent correspondre pour un masquage réseau et une fonctionnalité de reverse shell ICMP corrects.
Utilisation
Masquer les processus
# Hide current shell
kill -59 $$
# Hide specific process
kill -59 <PID>
Le processus sera invisible pour ps, top, htop, /proc et tous les outils de surveillance. Tous les processus enfants sont automatiquement suivis et masqués.
Masquer les fichiers et répertoires
Les fichiers correspondant à vos motifs configurés sont automatiquement masqués :
mkdir singularity
echo "secret" > singularity/data.txt