Dans une publication technique, l’auteur dissèque le module sysrq_hook.c du rootkit LKM Singularity (ciblant Linux 6.x) et montre comment il intercepte les routines de diagnostic du noyau — Magic SysRq et le chemin OOM — pour empêcher l’affichage de processus cachés directement dans le buffer de logs kernel.
Le texte rappelle que Magic SysRq (par /proc/sysrq-trigger ou Alt+SysRq+<touche>) exécute des diagnostics entièrement côté noyau et écrit via printk() dans le ring buffer, échappant aux hooks usuels sur /proc ou getdents. Les commandes SysRq-T (état des tâches) et SysRq-F (chemin OOM) produisent des listes de processus directement depuis la mémoire kernel. Des rootkits LKM connus comme Kovid ou diamorphine, qui se contentent d’intercepter filldir*/getdents et parfois des lectures de dmesg, se font contourner: des PIDs « cachés » réapparaissent dans les sorties SysRq-T et OOM, car les données sont déjà imprimées dans le ring buffer avant toute filtration en espace utilisateur.
Singularity s’appuie sur ftrace pour détourner des fonctions noyau ciblées via un tableau de hooks: sched_show_task, dump_header et print_task.isra.0 (ou variantes). Les hooks sont notrace pour éviter l’instrumentation et la récursion. Cette approche permet de rediriger l’exécution vers des stubs de filtrage tout en conservant des pointeurs vers les fonctions originales.
L’architecture de masquage repose sur deux tableaux (hidden_pids et child_pids) et sur un prédicat central is_task_hidden_fast(p) qui: 1) teste le PID/TGID contre les listes, 2) parcourt en lecture RCU la chaîne des real_parent afin de masquer aussi les descendants de tâches cachées, avec garde de boucle. Lorsque rien n’est caché, un « fast path » contourne tout surcoût.
Côté implémentation: le hook de sched_show_task saute l’impression pour toute tâche considérée cachée; le hook de print_task.isra.0 évite les fuites dans les tableaux des tâches RUNNABLE produits par SysRq-T; enfin, le hook de dump_header (chemin OOM) ne se contente pas de filtrer — il remplace entièrement la fonction par une routine dump_tasks_filtered() pour produire un tableau déjà épuré, car dump_header() fait lui-même sa boucle et imprime d’un bloc.
• IOCs:
- Aucun indicateur (hash, IP, domaine) n’est fourni dans l’extrait.
• TTPs:
- Hooking kernel via ftrace (détournement de
sched_show_task,dump_header,print_task.isra.0). - Évasion forensique: filtrage en amont des sorties
printk()du noyau (SysRq-T et OOM) pour empêcher l’exposition de PIDs cachés. - Masquage de processus par PID/TGID et par héritage via
real_parentsous RCU. - Optimisation par fast path quand aucune tâche n’est cachée.
En somme, il s’agit d’une analyse technique visant à démontrer comment Singularity comble les angles morts laissés par d’autres rootkits en censurant directement les chemins de diagnostic du noyau.
🧠 TTPs et IOCs détectés
TTP
Hooking kernel via ftrace (détournement de sched_show_task, dump_header, print_task.isra.0). Évasion forensique: filtrage en amont des sorties printk() du noyau (SysRq-T et OOM) pour empêcher l’exposition de PIDs cachés. Masquage de processus par PID/TGID et par héritage via real_parent sous RCU. Optimisation par fast path quand aucune tâche n’est cachée.
IOC
Aucun indicateur (hash, IP, domaine) n’est fourni dans l’extrait.
🔗 Source originale : https://blog.kyntra.io/Hiding-from-the-Panic-Button-Singularity-SysRq-Hook