כדי למנוע הפעלה של מטען ייעודי (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 לא יכולות:
- לשנות זיכרון של מישהו אחר בלי הסכמתו.
- להשפיע על מצב המעבד של כל אחת מהן.
הדרישות האלה נאכפות על ידי ה-hypervisor. עם זאת, בעיות שקשורות לתקינות נתונים מתעוררות גם באחסון נתונים וירטואלי כשצריך להחיל פתרונות אחרים, כמו dm-verity או AuthFS.
העקרונות האלה לא שונים מטכנולוגיות לבידוד תהליכים שמציעה מערכת Linux, שבה הגישה לדפי הזיכרון נשלטת באמצעות טבלאות דפים בשלב 1 והחלפת ההקשר בין התהליכים בקרנל. עם זאת, החלק EL2 של pKVM, שאוכף את המאפיינים האלה, כולל שטח מתקפה קטן פי 1,000 בהשוואה לליבת Linux כולה (בערך 10,000 לעומת 20 מיליון שורות קוד). לכן, הוא מספק הבטחה חזקה יותר לתרחישי שימוש שרגישים מדי כדי להסתמך על טכנולוגיות לבידוד תהליכים.
בגלל הגודל שלו, pKVM מתאים לאימות פורמלי. אנחנו תומכים באופן פעיל במחקר אקדמי שמטרתו להוכיח באופן רשמי את המאפיינים האלה בקובץ הבינארי של pKVM בפועל.
בהמשך הדף מוסברות הערבויות לסודיות ולתקינות שכל רכיב בסביבת pKVM מספק.
Hypervisor
pKVM הוא hypervisor מבוסס-KVM שמבודד את ה-pVM ואת Android בסביבות ביצוע שאין ביניהן אמון הדדי. המאפיינים האלה תקפים במקרה של פריצה בכל מכונת pVM, כולל המארח. היפר-ויזורים חלופיים שתואמים ל-AVF צריכים לספק מאפיינים דומים.
ל-pVM אין גישה לדף ששייך לישות אחרת, כמו pVM או היפר-ויז'ור, אלא אם בעל הדף שיתף אותו באופן מפורש. הכלל הזה כולל את ה-pVM של המארח והוא חל על גישות ל-CPU ול-DMA.
לפני שדף שנעשה בו שימוש במכונה וירטואלית פרטית מוחזר למארח, למשל כשהמכונה הווירטואלית הפרטית מושמדת, הוא נמחק.
הזיכרון של כל מכונות ה-pVM והקושחה של ה-pVM מאתחול אחד של המכשיר נמחק לפני שתוכנת האתחול של מערכת ההפעלה מופעלת באתחול הבא של המכשיר.
כשמצורף מאתר באגים בחומרה, כמו SJTAG, מכונת pVM לא יכולה לגשת למפתחות שהונפקו לה בעבר.
הקושחה של ה-pVM לא מופעלת אם אי אפשר לאמת את התמונה הראשונית.
הקושחה של המכונה הווירטואלית הפיזית לא מופעלת אם השלמות של
instance.imgנפגמת.אפשר לגזור את רשת האישורים של DICE ואת מזהי המכשיר המורכבים (CDI) שמועברים למופע pVM רק מהמופע הספציפי הזה.
מערכת הפעלה אורחת
Microdroid היא דוגמה למערכת הפעלה שפועלת בתוך pVM. Microdroid מורכב מתוכנת אתחול מבוססת U-boot, GKI, קבוצת משנה של מרחב המשתמש של Android ומפעיל מטען ייעודי (payload). המאפיינים האלה נשמרים במקרה של פריצה בכל pVM, כולל המארח. מערכות הפעלה חלופיות שפועלות במכונה וירטואלית מוגנת (pVM) צריכות לספק מאפיינים דומים.
המערכת לא תפעיל את Microdroid אם לא ניתן לאמת את
boot.img,super.img,vbmeta.imgאוvbmeta\_system.img.אם אימות ה-APK ייכשל, מערכת Microdroid לא תאתחל.
אותו מופע של Microdroid לא יופעל גם אם ה-APK עודכן.
אם אחד מקובצי ה-APEX ייכשל באימות, מערכת Microdroid לא תופעל.
מערכת Microdroid לא תאתחל (או תאתחל עם מצב התחלתי נקי) אם
instance.imgישונה מחוץ ל-pVM של האורח.Microdroid מספק אימות לשרשרת האתחול.
כל שינוי (לא חתום) בתמונות הדיסק ששותפו עם מכונת ה-pVM של האורח גורם לשגיאת קלט/פלט בצד של מכונת ה-pVM.
אפשר לגזור את שרשרת האישורים של DICE ואת ה-CDI שסופקו למופע pVM רק מהמופע הספציפי הזה.
פעולות כתיבה לנפח אחסון מוצפן הן סודיות, אבל אין הגנה מפני חזרה למצב קודם ברמת הפירוט של בלוק הצפנה. בנוסף, שיבוש חיצוני שרירותי אחר של בלוק נתונים גורם לבלוק להופיע כנתונים לא רלוונטיים ל-Microdroid, במקום להיות מזוהה באופן מפורש כשגיאת קלט/פלט.
Android
אלה מאפיינים שמערכת Android מתחזקת כמארחת, אבל הם לא תקפים במקרה של פריצה למארח:
מכונת pVM אורחת לא יכולה ליצור אינטראקציה ישירה (למשל, ליצור חיבור) עם מכונות pVM אורחות אחרות.
vsockרק
VirtualizationServiceבמכונה הווירטואלית המארחת יכול ליצור ערוץ תקשורת למכונה וירטואלית.רק אפליקציות שנחתמו באמצעות מפתח הפלטפורמה יכולות לבקש הרשאה ליצור מכונות pVM, להיות הבעלים שלהן או לבצע אינטראקציה איתן.
המזהה, שנקרא מזהה הקשר (CID), שמשמש להגדרת חיבורים של
vsockבין המארח לבין ה-pVM, לא נעשה בו שימוש חוזר כשה-pVM של המארח פועל. לדוגמה, אי אפשר להחליף מכונת pVM פעילה במכונה אחרת.
זמינות
בהקשר של pVMs, זמינות מתייחסת להקצאת משאבים מספיקים על ידי המארח לאורחים, כדי שהאורחים יוכלו לבצע את המשימות שהם מיועדים לבצע.
האחריות של המארח כוללת תזמון של מעבדים וירטואליים של מכונת pVM. בניגוד ל-hypervisors רגילים מסוג 1 (כמו Xen), KVM מקבל החלטה עיצובית מפורשת להעביר את תזמון עומסי העבודה לליבת המארח. בהתחשב בגודל ובמורכבות של מתזמני הפעולות של היום, החלטת התכנון הזו מצמצמת באופן משמעותי את הגודל של בסיס המחשוב המהימן (TCB) ומאפשרת למארח לקבל החלטות תזמון מושכלות יותר כדי לייעל את הביצועים. עם זאת, מארח זדוני יכול לבחור שלא לתזמן אורח אף פעם.
באופן דומה, pKVM גם מעביר את הטיפול בהפסקות פיזיות לליבת המארח כדי לצמצם את המורכבות של ההיפר-ויזור, ולהשאיר את המארח אחראי על התזמון. אנחנו משקיעים מאמצים כדי לוודא שהעברה של הפרעות לאורח תגרום רק לדחיית בקשה (מספר קטן מדי, מספר גדול מדי או ניתוב שגוי של הפרעות).
לבסוף, תהליך הניטור של המכונה הווירטואלית (VMM) של המארח אחראי להקצאת זיכרון ולמתן מכשירים וירטואליים, כמו כרטיס רשת. מנהל מכונות וירטואליות זדוני יכול למנוע ממשאבים להגיע אל האורח.
למרות ש-pKVM לא מספק זמינות לאורחים, העיצוב מגן על הזמינות של המארח מפני אורחים זדוניים, כי המארח תמיד יכול להקדים או לסיים את האורח ולשחזר את המשאבים שלו.
הפעלה מאובטחת
הנתונים מקושרים למופעים של מכונה וירטואלית פרטית, ואתחול מאובטח מבטיח שאפשר לשלוט בגישה לנתונים של מופע. באתחול הראשון של מופע, הוא מוקצה על ידי יצירה אקראית של מלח סודי עבור ה-pVM וחילוץ פרטים, כמו מפתחות ציבוריים וגיבובים לאימות, מהתמונות שנטענו. המידע הזה משמש לאימות של אתחולים עוקבים של מופע pVM, כדי לוודא שהסודות של המופע נחשפים רק לקובצי אימג' שעברו את האימות. התהליך הזה מתרחש בכל שלב טעינה בתוך ה-pVM: קושחת ה-pVM, pVM ABL, Microdroid וכן הלאה.
DICE מספק לכל שלב טעינה זוג מפתחות אימות, והחלק הציבורי שלהם מאומת באישור DICE של אותו שלב. זוג המפתחות הזה יכול להשתנות בין הפעלות, ולכן נגזר גם סוד איטום שהוא יציב עבור מופע המכונה הווירטואלית בין הפעלות מחדש, ולכן מתאים להגנה על מצב מתמשך. הסוד של החתימה חשוב מאוד למכונה הווירטואלית, ולכן לא מומלץ להשתמש בו ישירות. במקום זאת, מפתחות האיטום צריכים להיות נגזרים מסוד האיטום, וסוד האיטום צריך להיות מושמד מוקדם ככל האפשר.
כל שלב מעביר אובייקט CBOR מקודד באופן דטרמיניסטי לשלב הבא. האובייקט הזה מכיל סודות ואת שרשרת האישורים של DICE, שמכילה מידע מצטבר על הסטטוס, כמו האם השלב האחרון נטען בצורה מאובטחת.
מכשירים לא נעולים
כשמכשיר נפתח באמצעות fastboot oem unlock, נתוני המשתמש מאופסים.
התהליך הזה מגן על נתוני המשתמשים מפני גישה לא מורשית. גם נתונים שפרטיים ל-pVM יבוטלו כשהמכשיר ייפתח.
אחרי ביטול הנעילה, הבעלים של המכשיר יכולים להפעיל מחדש מחיצות שמוגנות בדרך כלל על ידי אתחול מאומת, כולל המחיצות שמכילות את pvmfw ואת ההטמעה של pKVM. לכן, מכשיר לא נעול לא נחשב מהימן לשמירה על מודל האבטחה של pVM.
צדדים מרוחקים יכולים לראות את המצב הזה, שעלול להיות לא מאובטח, על ידי בדיקה של מצב ההפעלה המאומת של המכשיר באישור אימות המפתח.