אבטחה

כדי למנוע הפעלה של מטען ייעודי (payload) שרירותי בתוך pVM, מסגרת הווירטואליזציה של Android‏ (AVF) משתמשת בגישה אבטחתית שכבתית שבה כל שכבה מוסיפה אכיפה נוספת. רשימה של שכבות האבטחה של AVF:

  • Android מוודא שרק לאפליקציות עם הרשאות pVM תהיה אפשרות ליצור או לבדוק pVM.

  • Bootloader –‏ ה-Bootloader מוודא שרק תמונות pVM שנחתמו על ידי Google או ספקי מכשירים מורשים להפעלה, ופועל בהתאם לתהליך ההפעלה המאומתת של Android. הארכיטקטורה הזו מרמזת שאפליקציות שפועלות במכונות pVM לא יכולות לאגד את ליבות המערכת שלהן.

  • pVM מספק הגנה מקיפה, כמו SELinux, עבור מטען ייעודי (payload) שמופעל ב-pVM. הגנה מעמיקה לא מאפשרת מיפוי נתונים כקובץ הפעלה (neverallow execmem) ומוודאת שW^X תקף לכל סוגי הקבצים.

מודל אבטחה

הסודיות, השלמות והזמינות (CIA triad) יוצרים מודל שמיועד להנחות את מדיניות אבטחת המידע:

  • סודיות היא קבוצה של כללים שמגבילים את הגישה למידע.
  • יושרה היא הבטחה שהמידע מהימן ומדויק.
  • זמינות היא ערובה לגישה מהימנה למידע על ידי ישויות מורשות.

סודיות ויושרה

סודיות נובעת ממאפייני הבידוד של הזיכרון שנאכפים על ידי ההיפר-ויז'ר pKVM. ‏pKVM עוקב אחרי הבעלות על הזיכרון של דפי זיכרון פיזיים ספציפיים ושל כל בקשה מבעלים לשיתוף דפים. ‏pKVM מוודא שרק למכונות pVM מורשות (מארח ואורחים) יש מיפוי של הדף הנתון בטבלאות הדפים שלהן בשלב 2, שנשלטות על ידי ההיפר-ויז'ר. בארכיטקטורה הזו, התוכן של הזיכרון שבבעלות pVM נשאר פרטי, אלא אם הבעלים משתף אותו באופן מפורש עם pVM אחר.

ההגבלות על שמירת הסודיות חלות גם על כל הישות במערכת שמבצעת גישה לזיכרון בשם מכונות pVM, כלומר על מכשירים עם יכולת DMA ועל שירותים שפועלים בשכבות עם הרשאות גבוהות יותר. ספקים של מערכות על שבב (SoC) צריכים לעמוד בסדרה חדשה של דרישות כדי לתמוך ב-pKVM. אם לא, לא נוכל לספק סודיות.

התכונה 'יושרה' חלה על נתונים בזיכרון ועל חישובים. מכונות pVM לא יכולות:

  • לשנות זיכרונות של אחרים בלי הסכמה.
  • להשפיע על מצב ה-CPU של כל אחד מהם.

הדרישות האלה נאכפות על ידי ה-hypervisor. עם זאת, בעיות שקשורות לשלמות הנתונים מתעוררות גם באחסון נתונים וירטואלי כשצריך להשתמש בפתרונות אחרים, כמו dm-verity או AuthFS.

העקרונות האלה לא שונים מבידוד התהליכים שמציעה מערכת Linux, שבה הגישה לדפי הזיכרון נשלטת באמצעות טבלאות דפים בשלב 1 והחלפת ההקשרים (context-switches) בין התהליכים בקרנל. עם זאת, החלק EL2 של pKVM, שאוכף את המאפיינים האלה, כולל פחות משטחי תקיפה בסדר גודל של שלוש דרגות בהשוואה לליבת Linux כולה (בערך 10,000 לעומת 20 מיליון שורות קוד), ולכן הוא מספק הבטחה חזקה יותר לתרחישי שימוש שרגישים מדי להסתמכות על בידוד תהליכים.

בגלל הגודל שלו, pKVM מתאים לאימות פורמלי. אנחנו תומכים באופן פעיל במחקר אקדמי שמטרתו להוכיח באופן רשמי את המאפיינים האלה בקובץ הבינארי של pKVM.

בהמשך הדף מוסברות ההבטחות לגבי סודיות ותקינות שכל רכיב בסביבת pKVM מספק.

Hypervisor

