
أداة تمويه هوية العمليات على Linux تقوم بتزييف comm وargv وcmdline وenviron ومسار exe وVMAs عبر خط أنابيب prctl من 11 مرحلة لانتحال شخصية عملية أخرى.
إخفاء هوية العمليات على Linux
يقوم DARKCLOAK بتسلسل التلاعب بجميع مصادر الهوية المرئية لمساحة المستخدم في خط أنابيب تسلسلي من 11 مرحلة يحوّل العملية تدريجيًا حتى تصبح غير قابلة للتمييز عن العملية المنتحَلَة بالنسبة لأدوات المراقبة في مساحة المستخدم. على حد علمنا، لا توجد أداة منشورة تجمع بين التلاعب المتزامن بجميع مصادر الهوية المرئية لمساحة المستخدم.
الشرح التقني الكامل متاح على مدونة RAZOR.
task_struct->comm: عبر PR_SET_NAMEargv[0]: عبر الكتابة المباشرة على المكدس/proc/$PID/cmdline): عبر PR_SET_MM_ARG_START/END/proc/$PID/environ): عبر PR_SET_MM_ENV_START/END/proc/$PID/exe): عبر PR_SET_MM_EXE_FILE/proc/$PID/maps): تُستبدل بذاكرة مجهولةunshareيعمل خط الأنابيب بترتيب صارم تحدده التبعيات بين أنظمة النواة الفرعية التي يتم التلاعب بها:
_start لحل PHT والحصول على نطاقات العناوين الافتراضية لجميع مقاطع PT_LOAD الثلاثةgetresuid / getresgid لتخزين UIDs و GIDs الأصلية لاستعادتها لاحقًاsetresuid(0,0,0) إذا كان أي من UIDs الثلاثة يساوي 0capget/capsetprctl(PR_SET_NAME) → يستبدل task_struct->comm[rsp+8] → تستبدل argv[0]prctl(PR_SET_DUMPABLE, 0) → يحجب الوصول إلى و من العمليات غير المتمتعة بامتيازاتيفشل PR_SET_MM_EXE_FILE مع EBUSY طالما أن أي VMA لا يزال مدعومًا بالملف التنفيذي الأصلي. وبما أنه لا يمكن إلغاء تعيين مقطع .text بينما يكون RIP بداخله، فإن إخفاء الهوية يعمل من صفحة مجهولة مؤقتة:
mmap)mm_start→mm_end) وبيانات تعريف المقاطع إليهاmprotect).textPT_LOAD الثلاثة: mmap منطقة مجهولة جديدة → memcpy لمحتويات المقطع → munmap للأصل → mremap للنسخة المجهولة إلى العنوان الأصلي → mprotect لاستعادة الأذونات الأصلية.text المجهول الآن، وإلغاء تعيين صفحة trampolineالملف التنفيذي هو ELF ثابت بدون مفسّر، لذا فإن تخطيط VMA وقت التشغيل حتمي بالكامل: ثلاثة مقاطع PT_LOAD، والمكدس، و vDSO الخاص بالنواة.
nasm -f elf64 darkcloak.asm -o darkcloak.o
ld darkcloak.o -o darkcloak
تُحدَّد أهداف التزوير وقت الترجمة في قسم .data. القيم الافتراضية تنتحل شخصية 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, ...
لانتحال شخصية عملية مختلفة، حدّث هذه القيم قبل البناء.
./darkcloak
يتطلب CAP_SYS_RESOURCE و CAP_SETUID و CAP_SETGID و CAP_SETPCAP في المجموعة المسموح بها. إذا كان CAP_SYS_RESOURCE غائبًا، يتم تخطي كتلة تزوير MM بالكامل (إخفاء هوية VMA + تبديل EXE_FILE). إذا كان CAP_SETPCAP غائبًا، تتراجع الأداة من PR_SET_SECUREBITS إلى 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
نُشر حصريًا لأغراض تعليمية وبحثية. استخدمه فقط على الأنظمة التي تملكها أو لديك تفويض كتابي صريح لاختبارها.
/proc/$PID/memptrace(PTRACE_ATTACH)prctl(PR_SET_MM_ARG_START/END) → يعيد توجيه /proc/$PID/cmdlineprctl(PR_SET_MM_ENV_START/END) → يعيد توجيه /proc/$PID/environprctl(PR_SET_MM_EXE_FILE) → يستبدل mm_struct->exe_filePR_SET_SECUREBITS (إذا توفر CAP_SETPCAP) أو PR_SET_KEEPCAPS (كخيار احتياطي) للنجاة من إسقاط UIDsetresuid(1000,1000,1000) أو استعادة القيم الأصليةsetresgid(1000,1000,1000) أو استعادة القيم الأصليةunshare(CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC)nanosleep(120s) ثم exit