Singularity - Comment fonctionnent les rootkits Linux modernes et pourquoi ils sont si difficiles à détecter
Imaginez ce scénario : vous vous connectez à un serveur, exécutez ps aux, et tout semble parfaitement normal. Vous vérifiez les connexions réseau avec ss — rien de suspect. Vous examinez les logs dmesg — aucune entrée douteuse. Mais à cet instant précis, un processus caché s'exécute au niveau root dans le système, interceptant vos actions et filtrant les données directement dans la mémoire du noyau.
Ça ressemble à quelque chose sorti d'un film de hackers ? En réalité, c'est la réalité des rootkits LKM modernes (Linux Kernel Modules). Aujourd'hui, nous allons examiner le projet Singularity du développeur MatheuZSecurity — un outil avancé pour rechercher les capacités de furtivité dans les noyaux Linux 6.x.
Qu'est-ce que Singularity et pourquoi un chercheur en a-t-il besoin ?
Singularity n'est pas qu'un simple jouet pour changer l'UID utilisateur. C'est un projet de recherche à part entière créé pour tester les limites des systèmes de sécurité modernes. L'auteur s'est posé la question : « Jusqu'où peut aller un rootkit s'il a déjà réussi à s'injecter dans le noyau ? »
Le projet cible les noyaux modernes (branche 6.x) et utilise l'infrastructure ftrace pour l'interception des appels système. Cela le rend extrêmement intéressant pour les programmeurs système et les spécialistes de la sécurité de l'information (DFIR), car il démontre le contournement de géants de la sécurité comme eBPF (Falco, Tracee) et LKRG (Linux Kernel Runtime Guard).
Fonctionnalités principales : L'art de rester invisible
Singularity est un véritable couteau suisse pour les opérations clandestines. Passons en revue les capacités les plus impressionnantes.
1. Camouflage au niveau fantôme
Le rootkit ne se contente pas de masquer des fichiers ou des processus — il le fait de manière systématique :
- Processus : N'importe quel PID peut être rendu invisible pour
ps,top, et même/proc. De plus, Singularity suit et masque automatiquement tous les processus enfants. - Fichiers : Le masquage fonctionne par motifs. Si vous avez créé un répertoire avec un nom « secret », il disparaîtra de la sortie de
lsetfind, bien que vous puissiez toujours accéder aux fichiers à l'intérieur si vous connaissez le chemin. - Réseau : Les connexions sur des ports spécifiques (par exemple, votre reverse shell) ne seront visibles ni par
netstatni partcpdump.
2. Contournement d'eBPF et EDR modernes
C'est probablement la partie la plus techniquement complexe. La plupart des systèmes de surveillance modernes (comme Falco) s'appuient sur eBPF pour le suivi des événements en temps réel. Singularity ne bloque pas eBPF (ce serait trop visible), mais filtre soigneusement les données que les programmes eBPF transmettent à l'espace utilisateur. Il substitue les résultats dans les buffers, rendant les ressources cachées invisibles aux « yeux » de la surveillance.
3. Manipulation des privilèges via les signaux
Oubliez les exploits complexes. Singularity implémente un mécanisme élégant :
kill -59 $$
Envoyer un signal spécifique (dans ce cas, le 59) au processus courant elevated instantanément ses privilèges au niveau root. Simple, efficace, et très dangereux entre de mauvaises mains.
4. Lutte contre la criminalistique (Évitement forensique)
Le projet peut même tromper les outils d'analyse de disque de bas niveau, comme debugfs. Il intercepte les appels système de lecture/écriture et « à la volée » supprime les mentions de lui-même des buffers de sortie, les remplaçant par des espaces. Cela permet de maintenir l'intégrité du système de fichiers (les sommes de contrôle ne sont pas cassées), tout en masquant la présence de code malveillant.
Comment ça fonctionne en interne ?
L'architecture de Singularity est construite sur un système modulaire. Dans le dépôt, vous trouverez des fichiers séparés pour chaque tâche : hiding_tcp.c pour le réseau, bpf_hook.c pour les contre-mesures eBPF, lkrg_bypass.c pour le contournement de la protection du noyau.
L'implémentation du logging est intéressante. Le rootkit hook la fonction do_syslog, lui permettant de filtrer le ring buffer du noyau. Si le système essaie de sortir un message sur la corruption du noyau due au chargement d'un module tiers, Singularity supprime simplement cette chaîne.
Valeur pratique pour les développeurs
Pourquoi un développeur devrait-il étudier le code d'un rootkit ?
- Comprendre les rouages de Linux : Le code du projet est un excellent manuel sur le travail avec les appels système, les structures
task_struct, la pile réseau et le sous-systèmeftrace. - Concevoir des systèmes de sécurité : Pour construire une forteresse solide, il faut savoir comment fonctionnent les armes de siège. En étudiant les méthodes de contournement d'eBPF dans Singularity, vous pouvez mieux configurer vos règles dans Falco ou Tracee.
- Développement noyau : C'est un exemple concret de comment écrire des LKM (Linux Kernel Modules) pour les versions modernes du noyau, en tenant compte des changements d'API.
Précautions de sécurité
Important : Singularity est un outil puissant qui se masque après le chargement (lsmod ne le montrera pas). Il n'a pas de fonction de déchargement, car cela créerait un vecteur de détection supplémentaire. Pour s'en débarasser, un redémarrage sera nécessaire.
L'auteur recommande fortement de tester le projet uniquement dans des machines virtuelles. Et, bien sûr, de l'utiliser exclusivement à des fins éducatives et de recherche.
Singularity est un exemple impressionnant de la sophistication atteinte par les méthodes de furtivité Linux. Le projet montre que même les outils de sécurité les plus modernes ne sont pas une solution miracle si l'attaquant a obtenu un point d'ancrage au niveau du noyau.
Pour ceux qui veulent approfondir, je recommande de consulter include/core.h et de voir comment les hooks sont implémentés. Cette lecture pourrait être plus captivante que n'importe quel roman policier.
Essayez-le (dans une VM !): GitHub MatheuZSecurity/Singularity
Au fait, qu'en pensez-vous — l'utilisation d'eBPF pour la sécurité est-elle une impasse si les rootkits ont appris à le contourner ? Partagez vos réflexions dans les commentaires !
Projets similaires