זיהוי אמולטורים ומכונות וירטואליות בתעבורת רשת
אמולטורים ומכונות וירטואליות מפעילים הונאה בקנה מידה — חוות מכשירים, אמולציית אפליקציות מובייל, דפדפני ענן. זיהויָם פירושו קריאת אותות חומרה, תזמון וקוהרנטיות שסביבה וירטואלית אינה יכולה לשחזר במלואם.
רוב ההונאה שרצה בקנה מידה רצה על תשתית וירטואלית, משום שהחלופה — חדר מלא בטלפונים ומחשבים ניידים פיזיים — אינה מתרחבת ואינה מסתתרת. אמולטור או מכונה וירטואלית מאפשרים למפעיל יחיד להריץ בבת אחת אלפי מכשירים שנראים נפרדים, כל אחד נראה כנקודת קצה צרכנית טרייה. זיהוי הווירטואליזציה הזו הוא אחד הדברים בעלי המנוף הגבוה ביותר שעושה שכבת מודיעין המכשירים, משום שהוא מזהה את התשתית של הניצול לרעה בקנה מידה במקום לרדוף אחר פעולות הונאה בודדות אחת־אחת.
מאמר זה עוסק באופן שבו אמולטורים ומכונות וירטואליות מסגירים עצמם בתעבורת רשת ואפליקציות: אותות החומרה, התזמון והקוהרנטיות שסביבה וירטואלית מתקשה לשחזר, מדוע אף אות בודד אינו מספיק, וכיצד לפעול על סמך הזיהוי בלי לשבור וירטואליזציה לגיטימית. קהל היעד הוא מהנדסים וצוותי הונאה הבונים או מעריכים זיהוי בוטים.
מדוע אמולטורים ומכונות וירטואליות חשובים להונאה
אמולטורים ומכונות וירטואליות חשובים משום שהם המצע החסכוני להונאה בנפח — הם הופכים מכונה יחידה לצי של מכשירים בעלי מראה נקי, וזה בדיוק מה שרוב כלכלת ההונאה דורשת.
הבעיה החוזרת בהונאה היא קנה המידה. חשבון מזויף בודד או עסקה הונאתית בודדת ממעטים להשתלם; הכסף הוא בעשיית זה אלפי פעמים. לעשות זאת אלפי פעמים דורש אלפי זהויות מכשיר, משום שפלטפורמות מקשרות ניצול לרעה יותר ויותר לפי מכשיר (ראו כיצד עובד טביעת אצבע של מכשיר). חומרה פיזית היא הדרך הכנה להשיג זהויות מכשיר רבות והיא יקרה ואיטית עד כדי אי־כדאיות. וירטואליזציה היא הדרך הזולה.
באופן קונקרטי, וירטואליזציה עומדת בבסיס:
חוות מכשירים. מדפים של מכשירי מובייל מאומלצים או מופעי דפדפן חסרי־ראש, מתוזמרים ליצירת חשבונות, ניצול מבצעים, פרסום ביקורות מזויפות, או הרצת credential-stuffing וניצול לרעה של יצירת חשבונות בנפח. כל מופע מאומלץ מציג עצמו כטלפון או מחשב נייד נפרד.
אמולציית אפליקציות מובייל. הרצת אפליקציות Android או iOS באמולטורים על חומרת שולחן עבודה או שרת כדי לבצע אוטומציה של תהליכים מבוססי־אפליקציה שאמורים היו לדרוש טלפון אמיתי — הרשמות מובייל, מבצעים מגודרי־אפליקציה, הונאה בתוך האפליקציה.
דפדפני ענן ו־browser-as-a-service. דפדפנים מלאים הרצים במכונות וירטואליות בענן, מופעלים אוטומטית לגרידה, הונאת פרסום וניצול חשבונות. אלה מתוחכמים יותר מבוטים גסים משום שהם מרנדרים דפים במלואם ומריצים JavaScript.
החוט המשותף: מכונה פיזית אחת, זהויות וירטואליות רבות. אם אפשר לזהות את הווירטואליזציה, מכווצים את הצי בחזרה לגודלו האמיתי — ו"אלף משתמשים" שהם למעשה מארח מאומלץ יחיד הם החלטת סיכון שונה לגמרי מאלף מכשירים אמיתיים. זו הסיבה שזיהוי וירטואליזציה הוא מכפיל כוח: הוא תוקף את מבנה העלויות שהופך הונאה בנפח לכדאית.
מה מסגיר מכונה וירטואלית
מכונה וירטואלית מסגירה עצמה דרך אותות פיזיים שעליה לסנתז ולא להחזיק — המעבד הגרפי, התנהגות התזמון, החיישנים, וחפצי הרמה הנמוכה של ההיפרוויזור שעליו היא רצה. חומרה צרכנית אמיתית מייצרת אותות אלה כתופעת לוואי של היותה אמיתית; מכונה וירטואלית צריכה לזייף אותם, וזיוף כולם באופן קוהרנטי הוא קשה.
חתימות מעבד גרפי מווירטל. זהו אחד הסימנים החזקים ביותר. רינדור גרפי תלוי במעבד הגרפי בפועל, במנהל ההתקן שלו ובהתנהגות הנקודה הצפה שלו. מכונות וירטואליות משתמשות בדרך כלל בגרפיקה מווירטלת או מרונדרת־תוכנה — SwiftShader, llvmpipe, מעבדי גרפיקה וירטואליים של VMware/VirtualBox/QEMU, או מעבד גרפי שהועבר במעבר (passthrough) שעדיין מדווח מחרוזות מסגירות. מחרוזות ה־renderer וה־vendor של WebGL נוקבות לעיתים קרובות בשם הווירטואליזציה במישרין ("SwiftShader", "llvmpipe", "VMware SVGA", "Google SwiftShader"), ואפילו כשמחרוזות אלה מזויפות, פלט הרינדור של canvas ו־WebGL עצמו שונה ממעבדים גרפיים פיזיים בדרכים עדינות שקשה לזייף. מעבד גרפי אמיתי מרנדר סצנה מורכבת עם חפצים אופייניים למנהל התקן; רינדור תוכנה מייצר חתימה שונה.
תזמון נקי מדי. חומרה אמיתית רועשת. קומפילציית JIT, איסוף אשפה, ויסות תרמי, פסיקות מערכת ההפעלה ואפקטים של היררכיית זיכרון מכניסים רעד רציף למדידות התזמון. סביבות וירטואליות — במיוחד כאלה המתארחות בענן על תשתית איכותית — רצות לעיתים קרובות חלק מדי, עם שונות תזמון נמוכה מזו שמפגינים מכשירים צרכניים פיזיים. תזמון ברזולוציה גבוהה של דפוסי חישוב מסוימים יכול לחשוף סביבה שפרופיל הביצועים שלה אחיד באופן לא־טבעי. באופן פרדוקסלי, ה"נקיות" של מכונה וירטואלית במרכז נתונים היא עצמה האות.
חפצי היפרוויזור. וירטואליזציה משאירה עקבות ברמה נמוכה: דגלי תכונות מעבד ומוזרויות תזמון פקודות השונים תחת היפרוויזור, התנהגות TSC (timestamp counter) ספציפית, ו — היכן שנצפה — ערכי מקביליות־חומרה וזיכרון המתקבצים סביב תצורות אופייניות ל־VM ולא לצרכן. מכשיר המדווח על מספר ליבות ופרופיל זיכרון דמויי־שרת מאוד בעודו טוען שהוא מחשב נייד צרכני הוא לא־קוהרנטי.
טביעות אצבע של שמע וחומרה אחרת. טביעת האצבע של AudioContext תלויה בתת־מערכת השמע; חומרת שמע מווירטלת או נעדרת מייצרת פלט נקודה צפה השונה מחומרת קול אמיתית. קטן בפני עצמו, שימושי בשילוב.
הקשר רשת. ציי אמולטורים ומכונות וירטואליות רצים לעיתים קרובות במרכזי נתונים, ולכן שכבת הרשת — ASN של מרכז נתונים, IP של ספק אירוח — מאששת את אותות נקודת הקצה. חתימת VM בשילוב עם IP של מרכז נתונים היא דפוס חזק הרבה יותר מכל אחד מהם לבדו. (מפעילים מתוחכמים מציבים מול המכונות הווירטואליות שלהם proxy מגורים כדי להסתיר את צד הרשת, וזו בדיוק הסיבה שזיהוי VM ברמת נקודת הקצה חשוב באופן עצמאי — הוא שורד את ה־proxy.)
כיצד אמולטורים למובייל מסגירים עצמם
אמולטורים למובייל מסגירים עצמם דרך אותו עיקרון המיושם על טלפונים: עליהם לסנתז את מאפייני החומרה, החיישנים והרינדור הספציפיים של מכשיר פיזי, והסינתזה חלקית. אפליקציית Android או iOS הרצה באמולטור על חומרת שולחן עבודה אינה טלפון, ותריסר אותות מעידים על כך.
מחרוזות זהות חומרה. אמולטורים נושאים ערכי דגם־מכשיר, טביעת־build ושם־חומרה אופייניים. אמולטורים של Android דיווחו היסטורית "generic", "goldfish", "ranchu", "sdk_gphone" ומזהי build דומים, לצד שמות דגם אופייניים לאמולטור. אפילו כשאלה מתוקנים כדי לחקות מכשיר אמיתי, הצירוף של דגם, לוח, CPU ABI וטביעת build לעיתים קרובות אינו תואם אף מכשיר אמיתי שהגיע לשוק — טלפון דגל נטען עם x86 ABI (טלפונים אמיתיים הם ARM) הוא הסגרה.
חיישנים חסרים או מזויפים. לטלפונים אמיתיים יש מדי־תאוצה, ג'ירוסקופים, מגנטומטרים, חיישני אור סביבתי וברומטרים, ו — קריטית — חיישנים אלה מייצרים נתונים רציפים, מתואמים ורועשים ככל שהמכשיר מוחזק ומוזז. אמולטורים או שחסרים חיישנים אלה, מדווחים ערכים סטטיים, או משחזרים דפוסים סינתטיים חסרי השונות הטבעית והמתאם הבין־חיישני של מכשיר המוחזק ביד אנושית. "טלפון" שמד־התאוצה שלו קורא קבוע מושלם, או שהג'ירוסקופ ומד־התאוצה שלו אינם נעים יחד כפי שהפיזיקה מחייבת, הוא מאומלץ.
הבדלי רינדור ומעבד גרפי. בדיוק כמו בשולחן העבודה, חתימת הרינדור של המעבד הגרפי במובייל שונה בין המעבד הגרפי של טלפון פיזי (Adreno, Mali, מעבד גרפי של Apple) לבין מעבד מאומלץ או מרונדר־תוכנה. צפיפות מסך, רזולוציה וחפצי רינדור שאמורים להתאים לדגם טלפון ספציפי נטען לעיתים קרובות אינם תואמים.
פרופיל תזמון וביצועים. אפליקציית טלפון הרצה על חומרה מדרג שרת באמולטור מתפקדת אחרת מאותה אפליקציה על ה־SoC של הטלפון בפועל — לעיתים קרובות מהר וחלק יותר משהמכשיר האמיתי היה — עוד מופע של הסימן "נקי מדי".
מקרה המובייל הוא המקום שבו נתוני החיישנים הופכים למכריעים, משום שקשה באמת לזייף אותם היטב. שחזור הפלט הרציף והקוהרנטי־פיזית של חיישני התנועה של טלפון אמיתי — מד־תאוצה וג'ירוסקופ המסכימים על אותה תנועה, עם רעד־מיקרו ריאליסטי של יד אנושית — הוא עבודה רבה בהרבה מעריכת מחרוזת שם־דגם, ורוב הגדרות האמולציה אינן עושות זאת באופן משכנע.
מדוע אף אות בודד אינו מספיק
אף אות בודד אינו מזהה וירטואליזציה באופן מהימן, משום שכל אות בודד ניתן לזיוף על ידי מפעיל המכיר אותו — ולכן זיהוי חסון תלוי בקוהרנטיות בין־אותות ולא בבדיקה בודדת כלשהי. זהו אותו עיקרון השולט בזיהוי דפדפני anti-detect: סימנים בודדים ניתנים לתיקון; קוהרנטיות בין כולם אינה.
מפעיל נחוש:
- יזייף את מחרוזות ה־vendor/renderer של WebGL כדי לנקוב בשם מעבד גרפי אמיתי.
- יתקן את טביעת ה־build והדגם של Android כדי להתאים לטלפון אמיתי.
- יזריק ערכי חיישן סינתטיים כדי לזייף נתוני תנועה.
- יציב מול המכונה הווירטואלית proxy מגורים כדי לנקות את אות הרשת.
כל אחד מאלה מביס גלאי הנשען על אותו אות יחיד. מערכת הבודקת רק את מחרוזת ה־renderer של WebGL מובסת בעריכת מחרוזת. מערכת הבודקת רק טביעות build מובסת בתיקון.
מה שקשה הוא לעשות את כל זה באופן קוהרנטי בבת אחת. המפעיל המזייף את מחרוזת ה־WebGL כדי לטעון למעבד גרפי Adreno עדיין מייצר פלט רינדור canvas שאינו תואם Adreno אמיתי. זה שמזייף את שם הדגם עדיין מדווח על x86 ABI, או על מספר ליבות שאין לאף טלפון כזה, או נתוני חיישן ללא מתאם בין־חיישני ריאליסטי, או תזמון נקי מדי עבור ה־SoC שהם טוענים לו. כל זיוף שהם מוסיפים הוא עוד משטח שחייב להישאר עקבי עם כל האחרים, והאילוצים מתרבים.
זהו עיקרון הקוהרנטיות הסביבתית: הזיהוי אינו "האם ערך בודד זה נראה מווירטל", אלא "האם כל הערכים הללו מתארים מכשיר יחיד, אמיתי ואפשרי־פיזית". iPhone נטען שהמעבד הגרפי שלו מרנדר כמו תוכנה, שחיישניו קוראים קבוע, שה־ABI שלו x86, ושתזמונו חלק כמו מרכז נתונים אינו לא־קוהרנטי בדרך אחת — הוא לא־קוהרנטי בארבע, ויישוב כל הארבע בו־זמנית הוא החלק היקר. עלות שמירת הקוהרנטיות המלאה על פני כל אות היא מה שהופך זיהוי מבוסס־קוהרנטיות לעמיד היכן שבדיקות אות־יחיד נכשלות. מרוץ החימוש הרחב יותר והיכן שהוא עומד מכוסים במצב תעבורת הבוטים.
כיצד לפעול על סמך זיהוי וירטואליזציה
אל תחסמו וירטואליזציה באופן רפלקסיבי — שקללו אותה כאות סיכון בהקשר, משום שקיימת וירטואליזציה לגיטימית וחסימה גורפת גורמת לתוצאות חיוביות שגויות. התגובה הנכונה תלויה במה שעוד נכון לגבי התעבורה.
יש סיבות אמיתיות ולגיטימיות שמשתמש עשוי להיות במכונה וירטואלית או אמולטור: מפתחים הבודקים על אמולטורים, חוקרי אבטחה, משתמשים מודעי־פרטיות המריצים דפדפנים במכונות וירטואליות, תשתית שולחן עבודה וירטואלי ארגונית, הגדרות נגישות. חסימת כל וירטואליזציה על הסף מענישה משתמשים אלה. וירטואליזציה היא אות סיכון, לא פסק דין.
הגישה היצרנית מתייחסת אליה כאל קלט אחד להחלטה מדורגת:
- וירטואליזציה לבדה, הקשר תקין בשאר המובנים: סיכון נמוך עד בינוני. מפתח יחיד על אמולטור אינו הונאה. ציינו זאת, אל תחסמו.
- וירטואליזציה + רשת מרכז נתונים + חשבון טרי + מהירות גבוהה: סיכון גבוה. זו חתימת חוות המכשירים — נקודת קצה מאומלצת, על תשתית אירוח, יוצרת חשבונות במהירות. האותות מאששים זה את זה לכדי פסק דין בטוח.
- וירטואליזציה + הפרות קוהרנטיות (מחרוזות מזויפות שאינן תואמות רינדור, צירופי חומרה בלתי־אפשריים): סיכון גבוה. הווירטואליזציה בשילוב עם ניסיונות פעילים להסתירה היא עצמה האות החזק ביותר — משתמשי VM לגיטימיים אינם מתקנים את טביעות ה־build שלהם כדי להתחזות לטלפוני דגל.
- מתאם צי: כאשר מכשירים "נפרדים" רבים חולקים את חתימת הווירטואליזציה המסגירה ומתנהגים באופן מתואם, זיהוי הצי מכווץ אותם למקורם האמיתי, וזה מכריע ללא קשר למראה של כל חשבון בודד.
הדפוס עקבי עם זיהוי דפדפנים חסרי־ראש וזיהוי בוטים בכלל: האות הבודד מזין את הציון, צירוף האותות מייצר את פסק הדין, והתגובה מדורגת — לאפשר, לאתגר או לחסום — ולא חסימה בוטה על וירטואליזציה כשלעצמה. זיהוי אמולטורים ומכונות וירטואליות הוא בעל הערך הרב ביותר לא כשער עצמאי אלא כאות משוקלל בכבדות אשר, בשילוב עם הקשר רשת והתנהגות, חושף את התשתית שמאחורי הונאה בנפח.
Tracio מזהה וירטואליזציה כחלק ממודיעין המכשירים שלה על פני 130+ אותות — חתימות מעבד גרפי ורינדור, בדיקות תזמון וקוהרנטיות־חומרה, ניתוח חיישני מובייל וזהות build — בשילוב עם הקשר רשת של IP intelligence ובדיקות קוהרנטיות בין־אותות התופסות את ניסיונות הזיוף שגלאי אות־יחיד מפספסים. היא רצה דרך שכבת זיהוי הבוטים ומחזירה פסק דין, עם האותות הבסיסיים מצורפים, בפחות מ־50ms.
רוצים לראות כיצד זיהוי וירטואליזציה מתפקד מול תעבורת חוות המכשירים והאמולטורים במשפך שלכם?
התחילו את הניסיון החינמי שלכם — 2,500 אימותים חינם, ללא צורך בכרטיס אשראי. הזמינו הדגמה כדי לעבור על זיהוי אמולטורים ומכונות וירטואליות מול מודל האיום הספציפי שלכם.