
Outil de masquage d'identité de processus Linux qui usurpe comm, argv, cmdline, environ, le chemin exe et les VMA via un pipeline prctl en 11 phases pour usurper l'identité d'un autre processus.
Masquage de l'identité des processus sous Linux
DARKCLOAK enchaîne la manipulation de toutes les sources d'identité visibles depuis l'espace utilisateur dans un pipeline séquentiel en 11 phases qui transforme progressivement un processus jusqu'à ce qu'il devienne indiscernable de celui usurpé pour les outils de surveillance de l'espace utilisateur. À notre connaissance, aucun outil publié ne combine la manipulation simultanée de toutes les sources d'identité visibles depuis l'espace utilisateur.
L'article technique complet est disponible sur le blog RAZOR.
task_struct->comm : via PR_SET_NAMEargv[0] : via écrasement direct de la pile/proc/$PID/cmdline) : via PR_SET_MM_ARG_START/END/proc/$PID/environ) : via PR_SET_MM_ENV_START/END/proc/$PID/exe) : via PR_SET_MM_EXE_FILE/proc/$PID/maps) : remplacées par de la mémoire anonymeunshareLe pipeline s'exécute dans un ordre strict défini par les dépendances entre les sous-systèmes du noyau manipulés :
_start pour résoudre le PHT et obtenir les plages d'adresses virtuelles des trois segments PT_LOADgetresuid / getresgid pour stocker les UID et GID d'origine en vue d'une restauration ultérieuresetresuid(0,0,0) si l'un des trois UID vaut 0capget/capsetprctl(PR_SET_NAME) → écrase task_struct->comm[rsp+8] → écrase argv[0]prctl(PR_SET_DUMPABLE, 0) → bloque l'accès à et depuis des processus non privilégiésPR_SET_MM_EXE_FILE échoue avec EBUSY tant qu'une VMA est encore adossée au binaire d'origine. Comme le segment .text ne peut pas être dé-mappé tant que RIP s'y trouve, l'anonymisation s'exécute depuis une page anonyme temporaire :
mmap)mm_start→mm_end) et les métadonnées des segmentsmprotect).textPT_LOAD : mmap une nouvelle région anonyme → memcpy du contenu du segment → munmap de l'original → mremap de la copie anonyme vers l'adresse d'origine → mprotect pour restaurer les permissions d'origine.text désormais anonyme, dé-mapper la page trampolineLe binaire est un ELF statique sans interpréteur, donc la disposition des VMA à l'exécution est entièrement déterministe : trois segments PT_LOAD, la pile et le vDSO du noyau.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
Les cibles d'usurpation sont définies à la compilation dans la section .data. Les valeurs par défaut usurpent sshd :
mimic_name db 'sshd', 0
mimic_argv db './sshd', 0
mimic_exe db '/usr/sbin/sshd', 0
mimic_cmdline db '/usr/sbin/sshd', 0, '-D', 0, '[email protected]', 0, ...
mimic_environ db 'LANG=en_US.UTF-8', 0, 'NOTIFY_SOCKET=/run/systemd/notify', 0, ...
Pour usurper un autre processus, modifiez ces valeurs avant la compilation.
./darkcloak
Nécessite CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID et CAP_SETPCAP dans l'ensemble permis. Si CAP_SYS_RESOURCE est absent, le bloc de masquage MM (anonymisation des VMA + échange de EXE_FILE) est entièrement ignoré. Si CAP_SETPCAP est absent, l'outil se replie de PR_SET_SECUREBITS vers PR_SET_KEEPCAPS.
./darkcloak &
PID=$!
cat /proc/$PID/comm
readlink /proc/$PID/exe
cat /proc/$PID/cmdline | tr '\0' ' '
cat /proc/$PID/environ | tr '\0' '\n' | head -3
cat /proc/$PID/maps | head -5
cat /proc/$PID/status | grep -E 'Uid|Gid|Cap'
ps aux | grep $PID
Publié exclusivement à des fins éducatives et de recherche. À utiliser uniquement sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → redirige /proc/$PID/cmdlineprctl(PR_SET_MM_ENV_START/END) → redirige /proc/$PID/environprctl(PR_SET_MM_EXE_FILE) → remplace mm_struct->exe_filePR_SET_SECUREBITS (si CAP_SETPCAP) ou PR_SET_KEEPCAPS (repli) pour survivre à la baisse des UIDsetresuid(1000,1000,1000) ou restauration des valeurs d'originesetresgid(1000,1000,1000) ou restauration des valeurs d'origineunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) puis exit