היא הייתה שם לפני ההפעלה הראשונה, ואי אפשר להסיר אותה: Midnight Mimosa, הנוזקה שנשלחת בתוך ה-firmware של טלפונים זולים
הטלפון עולה פחות ממאה דולר, מגיע בקופסה אטומה, ובהפעלה הראשונה מבקש להתחבר ל-Wi-Fi כמו כל מכשיר חדש. באותו רגע יושבת בתוכו אפליקציית מערכת שהבעלים לא התקין, לא רואה ברשימת האפליקציות, ולא יכול להסיר.
חוקרי Bitdefender, אדריאן מיהאי גוזוב ואלכס באצ'ו, פרסמו ב-8 באוקטובר ניתוח של קמפיין שהם מכנים Midnight Mimosa: נוזקה שנשלחת בתוך ה-firmware של טלפוני אנדרואיד זולים מבוססי MediaTek, ועובדת עוד לפני שהקונה פתח את הקופסה. לפי הדוח הקמפיין נצפה על אלפי מכשירים ייחודיים ביותר מ-150 מדינות, בחלון של כשנתיים. The Hacker News הרים את הסיפור ב-13 באוקטובר.
מה שהופך את המקרה למעניין הוא פחות מה שהנוזקה עושה ויותר איפה היא יושבת. בהמשך נעבור על איך הרכיב משיג את ההרשאות שלו, איך הוא מכבה את הסורק של גוגל בכל התקנה, מי בעצם משלם על ההונאה, ולמה גם החנות הרשמית מפיצה את אותו קוד.
למה נוזקה שמגיעה עם המכשיר היא סיפור אחר
כל ההגנות שמשתמש אנדרואיד מכיר בנויות על הנחה אחת: שהוא נמצא בתמונה ברגע ההתקנה. יש חלון שמבקש אישור, יש ביקורת של החנות, יש Play Protect שסורק את מה שנכנס, ואם משהו התברר כרע אפשר להסיר אותו. ארבעת השלבים האלה מניחים שמישהו לחץ על "התקן". רכיב שנשלח בתוך ה-ROM לא עובר באף אחד מהם. "הנוזקה המותקנת מראש היא מחלקת איום אחרת", כתבו החוקרים, "והתיקון לא יכול להסתמך על הסרה".
החבילה הראשונה שזוהתה נקראת com.android.system.lite. היא נושאת את התווית הגנרית "System" והאייקון שלה מוסתר. היא חתומה במפתח הפלטפורמה של המכשיר, ולכן רצה תחת המשתמש android.uid.system ומסומנת ב-coreApp וב-persistent, כלומר המערכת מחזיקה אותה חיה. החתימה הזאת היא מה שמאפשר את כל השאר: המניפסט מבקש INSTALL_PACKAGES ו-DELETE_PACKAGES, כלומר התקנה והסרה של חבילות, וגם GRANT_RUNTIME_PERMISSIONS, מתן הרשאות לאפליקציות אחרות. הרשאות כאלה לא מחולקות לאפליקציה שמגיעה מחנות, רק לרכיב שנחתם יחד עם מערכת ההפעלה.
הקוד שבאמת עושה את העבודה לא נמצא במקום שבודקים. ה-dex של האפליקציה הוא קונכייה דקה, והלוגיקה חבויה בספרייה נייטיב בשם libeasy.so: בטעינה היא מפענחת ב-RC4 בלוק מוצפן שמוטמע בתוכה, מחלצת ממנו קובץ APK במשקל 142 קילובייט בשם cn.kw.lib.hex, וכותבת אותו לדיסק בתוך התהליך בעל הרשאות המערכת. משם הוא פונה בהצפנה אל api.weatherlive.world, מקבל קונפיגורציה, ומוריד תוספים שנושאים את המטענים. התוספים נשמרים כקבצי JAR בסיומת o, והמטענים מוגשים מה-CDN כקבצים בסיומת png. דגימה שנבדקת בלי להריץ אותה לרוב לא מכילה בכלל מטען פעיל.
שווה לשים לב גם למה שהמניפסט מבקש ולא נראה בשימוש: Accessibility, גישה להתראות והרשאות SMS, כששתי הראשונות מופעלות בידי הרכיב עצמו ולא בבקשה מהמשתמש. שירות Accessibility יכול לקרוא את תוכן כל מסך ולהקליד במקום המשתמש, וזה המנגנון שמאחורי טרויאנים בנקאיים באנדרואיד. היכולת קיימת, מופעלת מעצמה, ומחכה להחלטה בצד השרת. אותה ליבה נמצאה גם תחת com.android.sys.prot ותחת com.android.sys.gmsprot. "שם החבילה הוא לא האיום", כתבו גוזוב ובאצ'ו. "הליבה המשותפת שמתחתיו היא האיום."
אז איך זה עובר את Play Protect?
לפני כל התקנה של אפליקציה שותפה, התוספים מריצים דרך הרשאות המערכת את הפקודה שמשביתה את חבילת חנות Play, שהיא גם מי שמחזיקה את הסורק המקומי של Play Protect, ואחרי שההתקנה מסתיימת מפעילים אותה חזרה. ההתקנה עצמה רצה כ-session של PackageInstaller, ומכיוון שהתהליך המארח הוא בעל הרשאות המערכת, הרצף נסגר בלי שום חלון אישור.
ואז יש שלב שלישי, שמטפל במה שנשאר אחרי. מתקין שמחזיק INSTALL_PACKAGES קובע בעצמו איזה שם יירשם כמי שהתקין את האפליקציה, והפלטפורמה לא בודקת את הערך. בחלק מהדגימות הוא הוגדר כחנות Play. אבל את הטענה הזאת אפשר להפריך: אפליקציות שעברו דרך החנות נושאות בלוק חתימה שגוגל מוסיפה בצד השרת, בשם frosting, ואי אפשר לייצר אותו מחוץ לפלטפורמה. Bitdefender מצאה שלוש דגימות שרשומות כאילו הותקנו מהחנות ושאין בהן frosting. ההתקנה השקטה הוציאה את המשתמש, השבתת החנות הוציאה את הסורק, וזיוף שדה המתקין מחק את העקבות של שניהם.
מי בעצם משלם על הקליקים
התוסף שאחראי על הכסף נקרא com.wz.sdk, בגרסה 20311, והוא רץ בתוך תהליך המערכת. הוא מציג פרסומות בשני אופנים: מסכים מלאים שנפתחים בלי שהמשתמש פתח משהו, וחלונות שכבה שנמשכים מעל מה שכבר על המסך, לפי שינוי במצב התצוגה או לפי פקודה שנדחפת למכשיר. המשטח שמציג את הפרסומת מסומן כמאובטח, הסימון שנועד למנוע צילום של מסכי בנק, ולכן הוא לא נראה בצילומי מסך ובהקלטות. כאן הוא משמש בכיוון ההפוך.
ההונאה מוגדרת מרחוק, ושמות השדות בקונפיגורציה נשארו גלויים: אחוז הפרסומות שיירשם כקליק בלי שום נגיעה של אדם, אחוז החשיפות שיומרו אוטומטית, ואפילו באיזה אזור של הפרסומת ייפול המגע המלאכותי כדי שייראה אנושי. יש תקרה יומית ומרווח מינימלי שבולם קליקים צפופים מדי. אחרי 60 שניות מהצגת הפרסומת נשלח דיווח המרה אוטומטי, מסומן בדגל "שקט".
וכאן הפרט המעניין: הרכיב שמייצר את הקליקים לא מרוויח עליהם. רשת פרסום משלמת לאפליקציה שמחזיקה את ה-SDK הפרסומי ואת מזהי יחידות הפרסום, ורכיב מערכת חבוי שלא מחזיק SDK כזה היה מייצר תנועה שלא משויכת לאף אחד. בדיוק בשביל זה נחוצות אפליקציות הכיסוי. אפליקציות מזג האוויר, נעילת האפליקציות והפתקים שהרכיב מתקין נראות רגילות, מכילות SDK פרסומי אמיתי, והן מה שרשת הפרסום רואה. כולן מדווחות את אותו מזהה מכשיר לאותו שרת, ובקר מעביר להן מטעני פרסום ופקודות דרך שירות שכל אחת מהן מייצאת. אפליקציה אחת מייצרת את הקליק, אפליקציה אחרת מקבלת עליו תשלום.
המכשיר כצינור יציאה לתנועה של מישהו אחר
אחת מהאפליקציות חסרות האייקון, com.mobile.applock.en בתווית "Locket", לא מציגה פרסומות בכלל. היא מבקשת שתי הרשאות רשת בלבד, אין בה ממשק ואין בה טעינת קוד דינמית, והיא עושה דבר אחד: רושמת את המכשיר אצל שרת מרכזי, מקבלת ממנו רשימת יעדים בצורת כתובת ופורט, פותחת חיבור לכל יעד כזה, ומעבירה בתים לשני הכיוונים במקטעים של 8 קילובייט. כלומר תנועה של מישהו אחר יוצאת לאינטרנט מחיבור הבית של בעל הטלפון. לשימוש הזה קוראים residential proxy, והוא נמכר בכסף דווקא מפני שהכתובת נראית כמו של גולש פרטי.
את החלק הזה כדאי לקרוא בזהירות שהחוקרים עצמם נקטו. הם הריצו את הקוד וראו הרשמה מוצלחת מול מאזין חי על פורט 6000, אבל צומת שרק נרשם לא קיבל בחזרה שום יעד להעברה. בעדכון שצורף לדוח הם מציינים שבבדיקה שנייה התברר שהכתובת שאליה התחברו היא sinkhole ולא שרת של המפעילים. מה שכן מוכח מהקוד הוא המנגנון, והוא מעביר בתים לכל כתובת שהשרת ייתן, כולל כתובות ברשת המקומית שהטלפון מחובר אליה.
שתי דרכי הפצה, אותה תשתית
התעודה שחתמה על הרכיב נושאת את השם ZED מ-ShenZhen, והיא ממופה ליצרן אנדרואיד סיני אמיתי, Shenzhen Zediel Co., Ltd., שמחזיק גם הקצאת MAC משלו, כך שכל מכשיר שכתובת ה-Wi-Fi שלו מתחילה ב-A0:53:94 הוא בילד שלו. את המשמעות Bitdefender מנסחת בזהירות, וכדאי להעביר אותה כמו שהיא: החוקרים מאשרים רק שתעודות הנושאות את השם Zediel שימשו לחתימת firmware על מכשירים נגועים. איך הן הגיעו לשם, והאם מחזיק התעודה ידע בכלל, נשאר לא ברור. זה גם לא שם החברה היחיד שעלה בחקירה, ויש מכשירים שה-firmware שלהם לא חתום בידי Zediel ונושאים את אותה נוזקה בדיוק.
הפיזור הגאוגרפי עצמו הוא ראיה. בראש הרשימה מקסיקו, צרפת ואיטליה, אחריהן ארצות הברית, גרמניה, ברזיל וספרד, ומתחת זנב ארוך באפריקה, בדרום מזרח אסיה ובמזרח התיכון. אין מדינה דומיננטית אחת. מפעיל סלולר או קמעונאי ארצי היה מייצר שוק אחד גדול; שני מרכזי כובד נפרדים עם זנב ארוך מאחוריהם הם מה שנראה כמו חומרה שזורמת דרך זירות מכירה בינלאומיות. גם מחרוזות הדגם מצביעות לשם: במקרים אחדים מה שמדווח כדגם המכשיר הוא בכלל שם לוח המערכת, k62v1_64_bsp, כלומר MediaTek MT6762, וזה קורה כשהרכיב נשלח בתוך תמונת ה-firmware. שני הדגמים בעלי הנפח הגבוה ביותר הם דווקא מותגים אמיתיים: S200 X של Doogee ו-KINGKONG X של Cubot.
את מפעיל המטענים החוקרים קושרים לשושלת ארוכה יותר. הרשומה של Dr.Web על משפחת Android.Phantom, שתועדה בינואר 2026 כנוזקה שנדחפת לתוך גרסאות מפוצחות של משחקים ואפליקציות פופולריות ומבצעת הונאת קליקים, מכילה את אותם סימני זיהוי בדיוק ומפנה לדומיין של משפחה משנת 2021 שעסקה בהונאת מנויי SMS ובטעינת קוד מרחוק. בהקשר הזה ההרשאות הלא מנוצלות ל-SMS ול-Accessibility נראות פחות מקריות.
והקמפיין לא מסתיים בחומרה זולה. שלוש עשרה אפליקציות שפורסמו בחנות Play נמצאו נושאות את אותם סימני משפחה של אפליקציות הכיסוי, והפעם בבילדים שגוגל עצמה הפיצה: הן נושאות את אותו בלוק frosting שהיעדרו חשף את ההתקנות המזויפות, כלומר עברו את ביקורת החנות והגיעו לאנשים שחיפשו אפליקציית מזג אוויר או סורק QR. הן חתומות בשלוש עשרה תעודות שונות, פרוסות על שני חשבונות מפתחים לפחות; מי שמחליף זהות חתימה בכל חבילה מניח שאחת מהן תישרף בסופו של דבר. סגירה של ערוץ אחד משאירה את השני שלם.
מה זה אומר בפועל
מי שמחזיק אחד מהמכשירים האלה לא יכול להסיר את הרכיב בדרך הרגילה, כי הוא יושב במחיצת המערכת, ולכן נשארות שתי אפשרויות: ניקוי ברמת ה-firmware או השבתת החבילה דרך ADB, ושתיהן לא מעשיות לרוב האנשים שקונים טלפון במחיר הזה. לארגונים התמונה מעשית יותר. בסביבה שמאפשרת מכשירים פרטיים, טלפון שמעביר בתים לכל כתובת שהשרת ייתן לו הוא נכס פתוח ברשת המשרדית, וכדאי לחפש אחריו: הסימנים שעומדים גם כששמות החבילות מתחלפים הם libeasy.so, ה-framework בשם cn.kw.lib.hex ותנועה אל api.weatherlive.world, ובצד החומרה כתובת Wi-Fi שמתחילה ב-A0:53:94. את התיקון האמיתי, כפי שהחוקרים כותבים, מחזיקים היצרנים וזירות המכירה שמשווקות את ה-firmware הזה.
תגובות