מחברים: Kseniia Yamburh, Malware Research Engineer ב-Moonlock מאת MacPaw & Mykhailo Pazyniuk, Malware Research Engineer ב-Moonlock מאת MacPaw
תוכנת קוד פתוח היא הבסיס לחדשנות אך גם פותחת את הדלת לניצול. לאחרונה, חוקרי צ'קמרקס
ב-Moonlock, שם אנו מתמקדים בהגנה על משתמשי macOS, ידענו שעלינו לחפור עמוק יותר בגרסה הזו. כשפרקנו את השכבות, הממצאים שלנו הובילו אותנו ל-10 מאגרים נוספים - כל אחד מהם חולק קוד כמעט זהה, עם וריאציות עדינות. האם זו הייתה העבודה של פריסה אוטומטית? קמפיין מתואם? כך התפתחה החקירה.
הסיפור מתחיל עם "Meme-Token-Hunter-Bot", לכאורה רק עוד כלי עזר לחובבי קריפטו. ה-README שלו מורה למשתמשים להפעיל את main.py, קובץ שמתחיל בדרך כלל את הפונקציונליות העיקרית ברוב היישומים מבוססי Python. בעקבות ההוראות, התעמקנו ב-main.py, רק כדי למצוא אותו קורא לסקריפט עוזר בשם base_helper.py. תיק עוזר זה יהיה אבן היסוד של החקירה שלנו.
כדי לקבל הבנה ברורה יותר של האופן שבו Meme-Token-Hunter-Bot מבצע את ההתקפה שלו, שרטטנו תרשים זרימה המציג כל שלב בתהליך של התוכנה הזדונית, מההגדרה הראשונית ועד לחילוץ הנתונים. ייצוג חזותי זה חושף את השכבות של טקטיקות קידוד והתגנבות המוטמעות בחבילה, ומציע תצוגה מלאה של אופן הפעולה שלה.
תרשים הזרימה שלנו מתחיל ב-main.py, נקודת ההתחלה שקוראת ל-base_helper.py אם החבילה מזהה שהיא פועלת ב-macOS.
קובץ זה כולל כתובות URL ושמות קבצים מקודדים ב-base64, המאוחסנים במשתנים כמו encoded_base_key ו-encoded_licences.
הערכים המקודדים האלה מסתירים את המטרה האמיתית של הסקריפט, ומסווים את כתובת האתר שמתחברת אל https://coinsw[.]app/basec/ ומוריד קבצים נוספים לספריית ~/tmpcode/.
לאחר הורדת הקבצים, השלב הבא בתרשים הזרימה שלנו מציג את התוכנה הזדונית משיקה קובץ בשם MHTBot.py, ומנתב את כל הפלט הגלוי אל /dev/null - שומר על פעילותו מוסתרת ממשתמשים ומכלי ניטור כאחד.
בתרשים הזרימה, MHTBot.py בולט כנקודת המפנה בהתקפה. באמצעות PyQT5, קובץ זה יוצר ממשק משתמש גרפי המחקה תוכנה לגיטימית, המציג בקשת סיסמה וסרגל התקדמות. התחפושת הזו נועדה להרגיע את המשתמשים, בעוד שבמציאות, MHTBot.py מפעיל בחשאי סדרה של מודולים לאיסוף נתונים ברקע.
MHTBot.py משתמש בטכניקת התחמקות חכמה: הוא דוחה את ניסיון הסיסמה הראשון כ"לא מאובטח", רק מקבל את השני. עיכוב מובנה זה נועד ככל הנראה להתחמק מזיהוי ארגז חול, מכיוון שלסביבות רבות של ארגז חול יש זמן ריצה מוגבל שעשוי להסתיים לפני הפעלת התוכנה הזדונית במלואה.
כחלק מטקטיקת ההתחמקות שלה, Meme-Token-Hunter-Bot מפעילה עיכוב לפני תחילת פעולות גניבת הנתונים העיקריות שלה. עיכוב זה נועד גם להתחמק מזיהוי על ידי סביבות ארגז חול, שלעתים קרובות יש להם משך זמן ריצה מוגבל לניתוח אוטומטי. על ידי עיכוב ביצוע, התוכנה הזדונית מגדילה את סיכוייה לחמוק מהסריקות הראשוניות הללו ולהפעיל באופן מלא במערכת של משתמש אמיתי.
צילום המסך למטה מדגיש את הקוד הספציפי שאחראי לעיכוב זה. הפונקציה start_one_py_main_after_delay יוזמת השהייה של 7000 אלפיות שניות (7 שניות) באמצעות QTimer.singleShot, ולאחר מכן היא קוראת לפונקציה run_one_py_main. לאחר מכן פונקציה זו מפעילה את מודול גניבת הנתונים הראשי, one.py, בשרשור נפרד.
כאשר MHTBot.py מעביר את השליטה ל-one.py, מתחילות פעולות גניבת הנתונים העיקריות של התוכנה הזדונית. קטעי הקוד הבאים חושפים כיצד one.py משתמש בפונקציות ובמודולים שונים כדי לאסוף מידע רגיש מהמערכת של המשתמש. בואו נפרק כל חלק בקוד ואת מטרתו.
בקטע הראשון, אנו רואים את הפונקציה main() המכינה ספרייה נסתרת לאחסון זמני של נתונים גנובים. התוכנה הזדונית יוצרת ~/.temp/premium/ כספרייה נסתרת לאחסון קבצים מבלי להתריע בפני המשתמש. לאחר הגדרת ספרייה זו, הפונקציה קוראת לשגרות שונות לאיסוף נתונים מיישומים ספציפיים:
mediax(): כנראה מכוון ל-Apple Notes כדי לחלץ הערות מאוחסנות.
copy_stickies() ו-copy_stickies_database(): פונקציות אלו אוספות נתונים מאפליקציית Stickies.
backup_ssh(): אוסף מפתחות SSH מהמערכת.
copy_terminal_history(): מעתיק קבצי היסטוריית מסוף.
copy_ssh_and_keychain(): מחלץ נתונים מ-SSH ו-macOS Keychain.
פונקציות אלו מוקדשות לאיסוף מגוון רחב של נתונים מיישומים, אישורי משתמש ותצורות SSH, מה שהופך את one.py לאסוף נתונים מקיף.
הפונקציה search_files(), המופיעה בקטע הקוד הבא, מרחיבה את טווח ההגעה של איסוף הנתונים על ידי מיקוד לסוגי קבצים ספציפיים. פונקציה זו מחפשת דרך ספריות נפוצות (הורדות, מסמכים, שולחן עבודה וספרייה ביתית) אחר קבצים רגישים עם סיומות כמו .txt, .csv, .json, .config ו-.env. סוגי קבצים אלה מכילים לעתים קרובות הגדרות תצורה, מפתחות API ומידע בעל ערך אחר.
לאחר מכן, הקבצים שנמצאו מועתקים לספרייה זמנית, נדחסים ומוכנים להסרה. שלב זה מבטיח שכל הנתונים המאוחסנים בדרך כלל בספריות המשתמש או בקבצי תצורת הפרויקט נאספים.
בקטע הבא, הפונקציות copy_terminal_history() ו-copy_ssh_and_keychain() לוכדות נתוני משתמש קריטיים. התוכנה הזדונית מחלצת היסטוריית מסוף מקבצי .zprofile ו-.zsh_history, ועלולה לחשוף פקודות שהמשתמש ביצע, כולל כל מידע רגיש או אישורים שהוקלדו במסוף.
בנוסף, יש גישה ל-macOS Keychain ולספריית SSH כדי ללכוד אישורים מוצפנים, סיסמאות ומפתחות SSH המאוחסנים במערכת, ומספקים לתוקפים אישורים בעלי ערך גבוה.
אחד החלקים הבולטים ביותר של תוכנה זדונית זו הוא המיקוד שלה לארנקי קריפטו. הפונקציה zip_additional_wallets() מחפשת במיוחד ספריות הקשורות לארנקים פופולריים של מטבעות קריפטוגרפיים. התוכנה הזדונית מחפשת באופן שיטתי אחר קבצי ארנק השייכים לביטקוין, אלקטרום, קוינומי, אקסודוס וארנקי קריפטו מרכזיים אחרים. לאחר זיהוי, ספריות הארנק הללו מכווצות ומאוחסנות בספרייה הזמנית, מוכנות להסרה.
התוכנה הזדונית כוללת גם פונקציות ספציפיות לגניבת נתונים בטלגרם. הפונקציות backup_telegram() ו-backup_tdata() מחפשות ספריות נתונים של טלגרם, ומנסות לגשת להודעות, אנשי קשר ומדיה המאוחסנים באפליקציה. על ידי העתקת קבצים אלה, התוכנה הזדונית עשויה לאפשר לתוקפים לשחזר את היסטוריית התקשורת והמדיה של טלגרם של המשתמש.
לאחר איסוף מידע רגיש, Meme-Token-Hunter-Bot ממשיך לסנן את הנתונים לשרת מרוחק. הסירה הזו מבוצעת עם סדרה של פונקציות המטפלות בשינוי שם קבצים, העלאה והודעה לבוט הטלגרם של התוקף. קטעי הקוד הבאים ממחישים כיצד תהליך זה מתפתח.
הפונקציה send_telegram_message שולחת הודעה לבוט טלגרם שהוגדר מראש, ומזהירה את התוקפים כי הועלתה אצווה חדשה של קבצים גנובים. פונקציה זו מבטיחה שהתוקפים יקבלו עדכונים בזמן על כל פליטה, מה שמאפשר להם לנטר את תהליך גניבת הנתונים בזמן אמת.
כדי לטשטש עוד יותר את נוכחותו, התוכנה הזדונית משנה את שמות הקבצים הגנובים עם סיומת .minecraft - טריק יוצא דופן שנועד כנראה לעקוף מערכות בסיסיות לזיהוי פריצות לרשת המנטרות סוגי קבצים ספציפיים. לאחר שינוי השם, upload_file יוזם את העברת הנתונים לשרת המרוחק של התוקף. הקובץ נפתח במצב קריאה בינארי ומועלה באמצעות requests.post() אל https://store1.gofile[.]io/, פלטפורמת שיתוף קבצים ציבורית.
אם ההעלאה הצליחה (מסומן על ידי קוד סטטוס 200), הפונקציה מאחזרת את קישור ההורדה, שנשלח לאחר מכן לתוקף באמצעות טלגרם.
במהלך החקירה שלנו, חשדנו ש-Meme-Token-Hunter-Bot עשויה להיות לא חבילה מבודדת. שימוש ב-GitHub ממוקד
מעניין, בעוד Meme-Token-Hunter-Bot קיים כבר 10 חודשים, הוא החל לשלב קוד זדוני רק באוגוסט 2024, כאשר base_helper.py - הקובץ שאחראי על הורדת הגנב של Stage-2 Python - הוצג לראשונה. העדכון האחרון לקובץ זה נעשה ב-28 בספטמבר 2024.
מצד שני, 11 המאגרים הנוספים קיבלו את העדכונים הזדוניים שלהם לפני כחודשיים, כאשר נוספה base_helper.py. התזמון המתואם הזה מצביע על כך שמאגרים אלה הוקמו במיוחד כדי להפיץ את התוכנה הזדונית, תוך התבססות על ההצלחה הראשונית והשיטות שנראו ב-Meme-Token-Hunter-Bot.
מצאנו גם הוראות לעקוף של Gatekeeper בכמה מהמאגרים הללו, שנועדו להדריך משתמשים דרך עקיפת אזהרות האבטחה של macOS. ההוראות הוצגו בפורמט ויזואלי שלב אחר שלב, המעודד את המשתמשים ללחוץ לחיצה ימנית על האפליקציה, לבחור "פתח" ולעקוף את האזהרה של שומר הסף.
בנוסף, בין 10 המאגרים הנוספים שזוהו, בלטה וריאנט אחד בשם "סולנה-בוט". למרות שהוא עוקב אחר אותה זרימה זדונית כמו Meme-Token-Hunter-Bot, ראינו שינויים קלים, במיוחד בשמות הקבצים ובשימוש בפונקציות. ניתוח הבדל זה לצד זה של קובץ base_helper.py של Solana-Bot ושל Meme-Token-Hunter-Bot מדגיש את ההבדלים הללו.
ההבחנות העיקריות בין Solana-Bot ל-Meme-Token-Hunter-Bot כוללות שינויים בכתובת האתר.
"aHR0cHM6Ly9jb2luc3cuYXBwL2Jhc2VjLw==" + "UENTQm90LnB5" = "https://coinsw.app/basec/PCSBot.py" <-- Solana-Bot "aHR0cHM6Ly9jb2luc3cuYXBwL2Jhc2VjLw==" + "TUhUQm90LnB5" = "https://coinsw.app/basec/MHTBot.py"
חקירה זו על Meme-Token-Hunter-Bot והגרסאות הקשורות אליו חושפת מסע פרסום מתוזמר בקפידה המכוון למשתמשי macOS. חבילת הגנבים הזו שהועלתה במקור על ידי צ'קמארקס, שהתחפשה בתחילה לכלי קריפטו, התרחבה לאיום רחב יותר. הניתוח שלנו חשף 11 מאגרים נוספים, שכל אחד מהם מכיל וריאציות קלות של הקוד המקורי. נראה שהתוקפים השתמשו באוטומציה כדי ליצור במהירות מאגרים אלה, תוך שימוש בשינויים קלים בשמות, בתוויות ממשק המשתמש ובפונקציונליות כדי להתחמק מזיהוי ולהבטיח זמינות מתמשכת.
עם זאת, צפינו גם בטקטיקות מוכרות של הנדסה חברתית המיועדת למשתמשי macOS, במיוחד הוראות עקיפת ה-gatekeeper. זה מצביע על כך ששחקני איומים עדיין מסתמכים במידה רבה על ניצול אמון המשתמש. למרות הטכניקות המתקדמות שנראו במסע פרסום זה, ההסתמכות הזו על מעקפים בסיוע משתמשים מדגישה את הצורך בהשכלת משתמשים מתמשכת.
מודעות היא ההגנה הטובה ביותר. משאבים כגון הבלוג Moonlock