pKVM הוא היפר-ויז'ר מבוסס-KVM שמבודד את ה-pVM ואת Android בסביבות ביצוע שלא נותנות אמון זו בזו. המאפיינים האלה תקפים במקרה של פשרה בכל pVM, כולל המארח. היפר-ויזורים חלופיים שתואמים ל-AVF צריכים לספק מאפיינים דומים.

  • ל-pVM אין גישה לדף ששייך לישות אחרת, כמו pVM או היפר-ויז'ר, אלא אם בעל הדף שיתף אותו באופן מפורש. הכלל הזה כולל את ה-pVM של המארח והוא חל על גישות ל-CPU ול-DMA.

  • לפני שדף שנעשה בו שימוש במכונה וירטואלית פרטית מוחזר למארח, למשל כשהמכונה הווירטואלית הפרטית מושמדת, הוא נמחק.

  • הזיכרון של כל מכונות ה-pVM וקושחת ה-pVM מאתחול אחד של המכשיר נמחק לפני שתוכנת האתחול של מערכת ההפעלה מופעלת באתחול הבא של המכשיר.

  • כשמצורף מאתר באגים בחומרה, כמו SJTAG, מכונת pVM לא יכולה לגשת למפתחות שהונפקו לה בעבר.

  • הקושחה של pVM לא מופעלת אם אי אפשר לאמת את התמונה הראשונית.

  • הקושחה של המכונה הווירטואלית הפיזית לא תאתחל אם השלמות של instance.img תיפגע.

  • אפשר להפיק את שרשרת האישורים של DICE ואת מזהי המכשירים המורכבים (CDI) שמועברים למופע pVM רק מהמופע הספציפי הזה.

מערכת הפעלה אורחת

Microdroid היא דוגמה למערכת הפעלה שפועלת בתוך pVM. ‫Microdroid מורכב מ-bootloader מבוסס U-boot,‏ GKI, קבוצת משנה של Android userspace ו-payload launcher. המאפיינים האלה מתקיימים במקרה של פריצה בכל pVM, כולל המארח. מערכות הפעלה חלופיות שפועלות במכונה וירטואלית פרטית צריכות לספק מאפיינים דומים.

  • אם אי אפשר לאמת את boot.img, את super.img, את vbmeta.img או את vbmeta\_system.img, ‏ Microdroid לא יופעל.

  • אם אימות ה-APK ייכשל, מערכת Microdroid לא תאתחל.

  • אותו מופע של Microdroid לא יופעל גם אם ה-APK עודכן.

  • אם אחד מקובצי ה-APEX לא יעבור את האימות, מערכת Microdroid לא תופעל.

  • ‫Microdroid לא יופעל (או יופעל עם מצב התחלתי נקי) אם instance.img ישונה מחוץ ל-pVM של האורח.

  • ‫Microdroid מספק אישור לשרשרת האתחול.

  • כל שינוי (לא חתום) בתמונות הדיסק שמשותפות עם מכונת ה-pVM של האורח גורם לשגיאת קלט/פלט בצד של מכונת ה-pVM.

  • אפשר לגזור את שרשרת האישורים של DICE ואת ה-CDI שסופקו למופע pVM רק מהמופע הספציפי הזה.

  • פעולות כתיבה לנפח אחסון מוצפן הן סודיות, אבל אין הגנה מפני חזרה למצב הקודם ברמת הפירוט של בלוק הצפנה. בנוסף, שיבוש חיצוני שרירותי אחר של בלוק נתונים גורם לכך ש-Microdroid יראה את הבלוק הזה כנתונים לא רלוונטיים, במקום לזהות אותו במפורש כשגיאת קלט/פלט.

Android

אלה מאפיינים שמערכת Android מתחזקת כמארחת, אבל הם לא תקפים במקרה של פריצה למארח:

  • מכונה וירטואלית פרטית (pVM) של אורח לא יכולה ליצור אינטראקציה ישירה עם מכונות וירטואליות פרטיות אחרות של אורחים (למשל, ליצור vsock חיבור).

  • רק VirtualizationService במכונה הווירטואלית הפרטית של המארח יכול ליצור ערוץ תקשורת למכונה וירטואלית פרטית.

  • רק אפליקציות שנחתמו באמצעות מפתח הפלטפורמה יכולות לבקש הרשאה ליצור מכונות pVM, להיות הבעלים שלהן או לבצע אינטראקציה איתן.

  • המזהה, שנקרא מזהה הקשר (CID), שמשמש להגדרת חיבורים של vsock בין המארח לבין מכונת ה-pVM, לא נעשה בו שימוש חוזר כשמכונת ה-pVM של המארח פועלת. לדוגמה, אי אפשר להחליף מכונת pVM פעילה במכונה אחרת.

זמינות

בהקשר של מכונות pVM, זמינות מתייחסת להקצאת משאבים מספיקים על ידי המארח לאורחים, כדי שהאורחים יוכלו לבצע את המשימות שהם מיועדים לבצע.

