
Linux-Prozessidentitätsverschleierungswerkzeug, das comm, argv, cmdline, environ, exe-Pfad und VMAs über eine 11-Phasen-prctl-Pipeline spoofed, um einen anderen Prozess zu imitieren.
Identitätsverschleierung für Linux-Prozesse
DARKCLOAK verkettet die Manipulation aller im Userspace sichtbaren Identitätsquellen zu einer sequenziellen 11-Phasen-Pipeline, die einen Prozess schrittweise so transformiert, dass er für Userspace-Überwachungswerkzeuge nicht mehr von dem imitierten Prozess zu unterscheiden ist. Nach unserem besten Wissen kombiniert kein veröffentlichtes Werkzeug die gleichzeitige Manipulation aller im Userspace sichtbaren Identitätsquellen.
Die vollständige technische Ausarbeitung ist im RAZOR-Blog verfügbar.
task_struct->comm: über PR_SET_NAMEargv[0]: über direktes Überschreiben des Stacks/proc/$PID/cmdline): über PR_SET_MM_ARG_START/END/proc/$PID/environ): über PR_SET_MM_ENV_START/END/proc/$PID/exe): über PR_SET_MM_EXE_FILE/proc/$PID/maps): ersetzt durch anonymen SpeicherunshareDie Pipeline läuft in einer strikten Reihenfolge ab, die durch die Abhängigkeiten zwischen den manipulierten Kernel-Subsystemen definiert ist:
_start, um die PHT aufzulösen und die virtuellen Adressbereiche aller drei PT_LOAD-Segmente zu ermittelngetresuid / getresgid, um die ursprünglichen UIDs und GIDs für die spätere Wiederherstellung zu speichernsetresuid(0,0,0), falls eine der drei UIDs 0 istcapget/capsetprctl(PR_SET_NAME) → überschreibt task_struct->comm[rsp+8] → überschreibt argv[0]prctl(PR_SET_DUMPABLE, 0) → blockiert -Zugriff und von unprivilegierten ProzessenPR_SET_MM_EXE_FILE schlägt mit EBUSY fehl, solange noch eine VMA durch die Original-Binary gestützt wird. Da das .text-Segment nicht entladen werden kann, während RIP sich darin befindet, läuft die Anonymisierung von einer temporären anonymen Seite aus:
mmap)mm_start→mm_end) und die Segment-Metadaten hineinkopierenmprotect).textPT_LOAD-Segmente: eine frische anonyme Region mmapen → Segmentinhalte memcpyen → das Original munmapen → die anonyme Kopie mit mremap zurück an die Originaladresse verschieben → mprotect, um die ursprünglichen Berechtigungen wiederherzustellen.text, die Trampolin-Seite entladenDie Binary ist eine statische ELF ohne Interpreter, daher ist das Laufzeit-VMA-Layout vollständig deterministisch: drei PT_LOAD-Segmente, der Stack und der Kernel-vDSO.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
Die Spoofing-Ziele werden zur Kompilierzeit im .data-Abschnitt definiert. Die Standardwerte imitieren 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, ...
Um einen anderen Prozess zu imitieren, aktualisieren Sie diese Werte vor dem Build.
./darkcloak
Erfordert CAP_SYS_RESOURCE, CAP_SETUID, CAP_SETGID und CAP_SETPCAP im Permitted-Set. Wenn CAP_SYS_RESOURCE fehlt, wird der MM-Spoofing-Block (VMA-Anonymisierung + EXE_FILE-Austausch) vollständig übersprungen. Wenn CAP_SETPCAP fehlt, weicht das Werkzeug von PR_SET_SECUREBITS auf PR_SET_KEEPCAPS aus.
./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
Ausschließlich für Bildungs- und Forschungszwecke veröffentlicht. Nur auf Systemen verwenden, die Ihnen gehören oder für die Sie eine ausdrückliche schriftliche Testgenehmigung besitzen.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → leitet /proc/$PID/cmdline umprctl(PR_SET_MM_ENV_START/END) → leitet /proc/$PID/environ umprctl(PR_SET_MM_EXE_FILE) → ersetzt mm_struct->exe_filePR_SET_SECUREBITS (falls CAP_SETPCAP) oder PR_SET_KEEPCAPS (Fallback), um den UID-Drop zu überlebensetresuid(1000,1000,1000) oder Wiederherstellung der Originalesetresgid(1000,1000,1000) oder Wiederherstellung der Originaleunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s), dann exit