קבוצה אחת פרצה ביולי, קבוצה אחרת מחקה את הנתונים בספטמבר: כך הסתירה MythicRatatoskr את שרת השליטה שלה ברשת mesh
ב-06:59 בבוקר של 16 ביולי 2025 רצה על מכונה אחת בחברת לוגיסטיקת תבואה באוקראינה משימה מתוזמנת בשם pdfopentask. היא הריצה מטען PowerShell מתוך קובץ בשם temporarydoc.txt שישב בתיקיית ה-temp. דקה אחרי זה ירד למכונה downloader, למחרת ב-09:28 הגיעה אליה דלת אחורית שאף אחד עדיין לא הכיר, וכעבור חודשיים נמחקו הנתונים של החברה.
חוקרי ESET, אנטון צ'רפנוב ופטר סטריצ'ק, פרסמו ב-22 באוקטובר את הניתוח המלא של האירוע, ובמרכזו אותה דלת אחורית, שהם קוראים לה MythicRatatoskr. מה שמייחד אותה הוא לא מה שהיא עושה על המכונה הנגועה, אלא לאן היא מדווחת. השרת שדרכו התוקף שולח לה פקודות ומקבל ממנה מידע, מה שמכונה שרת שליטה ובקרה (C2), לא יושב אצל ספק אחסון שאפשר לפנות אליו בבקשה או בצו, אלא בתוך רשת שהמשתתפים בה מחברים את עצמם ישירות זה לזה בלי שרת מרכזי שמנהל אותה. לפי ESET זה המקרה המתועד הראשון שבו שחקן שמקושר למדינה מחזיק את התשתית שלו בצורה הזאת. החוקרים הציגו את הממצאים בכנס LABScon בספטמבר ובכנס Virus Bulletin ב-16 באוקטובר, לפני הפרסום הפומבי.
נעבור על שרשרת הפריצה, על הרשת שבתוכה מסתתר השרת, על מה שהנוזקה יודעת לעשות, ועל הדרך שבה החוקרים מצאו את השרת בכל זאת.
שתי קבוצות, חודשיים הפרש
הכניסה הראשונה הגיעה במייל פישינג ממוקד (spearphishing) עם צרופה זדונית, ממצא שמתיישב עם ההתראה של CERT-UA על אותה פעילות. ה-downloader שירד דקה אחרי המשימה המתוזמנת נקרא MATCHBOIL, והוא הביא איתו דלת אחורית בשם MATCHWOK מכתובת שהתחזתה לאלבום תמונות של חיות. שני הכלים האלה מיוחסים לקבוצה UAC-0099, שפועלת לפי ESET לפחות מ-2022 נגד גופי ממשל, מוסדות פיננסיים ותקשורת באוקראינה, וש-CERT-UA דיווחה עליה לראשונה ביוני 2023. ESET מעריכה בביטחון בינוני שהקבוצה מיושרת עם אינטרסים רוסיים. את MATCHBOIL והאבולוציה שלו ניתחה ESET בפרסום נפרד מתחילת החודש.
למחרת הגיעה MythicRatatoskr, ודגימות נוספות שלה הופצו אחר כך למכונות אחרות בארגון, הפעם דרך שרת SFTP של OpenSSH. בשלב מסוים זיהתה הטלמטריה של ESET גם שרת SOCKS5 על חלק מהמכונות, כשאחת הדגימות חולצה מארכיון לא מזוהה בעזרת WinRAR.
ב-17 בספטמבר 2025, כחודשיים אחרי הכניסה, התחילה מחיקת הנתונים. היא בוצעה בעזרת SDelete, כלי מחיקה מאובטחת של מיקרוסופט עצמה, שהופץ על המכונות דרך Group Policy של ה-Active Directory. זה דפוס עבודה ש-ESET ראתה שוב ושוב אצל Sandworm, הקבוצה שמיוחסת ליחידה 74455 ב-GRU והאחראית בין היתר להפסקות החשמל באוקראינה ב-2015 וב-2016, ל-NotPetya ב-2017 ול-Olympic Destroyer ב-2018.
החוקרים מייחסים את שלב הכניסה ל-UAC-0099 ואת המחיקה ל-Sandworm, שניהם בביטחון גבוה, ומעריכים בביטחון גבוה שהגישה עברה מקבוצה לקבוצה במהלך האירוע. מה שהם אומרים במפורש שאינם יכולים לקבוע הוא מי מהשתיים הפעילה בפועל את MythicRatatoskr. חלוקת תפקידים כזאת בין קבוצות רוסיות אינה חדשה: מוקדם יותר ב-2025 תיעדה ESET שיתוף פעולה בין Gamaredon ל-Turla, שתיהן מקושרות ל-FSB.
רשת שאין בה שרת מרכזי
דמיינו רשת שבה כל מחשב מתחבר ישירות לכמה מחשבים אחרים, וכל אחד מהם מעביר הלאה גם תעבורה שאינה שלו. אין שרת מרכזי שמנהל את העניין, אין ספק שאפשר לבקש ממנו רשומות, והתקשורת בין שני צדדים מוצפנת מקצה לקצה. מעל האינטרנט הרגיל נבנית ככה שכבת כתובות IPv6 נפרדת, שקיימת רק בתוך הרשת הזאת. לרשת כזאת קוראים רשת mesh מבוזרת, והמימוש שבו מדובר כאן נקרא Yggdrasil.
השם מגיע מהמיתולוגיה הנורדית, שבה Yggdrasil הוא העץ שמחבר בין עולמות הקוסמוס. בעץ הזה חי סנאי בשם Ratatoskr שמעביר הודעות בין הצמרת לשורשים, ומכאן השם ש-ESET בחרה לנוזקה.
כל node ברשת מייצר זוג מפתחות Ed25519 משלו, וכתובת ה-IPv6 שלו נגזרת מהמפתח הציבורי ונופלת בטווח 200::/7, טווח שה-IETF הוציא משימוש ב-2004. הפרויקט נמצא בשלב אלפא ומממש סכמת ניתוב נסיונית. משתמשים לגיטימיים בוחרים בו לקישוריות עמידה, למחקר ולרשתות חובבים, ומה שהופך אותו אטרקטיבי לתוקפים הוא בדיוק מה שהופך אותו עמיד: אין שרת אחד שאפשר להפיל.
נקודה אחת כדאי להחזיק מכאן. Yggdrasil לא נבנה כדי לספק אנונימיות, וזה כתוב במסמכי הפרויקט עצמם. היא תחזור בהמשך.
אז איך הדלת האחורית מצטרפת לרשת?
כדי להיכנס לרשת ציבורית כזאת צריך להתחבר לפחות ל-peer ציבורי אחד. בכל הדגימות של MythicRatatoskr מוטמעת אותה רשימה של 32 peer-ים, מקודדת base64 בתוך הבינארי, ו-ESET מעריכה שמחברי הנוזקה אספו אותה ממקורות פומביים. הנוזקה בוחרת מתוכה שלושה באקראי, וזה גם המספר שהפרויקט ממליץ עליו.
הקוד שעושה את זה לא נכתב מאפס. הוא מבוסס על yggstack, פרויקט שמאפשר לדבר עם רשת Yggdrasil דרך מימוש של ערימת הרשת ב-user space, בלי ליצור ממשק tunnel במערכת. ההבדל הזה מעשי: יצירת ממשק כזה דורשת הרשאות שלתוקף לא בטוח שיש, ולא כל מערכת תומכת בו בכלל. בלעדיו הנוזקה ניידת יותר.
בכל הרצה MythicRatatoskr מייצרת תצורת Yggdrasil חדשה ומפתח Ed25519 פרטי חדש. כיוון שהכתובת נגזרת מהמפתח, כתובת ה-IPv6 של המכונה הנגועה בתוך הרשת משתנה בכל הרצה. הנוזקה גם משאירה את שדה ה-NodeInfo ריק ומדליקה את דגל הפרטיות שלו, כך ש-node-ים אחרים ברשת לא יכולים לגלות עליה פרטים כמו גרסת Yggdrasil או מערכת ההפעלה שהיא רצה עליה. בחלק מהדגימות יש גם השהיה של עשר דקות בתחילת הריצה, שלפי הערכת ESET נועדה למנוע התחברות מיידית לרשת ברגע ההרצה.
מה MythicRatatoskr יודעת לעשות
הנוזקה כתובה ב-Go, ונרשמת על המכונה כ-service של Windows בשם ieupdate. בשטח היא הופיעה תחת שמות קבצים שנראים תמימים: updater.exe ו-windowsdefendersvc.exe בתוך system32, OneDriveLiveUpdater.exe בתיקיית OneDrive, krbtman.exe. לפי סימנים שנשארו בבינאריים הפיתוח שלה התחיל מתישהו בין דצמבר 2024 לפברואר 2025.
ברגע שהיא בתוך הרשת, היא מדברת עם השרת שלה ב-HTTPS על פורט 443, בבקשות POST עם גוף JSON. יש ארבעה סוגי הודעות: checkin שרושם את הנוזקה ושולח שם משתמש, שם מכונה וכתובות IP מקומיות ומקבל בחזרה מזהה חדש, tasking שמבקש פקודות חדשות, result שמחזיר פלט, ו-getfile שמביא תוכן של קובץ. ברירת המחדל היא לדפוק בדלת כל חמש דקות.
התצורה נשמרת בקובץ מוצפן ב-AES-256-CFB עם מפתח שמוטמע בבינארי, ו-16 הבייטים הראשונים של הקובץ הם ה-IV. מעניין יותר הוא שהקובץ הזה לא נחוץ בשביל להתחיל לרוץ: בתוך הבינארי יש תצורת ברירת מחדל, שהנוזקה מצפינה וכותבת לדיסק באתחול הראשון שלה. כך אפשר להפיץ אותה בלי קובץ נלווה, ולעדכן את התצורה אחר כך בפקודה מהשרת.
ורמז קטן יושב דווקא בשמות הקבצים האלה. אחד נתיבי התצורה ש-ESET מצאה הוא %LocalAppData%/Temp/.crond, עם קווים נטויים קדימה ועם נקודה בתחילת שם הקובץ. שתי התכונות האלה הן הרגלים של עולם ה-Unix: שם שמתחיל בנקודה מוסתר מ-ls כברירת מחדל, וב-Windows הוא לא מוסתר בכלל. בדגימה אחת נשאר גם נתיב תצורה שאינו בשימוש, /tmp/.test_config. מכאן ההערכה של ESET שקיימת גם גרסת לינוקס של הנוזקה, אף שהיא טרם נמצאה.
רשימת הפקודות היא בעיקר מה שמצפים מדלת אחורית: הרצת פקודות shell דרך cmd.exe, ניווט בקבצים, העלאה והורדה, שינוי כתובת השרת, שינוי זמן ההמתנה, מידע על ה-node, וצילומי מסך של כל המסכים הפעילים. הצילומים לא נשמרים לדיסק בכלל, הם חוזרים ישר בתוך תוצאת הפקודה, וגם קבצים שמחולצים מהמכונה אינם נערמים קודם במקום ביניים. שתי פקודות נוספות עוסקות בניתוב: expose חושפת פורט TCP מקומי לרשת Yggdrasil, ו-proxy מקימה דרכה חיבור SOCKS5 הפוך. את הקוד של החלק הזה העתיקו בעיקר מפרויקטים פתוחים, ו-ESET מזהה את זה לפי מחרוזות דיבאג ושמות פונקציות ששרדו בבינארי.
על חלק מהמכונות הופיע גם שרת SOCKS5 נפרד, כלי Go קטן שנקרא פנימית bindProxy ומאזין על 127.0.0.1 בפורט 33690, כלומר רק למכונה המקומית. למה להוסיף אותו כשבדלת האחורית עצמה יש כבר proxy? ESET אומרת שלא ברור, ומעלה את האפשרות שפקודת ה-proxy פשוט לא עבדה כמו שצריך.
איך ESET מצאה את השרת בכל זאת
כאן חוזרת הנקודה מקודם. Yggdrasil אינו מתיימר להיות אנונימי, ולכן אפשר לאתר בו node-ים. החוקרים התחילו מהמפה הציבורית של הרשת, וגילו שהיא עודכנה לאחרונה ב-8 באוגוסט 2024, כמעט שנה לפני הפריצה. השרת לא הופיע בה.
אז הם בנו מפה בעצמם. בעץ הפריסה שמיפו השרת כן מופיע, והוא יושב קרוב למרכז, כלומר נגיש בקלות מ-peer-ים אחרים. בעזרת כלי השורה של Yggdrasil הם זיהו שהשרת מוגדר עם שלושה peer-ים ציבוריים, ושפורט 443 שלו מגיש תעודות TLS שמתחלפות בקביעות, דפוס שמאפיין את הכלי הפתוח שעליו קוד השרת כנראה מבוסס.
מה שלא הצליחו לעשות הוא לקבוע את המקום הפיזי של השרת. זה, בעצם, כל הרעיון בבחירת רשת כזאת לתשתית. החוקרים מעריכים שזה המקרה המתועד הראשון של ניצול Yggdrasil בדרך הזאת בידי שחקן שמקושר למדינה, ושהוא "עשוי לסמן מגמה רחבה יותר של יריבים שמאמצים רשתות peer-to-peer נסיוניות כדי להגדיל את העמידות וההתחמקות של התשתית שלהם", כפי שכתבו בסיכום. גם חלוקת העבודה שראינו כאן, קבוצה שמשיגה גישה וקבוצה שהורסת, היא צד אחר של אותה מגמה.
מה זה אומר בפועל
הקושי שרשת כזאת מציבה הוא שכלי אבטחת רשת לא רואים חיבור יוצא לשרת שליטה, כי מבחינתם התעבורה הולכת ל-peer-ים מפוזרים באינטרנט. ESET מציינת שחסימה של כתובות ה-peer-ים הציבוריים היא בכל זאת צעד מיטיגציה ישים, וזאת ההמלצה המעשית הישירה מהדוח. למי שמנהל רשת ארגונית כדאי גם לשים לב לבינאריים של Go שמופיעים ב-system32 עם שמות שמתחזים לרכיבי מערכת, ל-service בשם ieupdate, ולקבצים ששמם מתחיל בנקודה בתיקיות temp.
תגובות