האחריות של המארח כוללת תזמון של מעבדי ה-CPU הווירטואליים של מכונת ה-pVM. בניגוד ל-hypervisors רגילים מסוג 1 (כמו Xen),‏ KVM מקבל החלטה עיצובית מפורשת להעביר את התזמון של עומסי העבודה לליבת המארח. בהתחשב בגודל ובמורכבות של מתזמני המשימות של היום, החלטת התכנון הזו מצמצמת באופן משמעותי את הגודל של בסיס המחשוב המהימן (TCB) ומאפשרת למארח לקבל החלטות מושכלות יותר לגבי תזמון כדי לבצע אופטימיזציה של הביצועים. עם זאת, מארח זדוני יכול לבחור שלא לתזמן אורח אף פעם.

באופן דומה, pKVM גם מאציל את הטיפול בהפסקות פיזיות לליבת המארח, כדי לצמצם את המורכבות של ההיפר-ויזור ולהשאיר את המארח אחראי על התזמון. אנחנו משקיעים מאמצים כדי לוודא שהעברה של הפרעות לאורח תגרום רק לדחיית בקשה (מספר קטן מדי, מספר גדול מדי או ניתוב שגוי של הפרעות).

לבסוף, תהליך הניטור של המכונה הווירטואלית (VMM) של המארח אחראי להקצאת זיכרון ולמתן מכשירים וירטואליים, כמו כרטיס רשת. מנהל מכונות וירטואליות זדוני יכול למנוע משאבים מהמכונה האורחת.

למרות ש-pKVM לא מספק זמינות לאורחים, העיצוב מגן על הזמינות של המארח מפני אורחים זדוניים, כי המארח תמיד יכול להקדים או לסיים את הפעילות של אורח ולשחזר את המשאבים שלו.

הפעלה מאובטחת

הנתונים מקושרים למופעים של מכונה וירטואלית פרטית, ואתחול מאובטח מבטיח שאפשר לשלוט בגישה לנתונים של מופע. באתחול הראשון של מופע, הוא מוקצה על ידי יצירה אקראית של מלח סודי עבור ה-pVM וחילוץ פרטים, כמו מפתחות ציבוריים וגיבובים לאימות, מהתמונות שנטענו. המידע הזה משמש לאימות של אתחולים עוקבים של מופע pVM, ומוודא שהסודות של המופע נחשפים רק לקובצי אימג' שעוברים את האימות. התהליך הזה מתרחש בכל שלב טעינה בתוך ה-pVM: קושחת ה-pVM,‏ pVM ABL,‏ Microdroid וכן הלאה.

‫DICE מספק לכל שלב טעינה זוג מפתחות לאימות, והחלק הציבורי שלהם מאומת באישור DICE של אותו שלב. צמד המפתחות הזה יכול להשתנות בין הפעלות, ולכן נגזר גם סוד איטום שהוא יציב עבור מופע המכונה הווירטואלית בין הפעלות מחדש, ולכן מתאים להגנה על מצב מתמשך. הסוד של החתימה חשוב מאוד למכונה הווירטואלית, ולכן לא מומלץ להשתמש בו ישירות. במקום זאת, מפתחות האיטום צריכים להיות נגזרים מסוד האיטום, וסוד האיטום צריך להיות מושמד מוקדם ככל האפשר.

בכל שלב מועבר אובייקט CBOR מקודד באופן דטרמיניסטי לשלב הבא. האובייקט הזה מכיל סודות ואת שרשרת האישורים של DICE, שמכילה מידע מצטבר על הסטטוס, כמו האם השלב האחרון נטען בצורה מאובטחת.

מכשירים לא נעולים

כשמבטלים את הנעילה של מכשיר באמצעות fastboot oem unlock, נתוני המשתמש מאופסים. התהליך הזה מגן על נתוני המשתמשים מפני גישה לא מורשית. גם נתונים שפרטיים למכונה וירטואלית פרטית הופכים ללא תקפים כשמבטלים את נעילת המכשיר.

אחרי ביטול הנעילה, הבעלים של המכשיר יכולים להפעיל מחדש מחיצות שמוגנות בדרך כלל על ידי אתחול מאומת, כולל המחיצות שמכילות את pvmfw ואת ההטמעה של pKVM. לכן, מכשיר לא נעול לא נחשב מהימן מספיק כדי לשמור על מודל האבטחה של pVM.

צדדים מרוחקים יכולים לראות את המצב הזה, שעלול להיות לא מאובטח, על ידי בדיקה של מצב ההפעלה המאומת של המכשיר באישור אימות המפתח.