HollowGraph: הנוזקה שהחביאה פקודות ומידע גנוב ביומן Microsoft 365 של ארגון ישראלי
חוקרי Group-IB פרסמו ב-20 ביולי ניתוח של נוזקה חדשה שכינו HollowGraph, וההתקפה שבמרכזה כוונה לארגון ישראלי. מה שהופך אותה למעניינת הוא לא מה שהיא גונבת, אלא איך היא מסתתרת. הנוזקה לא פותחת חיבור לשום שרת של התוקף. במקום זה היא מתחברת לתיבת Microsoft 365 פרוצה, קוראת פקודות מתוך אירועי יומן שמתוארכים לשנת 2050, ומעלה את המידע הגנוב חזרה כקבצים מצורפים לאותם אירועים.
מבחוץ, לכל צופה ברשת, זו נראית כמו עבודה שגרתית מול Microsoft Graph, ה-API שדרכו אפליקציות ניגשות לדואר וליומן של המשתמש. אין כאן חולשה בתוכנה של מיקרוסופט. יש כאן ניצול חכם של פונקציונליות לגיטימית לגמרי, וזו בדיוק הסיבה שקשה כל כך לתפוס אותה.
למה יומן, ולמה שנת 2050
כדי להבין את הרעיון, צריך להכיר את המושג שרת שליטה ובקרה (C2, השרת שדרכו התוקף שולח פקודות לנוזקה ומקבל ממנה מידע). ברוב המתקפות הנוזקה מתחברת לכתובת שהתוקף מחזיק, ומגני הרשת יכולים לחסום את הכתובת הזאת ברגע שזיהו אותה. HollowGraph מוותרת על השרת הזה לגמרי. במקום שרת חיצוני, היא משתמשת ביומן של תיבת דואר שכבר נפרצה כתיבת מסרים סמויה: התוקף משאיר שם פקודות, הנוזקה שולפת אותן, ואחר כך מחזירה לשם את השלל. היומן הוא אחסון פסיבי, לא ערוץ תקשורת פעיל, וזה מה שמאפשר לו להיטמע בתעבורה הרגילה של הארגון.
התאריך הרחוק, 13 במאי 2050, הוא הטריק שמשלים את ההסתרה. אירוע שמתוכנן לעוד עשרים וארבע שנה לא יופיע בשום מקום שבו בעל התיבה מסתכל, לא בשבוע הקרוב ולא בחודש הבא. הוא פשוט יושב שם, בקצה הרחוק של לוח השנה, ומחכה.
איך הנוזקה מקבלת פקודות
מבחינה טכנית HollowGraph היא קובץ DLL כתוב ב-.NET, שהודר בשיטת NativeAOT כדי להיראות כמו רכיב תוכנה רגיל. ההידור הזה גם מקשה על חוקרים לפרק את הקוד בחזרה למבנה קריא, כי הוא לא נשען על סביבת הריצה הרגילה של .NET שכלי הניתוח מכירים היטב. היא תומכת בשתי פקודות בלבד, get ו-send, וזו הפשטות שהופכת אותה לקשה לזיהוי: אין בה עשרות יכולות רועשות, רק לקבל קובץ ולשלוח קובץ. כל שאר הלוגיקה, איזה קובץ לגנוב ומתי, יושבת אצל המפעיל ומגיעה בזרם המשימות מהיומן, כך שהנוזקה שיושבת על המחשב הנגוע היא רכיב דק ופשוט ככל האפשר.
כשהיא רוצה לקבל משימה חדשה, הנוזקה שולחת בקשת Graph לכתובת calendarView של התיבה ומחפשת אירוע שכותרתו בנוסח "Event ID:" ואחריו מזהה משימה בן שבעה תווים. הפקודה עצמה ממתינה בקבצים המצורפים לאירוע, בשמות כמו File1.txt, ומגיעה בפורמט מובנה שמפריד בין הפקודה לארגומנטים שלה. שבעת התווים של מזהה המשימה מלווים כל חילופי מסרים בין הנוזקה למפעיל, וכך כל צד יודע לאיזו משימה שייך כל אירוע.
איך היא מוציאה את המידע החוצה
הכיוון ההפוך עובד באותו ערוץ בדיוק. כשהנוזקה אוספת קבצים מהמחשב הנגוע, היא מצפינה אותם ומעלה אותם כקבצים מצורפים לאירוע יומן חדש, דרך ה-endpoint של Graph שמוסיף attachment לאירוע. בסיום ההעלאה היא משנה את שם האירוע לתבנית קבועה בנוסח "Boss...ID...", וזה הסימן למפעיל שהשלל מוכן לאיסוף. התוקף נכנס לתיבה, מוריד את הקבצים המצורפים, והמידע יוצא מהארגון בלי שאף חיבור חשוד נפתח אי פעם אל שרת זר.
ערוץ שני, מוסתר ב-DNS
גם למנגנון הזה יש נקודת תורפה: הוא תלוי בפרטי האימות של האפליקציה שמאפשרים לנוזקה לגשת לתיבה, ופרטים כאלה עשויים להתחלף או להיפסל. כדי לרענן אותם בנתה HollowGraph ערוץ נוסף ומתוחכם לא פחות, שרוכב על DNS.
הנוזקה פונה לדומיין cloudlanecdn[.]com ומבקשת רשומות AAAA, אותן רשומות שאמורות להחזיר כתובת IPv6. אלא שכאן הכתובת החוזרת אינה כתובת אמיתית אלא מטען: כל רשומה בת שישה עשר בתים נושאת ארבעה עשר בתים של מידע מוברח. שאילתה עם התת-דומיין .p. מחזירה את אורך המידע הכולל, ושאילתות .q. מחזירות אותו בחלקים. כך מקבלת הנוזקה מחדש את מזהה הדייר, מזהה האפליקציה, הסוד שלה וכתובת התיבה, ושומרת אותם על הדיסק בקובץ שמחופש לקובץ יומן תמים בשם logAzure.txt.
הצפנה כפולה
כל התעבורה הזאת מוצפנת בשילוב מקובל אך מיושם בקפידה. מפתח AES-256 טרי מיוצר לכל העברה ומצפין את המידע עצמו, ומעליו עוטף אותו RSA באורך 2048 ביט. לכניסה וליציאה יש זוגות מפתחות RSA נפרדים, כך שגם מי שיפצח את אחד הכיוונים לא יקבל אוטומטית גישה לשני. התוצאה היא שאפילו מי שמצליח ליירט את קבצי היומן המצורפים נשאר עם גוש מוצפן חסר משמעות.
מי עומד מאחורי זה
Group-IB מקשרת את HollowGraph בביטחון גבוה למסגרת נוזקות בשם Cavern. הראיה המשכנעת ביותר היא פקודה שנצפתה, MzU=, שמפוענחת מבסיס 64 למחרוזת 003, ותואמת בדיוק לפקודה שמפעילה רישום ניפוי שגיאות במסגרת Cavern, כולל אותו מבנה משימות מדויק. תחביר הפקודות והפורמט חופפים אף הם.
הזיהוי של הגורם עצמו זהיר הרבה יותר. Cavern חולקת דמיון טכני עם דלת אחורית ב-.NET שקושרה בתחילת 2025 לקבוצה בשם Lyceum, שנחשבת לתת-קבוצה של שחקן האיום האיראני OilRig. אבל החוקרים לא ממהרים לקבוע. "החפיפות האלה ראויות לציון, אך אינן ייחודיות מספיק כדי לתמוך בשיוך ברמת ביטחון גבוהה", כתבו ב-Group-IB. במילים אחרות: הכיוון מצביע על איראן, אבל אין די כדי לחתום על השם.
היקף הקורבנות, כפי שנצפה, מצומצם וממוקד. החוקרים מנו שנים עשר מחשבים נגועים, מהם כשלושה שתקשרו פעיל עם התוקף בחלון הניתוח, בין ה-3 ביוני ל-9 ביולי 2026. התיבה הפרוצה ששימשה כתיבת המסרים שייכת לארגון ישראלי, וגם קבצי הנוזקה ומסגרת Cavern הועלו מישראל. זו לא מתקפה רחבה שמפזרים על מיליונים, אלא כלי ריגול ממוקד נגד יעד נבחר. הפרופיל הזה מתיישב עם מה שידוע על OilRig, קבוצה שמזוהה עם ריגול ממושך נגד יעדים במזרח התיכון, ובכללם ישראל, ושמעדיפה שהייה שקטה וממושכת ברשת על פני מהלך רועש וחד-פעמי.
מבט קדימה
HollowGraph היא דוגמה נקייה למגמה שחוקרים מכנים ניצול שירותים לגיטימיים: במקום לבנות תשתית משלהם, שאותה אפשר לחסום ולמפות, תוקפים רוכבים על שירותי הענן שהארגון כבר סומך עליהם ומאשר בחומת האש. תעבורה אל Microsoft Graph נראית תמימה כי היא באמת אמורה להיות שם. ככל שיותר עבודה עוברת ל-Microsoft 365, ל-Google Workspace ולשירותי SaaS דומים, כך גדל הפיתוי לנצל אותם גם כערוץ שליטה, והגבול בין תעבורה עסקית לתעבורה זדונית נעשה דק יותר.
מה זה אומר בפועל
הלקח המעשי אינו עדכון גרסה, כי אין כאן מה לתקן בצד של מיקרוסופט. מי שאחראי על סביבת Microsoft 365 בארגון כדאי שיסתכל על הדברים שההתקפה הזאת נשענת עליהם: אפליקציות ורישומי הרשאה שקיבלו גישה לתיבות דואר ויומנים, במיוחד כאלה שאיש אינו זוכר שאישר, ותעבורת Graph חריגה מול calendarView או מול קבצים מצורפים לאירועים. אירוע יומן בודד שמתוכנן לשנת 2050 נשמע מופרך, אבל בדיוק ההיגיון הזה, לחפש את מה שאיש לא אמור להסתכל עליו, הוא מה שמפריד כאן בין ארגון שיתפוס את זה לארגון שלא ידע שהיה שם.
תגובות