malware · cryptomining · rootkit · linux · kernel · monero · privilege-escalation · cve-2026-31431 · container-escape
Rootpacket: یک کیت ماینینگ بدافزاری لینوکس که در هسته پنهان میشود
Kinryū Labs کیت Rootpacket را تحلیل کرد، یک کیت ماینینگ بدافزاری برای لینوکس که یک روتکیت در سطح هسته را برای جعل مصرف CPU و حافظه حمل میکند، از طریق CVE-2026-31431 (نقصی در حافظهٔ نهان صفحهٔ AF_ALG که از کانتینرها به میزبان هم میگریزد) به root ارتقا مییابد، خود را بهجای یک درایور Intel جا میزند، و همان سرویسهای افشاشدهای را که ماینرهای رقیب از آنها وارد میشوند غیرفعال میکند.
نوشتهٔ Davis Zheng·
TLP:CLEAR. برای انتشار عمومی تأیید شد. این تنها تحلیل ایستاست: هیچ نمونهای اجرا نشد، و هر یافته از استخراج رشتهها، واسازی (disassembly)، و بازبینی کد منبع میآید. کیفپول مونرو، استخر، و زیرساخت مهاجم بهعنوان نشانگرهای دفاعی منتشر میشوند.
خلاصهٔ مدیریتی
- ~45%آنچه top از CPU نشان میدهد در حالی که نزدیک 100% کار میکند
- 3سازوکار پایداری
- 7.8CVSS، CVE-2026-31431 (ارتقای امتیاز محلی از طریق page-cache در AF_ALG)
- میزبانroot از یک کانتینر بیامتیاز
Rootpacket یک کیت ماینینگ بدافزاریِ چندمؤلفهای برای لینوکس است. یک روتکیت در سطح هسته برای پنهانکاری، یک اکسپلویت ارتقای امتیاز برای CVE-2026-31431 در رابط رمزنگاری AF_ALG لینوکس، یک ماینر مونرو XMRig 6.26.0 بستهبندیشده با UPX و تغییرنامیافته به xrandom، و یک اسکریپت حذف رقیب را گرد هم میآورد. کد بیشتر به ترکی نوشته شده (نام متغیرها، توضیحات، رشتههای وضعیت)، که به یک گردانندهٔ ترکیزبان اشاره دارد.
کیت در یکی از دو حالت کار میکند. در حالت root یک روتکیت از نوع ماژول هستهٔ قابلبارگذاری (LKM) را که به intel_uncore_freq_aux جا زده شده بارگذاری میکند، آن را از طریق DKMS نصب میکند تا از ارتقاهای هسته جان به در ببرد، یک سرویس systemd ثبت میکند، و ماشین را از رقبا پاک میکند. هنگامی که نمیتواند root بگیرد، به یک حالت فضای کاربر بازمیگردد که از طریق crontab پایدار میماند و ماینر را بهعنوان یک دیمن اجرا میکند. ماینر از طریق stratum+ssl به pool.supportxmr.com:443 متصل میشود و مونرو را با RandomX ماین میکند.
مؤلفهای که ارزش درنگ دارد روتکیت است. در حالی که ماینر پردازنده را نزدیک صد درصد میخکوب میکند، روتکیت /proc/stat را بازنویسی میکند تا top و htop یک 40 تا 50 درصدِ آرام گزارش دهند، و آن عدد را با jiffies نوسان میدهد تا بار واقعی به نظر برسد نه گیرکرده روی یک مقدار ثابت. همین کار را با /proc/meminfo میکند، و فهرستهای دایرکتوری را فیلتر میکند تا فرایندها و فایلهای خودش را پنهان کند.
داوریهای کلیدی
- هدف ماینینگ بدافزاری است (اطمینان بالا). کیت XMRig 6.26.0، یک کیفپول مونروی کدگذاریشدهٔ ثابت، و یک پیکربندی ماینینگ
pool.supportxmr.comرا حمل میکند، با کمک به توسعهدهندهٔ XMRig که خاموش شده تا همهٔ عواید به گرداننده برسد. - ارتقای امتیاز CVE-2026-31431 (“Copy Fail”) است، یک نوشتنِ قطعی در حافظهٔ نهان صفحه روی مسیر
algif_aeadدر AF_ALG لینوکس (CVSS 7.8، افشاشده در آوریل 2026). چون حافظهٔ نهان صفحه در سراسر میزبان مشترک است، همان نوشتن از یک کانتینر میگریزد تا روی میزبان root بگیرد، پس یک کانتینر آلوده یک میزبان بهخطرافتاده است (اطمینان بالا). - گرداننده بسیار بالاتر از گروه معمولِ «بینداز-و-ماین-کن» است (اطمینان بالا). یک روتکیت LKM سفارشی با قلابهای ftrace، پایداری DKMS که برای هستههای جدید خود را بهطور خودکار بازمیسازد، یک اکسپلویت کارای حافظهٔ نهان صفحه برای CVE-2026-31431، و پایداری لایهایِ systemd/DKMS/cron، سطحی از مهندسیاند که بیشتر ماینرهای بدافزاری هرگز به آن نمیرسند.
- گرداننده بهاحتمال زیاد ترکیزبان است (اطمینان متوسط). نام متغیرها، توضیحات، و پیامهای وضعیتِ ترکی مانند
ROOT ele gecirildi!در سراسر کیت جریان دارند. - Rootpacket ساخته شده تا یک میزبان را بهطور انحصاری در اختیار بگیرد و نگه دارد.
killservice.shآن ماینرهای رقیب را برمیدارد و سپس سرویسهای افشاشده به بیرون را که ماینرهای بدافزاری برای دسترسی اولیه به کار میبرند غیرفعال میکند، از جمله Docker API روی 2375/2376، همان برداری که در نوشتهٔ RedTail مستند کردیم. این گروهها بر سرِ همان ماشینهای بدپیکربندی میجنگند.
معماری کیت
Rootpacket یک دراپر ماژولار است. اجزا:
setup.sh Entry point. Checks privilege level, picks a deployment mode.
getroot Privilege escalation. Exploits CVE-2026-31431 (AF_ALG) for local root.
xrandom UPX-packed XMRig 6.26.0, renamed to dodge name-based detection.
kernel/
stealth.c LKM rootkit, compiled via DKMS, disguised as an Intel driver.
install.sh DKMS persistence engine.
killservice.sh Competitor elimination and "hardening".
rootpacket.tar.gz An inner copy of the whole toolkit, packaged for redistribution.
حالت root. setup.sh اگر از پیش root نباشد getroot را اجرا میکند، xrandom را به /opt/kernel-kd/ کپی میکند، یک سرویس systemd میسازد، kernel/install.sh را اجرا میکند تا روتکیت را از طریق DKMS کامپایل و بارگذاری کند، killservice.sh را اجرا میکند تا رقابت را پاک کند، و ماینر را بهعنوان یک سرویس دائمی آغاز میکند.
بازگشت به فضای کاربر. وقتی root از دسترس بیرون است، setup.sh xrandom را به ~/.xrandom/ کپی میکند، یک راهانداز با قفل PID مینویسد، یک ورودی crontab نصب میکند که هنگام راهاندازی مجدد و هر دقیقه شلیک میشود، و ماینر را با setsid آغاز میکند تا از پوستهٔ والد جان به در ببرد.
| ویژگی | حالت root | حالت فضای کاربر |
|---|---|---|
| محل ماینر | /opt/kernel-kd/xrandom | ~/.xrandom/xrandom |
| پایداری | systemd (kernel-kd.service) | crontab (@reboot + */1 * * * *) |
| روتکیت | بله (LKM از طریق DKMS) | خیر |
| کشتن رقبا | بله (killservice.sh) | خیر |
| اجرا بهعنوان | root (systemd) | کاربر کنونی (دیمن setsid) |
getroot: CVE-2026-31431، root از طریق خرابی حافظهٔ نهان صفحه
getroot یک باینری ELF64 x86-64 پیوندخوردهٔ ایستا و stripنشده است، ساختهشده از getroot.c. از CVE-2026-31431 (“Copy Fail”) بهره میبرد، یک نقص منطقی در رابط algif_aead در AF_ALG هستهٔ لینوکس که در 29 آوریل 2026 افشا شد (CVSS 7.8). این باگ یک نوشتنِ قطعیِ 4 بایتیِ تحتکنترل مهاجم را به حافظهٔ نهان صفحهٔ هسته میدهد، و getroot از آن برای وصله کردن یک باینری SUID در حافظه و بیرون رفتن بهعنوان root استفاده میکند.
| ویژگی | مقدار |
|---|---|
| نوع | ELF 64-bit LSB executable، x86-64، پیوندخوردهٔ ایستا، stripنشده |
| CVE | CVE-2026-31431 “Copy Fail” (CVSS 7.8، AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) |
| زیرسامانه | AF_ALG algif_aead، الگوی AEAD authencesn(hmac(sha256),cbc(aes)) |
| متأثر | Linux 4.14 تا 6.19.11 (نقص در 2017، کامیت 72548b093ee3 وارد شد)؛ در 6.18.22، 6.19.12، 7.0+ رفع شد |
| هدف | /usr/bin/su — بخش .text آن در حافظه درون حافظهٔ نهان صفحه وصله میشود |
| اطمینانپذیری | قطعی، بدون وضعیت رقابتی |
| کاربرد / بازگشت | ./getroot <cmd> [args...]؛ اگر اکسپلویت فرود نیاید، فرمان را در هر صورت با امتیازهای کنونی اجرا میکند |
سازوکار. یک بهینهسازیِ درجا در کد AEAD در سال 2017، صفحههای حافظهٔ نهان صفحهٔ spliceشده را هم در فهرست پراکندگیِ (scatterlist) مبدأ و هم مقصد باقی گذاشت. وقتی الگوی authencesn مقدار موقت ESN 4 بایتیاش را در آفست برگزیدهٔ مهاجم assoclen + cryptlen مینویسد، آن نوشتن درون صفحهٔ حافظهٔ نهان صفحهٔ یک فایل خواندنی توسط کاربر فرود میآید. آنگاه بررسی HMAC شکست میخورد و recvmsg() مقدار EBADMSG بازمیگرداند، اما هسته نوشتن را هرگز بازنمیگرداند. getroot سرآیندهای ELF فایل /usr/bin/su را تجزیه میکند تا آفست فایلِ نقطهٔ ورود آن را محاسبه کند، سپس splice ← sendmsg (که 4 بایت برای نوشتن را در AAD حمل میکند) ← recvmsg را، یکبار برای هر تکهٔ 4 بایتیِ شلکد، در حلقه اجرا میکند، و /usr/bin/su را درون حافظهٔ نهان صفحه وصله میکند. سپس /usr/bin/su را execve میکند: هسته صفحهٔ اکنونخرابشده را بارگذاری میکند، شلکد بهعنوان SUID-root اجرا میشود، و getroot پیش از اجرای فرمان گرداننده getuid() == 0 را تأیید میکند (و رشتهٔ ترکیِ [+] ROOT ele gecirildi! را چاپ میکند). فایل روی دیسک هرگز لمس نمیشود، پس پایش یکپارچگی فایل چیزی نمیبیند.
گریز از کانتینر به میزبان. حافظهٔ نهان صفحهٔ لینوکس سراسری-برای-میزبان است؛ کانتینرها نسخهٔ خودشان را ندارند. فرایندی درون یک کانتینر بیامتیاز که /usr/bin/su میزبان را splice میکند نسخهٔ نهانشدهٔ میزبان را خراب میکند، پس execve روی میزبان root میدهد، نه فقط در کانتینر. بنابراین یک کانتینر آلوده یک میزبان بهخطرافتاده است، و setup.sh ادامه میدهد تا روتکیت هسته را در میزبان بارگذاری کند. متوقف کردن و حذف کانتینر کافی نیست؛ میزبان باید از نو ساخته شود.
getroot را یکبار در یک ماشین مجازی جدا (Kali، هستهٔ 6.6.15) اجرا کردیم. توالی کامل AF_ALG را اجرا کرد اما روی آن ساخت root نگرفت و به اجرای فرمان بیامتیاز بازگشت، که با اکسپلویتی که چیدمانهای هستهٔ خاص را هدف میگیرد همخوان است. ماینر را اجرا نکردیم.
xrandom: ماینر
xrandom یک نسخهٔ تغییرنامیافته و بستهبندیشده با UPX از XMRig 6.26.0، ماینر مونروی متنباز، است.
| ویژگی | مقدار |
|---|---|
| هویت واقعی | XMRig 6.26.0 |
| بستهبندی | UPX 4.2.4 (2.8 مگابایت بسته، 10.1 مگابایت بازگشاییشده) |
| الگوریتم | RandomX (rx/0) |
| استخر | pool.supportxmr.com:443 از طریق stratum+ssl |
| کیفپول | 46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ |
| سطح کمک | 0 (کمک به توسعهدهندهٔ XMRig غیرفعال) |
ماینینگ از طریق پورت 443 با TLS اجازه میدهد ترافیک در نگاه نخست با HTTPS معمولی درآمیزد، هرچند دستدهیِ stratum برای کسی که از نزدیک مینگرد اثرانگشت TLS متفاوتی دارد.
stealth.c: روتکیت هسته
این پروردهترین بخش کیت است. یک روتکیت LKM است که از قلابگذاری توابع ftrace برای رهگیری توابع هسته و پاک کردن ردِ بدافزار استفاده میکند، و سراسر خود را بهجای یک درایور سختافزار Intel جا میزند.
| ویژگی | مقدار |
|---|---|
| نام ماژول | intel_uncore_freq_aux |
| فرادادههای جعلی | MODULE_AUTHOR("Intel Corporation")، MODULE_DESCRIPTION("Intel Uncore Frequency Control Driver")، MODULE_VERSION("1.2.0") |
| قلابگذاری | ftrace از طریق kallsyms_lookup_name (در هستههای 5.7 و جدیدتر از طریق یک kprobe حل میشود) |
| کنترل | sysfs در /sys/kernel/intel_uncore_freq/ (enabled، cpu_lo، cpu_hi، mem_lo، mem_hi، hide_tag) |
چه چیزی را قلاب میکند و چرا:
- نقابگذاری CPU.
show_statرا قلاب میکند تا/proc/statرا بازنویسی کند، و بهرهوری را میان مرزهای قابلتنظیم (پیشفرض 40 تا 50 درصد) جعل میکند و با jiffies نوسان میدهد تا عدد مانند یک بار واقعی حرکت کند نه آنکه ثابت بنشیند. - نقابگذاری حافظه.
meminfo_proc_showرا قلاب میکند تا/proc/meminfoرا بازنویسی کند، وMemFree،MemAvailable،Buffers،Cached،Active، وInactiveرا جعل میکند. - پنهانسازی فرایند.
iterate_dirرا قلاب میکند تا فهرستهای/procرا فیلتر کند، و PIDهایی را که نامشان با یک مجموعهٔ کدگذاریشدهٔ ثابت تطبیق میکند پنهان میکند:stealth،masscan،sshruns،ransomx،cpumask،xrandom،cpm_،kcpm،mask_helper،ftrhook،kintel_aux. یک گرداننده میتواند نامهایی را در زمان اجرا از طریق/sys/kernel/intel_uncore_freq/hide_tagبیفزاید. - پنهانسازی فایل. مسیرهای تطبیقیافته با
stealth،cpumask،kintel_aux،intel_uncore_freq_aux، و خودِ دایرکتوری sysfs را پنهان میکند. - خودپنهانسازی. هنگام بارگذاری خود را با
list_del_initاز/proc/modulesو/sys/module/برمیدارد، شیء kobject خود در sysfs را حذف میکند، و شمارندهٔ ارجاع خود را باtry_module_getافزایش میدهد تاrmmodنتواند آن را تخلیه کند.
آن فهرست پنهانسازی نیز یک سرنخ است: در کنار ماینر، masscan، sshruns، و ransomx را پنهان میکند، پس گرداننده بهاحتمال زیاد یک اسکنر اجرا میکند و ممکن است در کیت بیش از یک ماینر داشته باشد.
اثر عملی این است که مدیری که top را تماشا میکند یک ماشین شلوغ-اما-عادی میبیند، هیچ فرایند سرکشی نمییابد، و نمیتواند ماژول هستهای را که دروغ میگوید ببیند. سرنخها فیزیکی و خارج-از-باندند: ماشین داغ میشود، فنها تند میچرخند، و مصرف برق بالا میرود، و روتکیت هیچکدام را نمیتواند جعل کند.
پایداری: سه سازوکار، تقسیمشده بر اساس حالت
پایداری Rootpacket به حالتی که در آن فرود میآید بستگی دارد. در حالت root دو سازوکار را که یکدیگر را تقویت میکنند روی هم میچیند؛ در حالت فضای کاربر به یک سومی بازمیگردد.
| # | سازوکار | حالت | جزئیات |
|---|---|---|---|
| 1 | سرویس systemd | root | kernel-kd.service، Type=simple، Restart=always، RestartSec=3 |
| 2 | ماژول DKMS | root | روتکیت را زیر /lib/modules/$(uname -r)/extra/ نصب میکند؛ از ارتقاهای هسته جان به در میبرد |
| 3 | crontab | user | @reboot بهعلاوهٔ هر دقیقه (* * * * *)، با یک قفل PID و setsid |
ورودی DKMS سرسخت است: روتکیت را از طریق سامانهٔ ساخت ماژولِ خودِ هسته نصب میکند، پس یک ارتقای معمول هسته بهجای حذفش، آن را از نو میسازد و دوباره مسلح میکند.
killservice.sh: پاک کردن ماشین و بستن آن
اسکریپت در بنر خود را “cryptojacker hardening” (“سختسازی ماینر بدافزاری”) مینامد، و آن توصیف از دید گرداننده دقیق است. در سه فاز اجرا میشود.
فاز 1: خاموش کردن سرویسهای افشاشده. سرویسهایی را هدف میگیرد که روی 0.0.0.0 گوش میدهند و نقاط ورود رایج ماینینگ بدافزاریاند، و هر یک را متوقف، غیرفعال و ماسک میکند، روی باینریها chmod 000 میگذارد، و قواعد DROP در iptables میافزاید:
| سرویس | پورت |
|---|---|
| Redis | 6379 |
| Docker | 2375/2376 |
| PostgreSQL | 5432 |
| MongoDB | 27017 |
| Elasticsearch | 9200/9300 |
| Memcached | 11211 |
| Hadoop YARN | 8088 |
| Jenkins | 8080 |
| Confluence | 8090 |
خط Docker بافت پیونددهنده به گزارش RedTail ماست: Rootpacket دقیقاً همان درِ 2375/2376 را که RedTail از آن میگذرد میبندد. گردانندهای که نخست فرود میآید روی میزبان ماین میکند و سپس گروه بعدی را بیرون قفل میکند، و ماشین را در برابر فنونی که آنها به کار میبردند سختسازی میکند.
فاز 2: حذف ماینرهای رقیب. فرایندها را میکشد، فایلها را حذف میکند، کارهای cron را پاک میکند، و کلیدهای SSH گرهخورده به خانوادههای شناختهشدهٔ ماینینگ بدافزاری را پاکسازی میکند، از جمله XMRig، Kinsing (kdevtmpfsi)، TeamTNT (tntrecht، mdrfckr)، sustes، watchdogs، و minerd، در کنار اسکنرهایی مانند masscan، pnscan، و zgrab.
فاز 3: حذف روتکیتهای فضای کاربر. ورودیهای مخرب شناختهشدهٔ LD_PRELOAD (libprocesshider.so، libjdk.so، libpamx.so، یک libselinux.so.3 جعلی، و xhide) را از /etc/ld.so.preload بیرون میکشد و کتابخانهها را حذف میکند، و روتکیتهای فضای کاربر رقبا را که ممکن است با مال خودش تداخل کنند پاک میکند.
انتساب
نام متغیرها، توضیحات، و رشتههای وضعیتِ ترکیِ کیت (برای نمونه ROOT ele gecirildi!، «root به دست آمد») با اطمینان متوسط به یک گردانندهٔ ترکیزبان اشاره دارند. یک URL توزیع یا صحنهچینی در linuxutil5.pages[.]dev یافتیم، میزبانیشده روی Cloudflare Pages، که با الگوی صحنهچینی محمولهها روی زیرساختی رایگان و خوشنام برای درآمیختن همخوان است. rootpacket.tar.gz درونی، یک نسخهٔ خودبسندهٔ کل کیت، به گرداننده یک بستهٔ آماده برای هل دادن به میزبان بعدی میدهد.
نشانگرهای نفوذ
شبکه
| نشانگر | زمینه |
|---|---|
pool.supportxmr.com / pool.supportxmr.com:443 | استخر اصلی ماینینگ مونرو، stratum+ssl |
linuxutil5.pages[.]dev | توزیع / صحنهچینی (Cloudflare Pages) |
api.xmrig.com، randomx.xmrig.com:443 | نقاط پایانی API و محک XMRig |
donate.v2.xmrig.com، donate.ssl.xmrig.com | استخرهای کمک به توسعهدهندهٔ XMRig (موجود، کمک غیرفعال) |
stratum+ssl:// به پورت 443 | ترافیک ماینینگِ خروجی روی TLS |
کیفپول مونرو: 46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ
فایلها (SHA-256)
| فایل | SHA-256 | MD5 |
|---|---|---|
rootpacket.tar.gz (بیرونی) | e2d0dab6b29df89d123fe8581047a03ac9b89ae8fa0d1f334b5aefbb93152857 | |
getroot | dda96d8a4bcc39dc7679347a4386bf1024152d2ccc46d333725ad0cda855d952 | |
xrandom (بستهبندیشده) | ec3ef3dce99fa6cbc480f0f0b0c292676afed68704c44396271c7dc6afea2937 |
Build ID: getroot 148d8d902efd93ed892a541972fbcea3a99d05a3، xrandom d7a91225bdd2e3ab67cabded9d7809bcc724401f.
آثار روی میزبان
| مسیر | زمینه |
|---|---|
/opt/kernel-kd/xrandom | باینری ماینر (حالت root) |
~/.xrandom/xrandom، ~/.xrandom/run.sh | ماینر و راهانداز (حالت فضای کاربر) |
/tmp/.xrandom.lock | قفل PID (حالت فضای کاربر) |
/etc/systemd/system/kernel-kd.service | واحد systemd مخرب |
/usr/src/intel_uncore_freq_aux-1.2.0/ | منبع DKMS روتکیت |
/sys/kernel/intel_uncore_freq/ | رابط کنترل روتکیت در sysfs |
/lib/modules/*/extra/intel_uncore_freq_aux.ko | ماژول روتکیت کامپایلشده |
رفتاری
- فرایندی به نام
xrandomکه بهعنوان root یا کاربر کنونی اجرا میشود. - اعداد CPU در
/proc/statکه با شمارندههای کارایی سختافزار (perf stat)، یا با سرعت فن و مصرف برق، نمیخوانند. - یک سرویس systemd به نام
kernel-kd(فعال،Type=simple،Restart=always). - یک ورودی cron با برچسب
# xrandom-userland-autostart. - یک ماژول هسته
intel_uncore_freq_auxکه هنگام بوت بارگذاری میشود اما ازlsmodغایب است.
شناسایی
اگر روتکیت بارگذاری نشده باشد
systemctl status kernel-kd.service
ls -la /opt/kernel-kd/ ~/.xrandom/
dkms status | grep intel_uncore_freq
crontab -l | grep xrandom
lsmod | grep intel_uncore
اگر روتکیت بارگذاری شده باشد
نماهای فضای کاربر بهخطر افتادهاند، پس شناسایی باید از زیرِ روتکیت یا از کنار آن بیاید:
- CPU را از
/proc/statبا شمارندههای سختافزار از طریقperf statمقایسه کنید. یک شکاف بزرگ سرنخ است. - مراقب قلابهای ftrace روی
show_stat،meminfo_proc_show، وiterate_dirباشید. - ناهمخوانی میان CPU گزارششده و برق، گرما، یا سرعت فنِ واقعی را یک نشانهٔ قوی بدانید.
به دام انداختن ارتقای امتیاز
- یک سوکت
AF_ALG،SOCK_SEQPACKETکه توسط فرایندی باز شود که ابزار رمزنگاری شناختهشدهای نیست (cryptsetup،openssl،gpg،systemd-cryptsetup) سرنخ اصلی است. ترتیب کامل این است:socket(AF_ALG)←bind←setsockopt(SOL_ALG)←accept←pipe←splice←sendmsg←splice←recvmsg(تکراری)، سپسexecve(/usr/bin/su). - بایتهای روی دیسکِ هر باینری SUID را با نمای آن در حافظهٔ نهان صفحه مقایسه کنید.
sha256sumاز طریق حافظهٔ نهان میخواند و نسخهٔ خراب را نشان میدهد، پس دیسک را مستقیم باdd if=<file> iflag=directبخوانید و درهمِ آن را بگیرید، سپس تفاوت بگیرید. یک ناهمخوانی در یک باینری SUID خرابیِ حافظهٔ نهان صفحه است.
قاعدهٔ YARA نامزد
rule Rootpacket_Cryptojacker
{
meta:
description = "Rootpacket Linux cryptojacking toolkit"
reference = "Kinryu Labs CTI 2026-06-16"
strings:
$wallet = "46NVDFL6v5STw5Qw4j77PoBSHRTYnHZGZ8WRoGvHmpaMX7ZyhNUP2u24TLV9pNgncz1bZF2Vm8KkaNTzU7SXqrnFUx5zgHQ" ascii
$svc = "kernel-kd" ascii
$cron = "xrandom-userland-autostart" ascii
$mod = "intel_uncore_freq_aux" ascii
condition:
$wallet or 2 of ($svc, $cron, $mod)
}
ترمیم
- روتکیت را از یک وضعیت پاکِ شناختهشده بردارید. از رسانهٔ زنده یا بازیابی بوت کنید.
/lib/modules/*/extra/intel_uncore_freq_aux.ko*را حذف کنید وdkms remove intel_uncore_freq_aux/1.2.0 --allرا اجرا کنید، سپس/usr/src/intel_uncore_freq_aux-1.2.0/را حذف کنید و initramfs را از نو بسازید (update-initramfs -u،dracut -f، یاmkinitcpio -P). ورودی DKMS باید برود وگرنه از نو ساخته میشود. - سرویس را بردارید:
systemctl stop kernel-kd; systemctl disable kernel-kd; rm /etc/systemd/system/kernel-kd.service; systemctl daemon-reload. - ماینر را بردارید:
rm -rf /opt/kernel-kd/ ~/.xrandom/ /tmp/.xrandom.lock، سپسpkill -9 -f xrandom. - cron را پاک کنید از خطوط
# xrandom-userland-autostart. - آنچه killservice.sh شکست را بازگردانید. روی Redis، Docker، PostgreSQL، MongoDB و دیگر باینریها
chmod 000میگذارد و قواعد DROP در iptables میافزاید. بستههای متأثر را از نو نصب کنید و دیوار آتش را بازبینی کنید. - بهصورت جانبی شکار کنید.
rootpacket.tar.gzدرونی برای توزیع مجدد ساخته شده، پس میزبانهای دیگر را برای همان نشانگرها بررسی کنید، و لاگها را برای بهرهکشی از سرویسهایkillservice.shبازبینی کنید تا راه ورود را بیابید. - CVE-2026-31431 را ببندید. به یک هستهٔ رفعشده وصله کنید (6.18.22، 6.19.12، 7.0+، یا بکپورت توزیعتان). جایی که نمیتوانید یکباره وصله کنید، رابط آسیبپذیر را غیرفعال کنید:
echo 'install algif_aead /bin/false' > /etc/modprobe.d/disable-algif-aead.confسپسrmmod algif_aead. برای کانتینرها،AF_ALG(family 38) را در پروفایل seccomp مسدود کنید. - نفوذ به میزبان از یک کانتینر را فرض بگیرید. چون نوشتنِ حافظهٔ نهان صفحه از مرز کانتینر میگذرد، هر میزبانی را که
setup.shرا اجرا کرده، حتی از درون یک کانتینر، کاملاً بهخطرافتاده بدانید. میزبان را از نو بسازید نه آنکه فقط کانتینر را بردارید.
نگاشت MITRE ATT&CK
| تاکتیک | تکنیک |
|---|---|
| Initial Access | T1190 Exploit Public-Facing Application (Redis، Docker، MongoDB، Elasticsearch، Jenkins، Hadoop YARN، تلویحی) |
| Execution | T1059.004 Unix Shell |
| Privilege Escalation | T1068 Exploitation for Privilege Escalation (CVE-2026-31431، AF_ALG algif_aead); T1611 Escape to Host (حافظهٔ نهان صفحهٔ مشترک) |
| Persistence | T1543.002 Systemd Service; T1053.003 Cron; T1547.006 Kernel Modules (DKMS) |
| Defense Evasion | T1014 Rootkit; T1036.005 Masquerading: Match Legitimate Name; T1027.002 Software Packing (UPX); T1070.004 File Deletion; T1564.001 Hidden Files |
| Discovery | T1057 Process Discovery (شکار رقبا) |
| Lateral Movement | T1570 Lateral Tool Transfer (بستهٔ توزیع مجدد درونی) |
| Impact | T1496 Resource Hijacking (ماینینگ مونرو) |
روششناسی و یادداشتهای تحلیلگر
- تحلیل بیشتر ایستا بود (استخراج رشتهها، واسازی، بازبینی کد منبع، تحلیل ساختاری) روی Kali Linux x86-64. همچنین
getrootرا یکبار در یک ماشین مجازی جدا (هستهٔ 6.6.15) اجرا کردیم تا رفتارش را ببینیم: توالی AF_ALG را آزمود، روی آن ساخت root نگرفت، و به اجرای فرمان بیامتیاز بازگشت. ماینر اجرا نشد، و چیزی بارگذاری نشد. - مؤلفهٔ ارتقای امتیاز CVE-2026-31431 است، که از الگوی
authencesn(hmac(sha256),cbc(aes))گرهخورده به سوکت AF_ALG، هدف حافظهٔ نهان صفحهٔ/usr/bin/su، و حلقهٔ نوشتنِsplice/sendmsg/recvmsgدر باینری شناسایی شد. - نمونهها (کیت و مؤلفههایش) بهدرخواست در اختیار دیگر پژوهشگران و مدافعان قرار میگیرند. به [email protected] با یادداشتی کوتاه دربارهٔ اینکه که هستید و چرا به آنها نیاز دارید ایمیل بزنید.