כדי למנוע הפעלה של עומסי עבודה שרירותיים בתוך pVM, Android Virtualization Framework (AVF) משתמש בגישה של אבטחה בשכבות, שבה כל שכבה מוסיפה אכיפה נוספת. ריכזנו כאן רשימה של שכבות האבטחה של AVF:
Android מבטיח שרק האפליקציות עם הרשאות pVM יוכלו ליצור או לבדוק מכונות pVM.
Bootloader – ה-bootloader מוודא שרק קובצי אימג' של pVM שנחתמו על ידי Google או על ידי ספקי המכשירים מורשים להפעיל את המכשיר, ופועל בהתאם לפרוצדורה של Android Verified Boot. הארכיטקטורה הזו מחייבת שאפליקציות שפועלות ב-pVM לא יכולות לקבץ לעצמן ליבות.
pVM מספק הגנה לעומס עבודה (payload) שפועל ב-pVM, למשל באמצעות SELinux. הגנה לעומק אוסרת על מיפוי נתונים כקובץ הפעלה (
neverallow execmem
) ומוודאת שW^X תקף לכל סוגי הקבצים.
מודל אבטחה
הסודיות, התקינות והזמינות (משולש ה-CIA) הם מודל שמיועד להנחות את כללי המדיניות לאבטחת מידע:
- סודיות היא קבוצת כללים שמגבילה את הגישה למידע.
- תקינות היא הביטחון שהמידע מהימן ומדויק.
- זמינות היא הבטחה לגישה מהימנה למידע על ידי ישויות מורשות.
סודיות ותקינות
האפשרות סודיות נובעת ממאפייני בידוד הזיכרון שאוכפים על ידי pKVM hypervisor. pKVM עוקבת אחרי בעלות הזיכרון על דפי זיכרון פיזיים נפרדים ואחרי כל בקשה מהבעלים לשיתוף דפים. באמצעות pKVM אפשר לוודא שרק ל-pVMs זכאים (מארח ואורחים) ממופה הדף הנתון בטבלאות הדפים של שלב 2 שנשלטות על ידי hypervisor. הארכיטקטורה הזו שומרת על הפרטיות של תוכן הזיכרון שבבעלות pVM, אלא אם הבעלים ישתף אותו באופן מפורש עם pVM אחר.
ההגבלות לשמירה על הסודיות חלות גם על כל ישות במערכת שמבצעת גישה לזיכרון מטעם מכונות וירטואליות פרטיות (pVM), כלומר מכשירי DMA ושירותים שפועלים בשכבות עם הרשאות גבוהות יותר. ספקי מעבדים (SoC) צריכים לעמוד בדרישות חדשות כדי שיוכלו לתמוך ב-pKVM. אם לא, לא ניתן לספק סודיות.
תקינות חלה על נתונים בזיכרון וגם על חישוב. מכונות pVM לא יכולות:
- לשנות את הזכרונות של האחרים ללא הסכמה.
- להשפיע על מצב ה-CPU של כל אחת מהן.
הדרישות האלה נאכפות על ידי hypervisor. עם זאת, בעיות שקשורות לתקינות הנתונים מתרחשות גם באחסון נתונים וירטואליים כשצריך להחיל פתרונות אחרים, כמו dm-verity או AuthFS.
העקרונות האלה לא שונים מבידוד התהליכים ב-Linux, שבו הגישה לדפי זיכרון נשלטת באמצעות טבלאות דפים בשלב 1 והעברת ההקשר בין תהליכים בליבה (kernel). עם זאת, לחלק EL2 של pKVM, שמאכסה את המאפיינים האלה, יש שטח התקפה קטן פי שלושה בהשוואה לליבת Linux כולה (כ-10,000 שורות קוד לעומת 20 מיליון שורות קוד), ולכן הוא מספק ביטחון חזק יותר בתרחישי שימוש שהם רגישים מדי כדי להסתמך על בידוד תהליכים.
בגלל הגודל שלו, ה-pKVM מתאים לאימות פורמלי. אנחנו תומכים באופן פעיל במחקר אקדמי שמטרתו להוכיח באופן רשמי את המאפיינים האלה בקוד הבינארי בפועל של pKVM.
בהמשך הדף נסביר על ההתחייבויות לסודיות ולתקינות שכל רכיב מסביב ל-pKVM מספק.
hypervisor
pKVM הוא hypervisor מבוסס-KVM שמבודד מכונות pVM ו-Android בסביבות מחשוב לא מהימנות זו לזו. המאפיינים האלה תקפים במקרה של פגיעה בכל מכונה וירטואלית, כולל המארח. למכונות וירטואליות חלופיות שתואמות ל-AVF צריכים להיות מאפיינים דומים.
ל-pVM אין גישה לדף ששייך לישות אחרת, כמו pVM או hypervisor, אלא אם הבעלים של הדף משתף אותו באופן מפורש. הכלל הזה כולל את ה-pVM המארח חל גם על גישה ל-CPU וגם על גישה ל-DMA.
לפני שדף שמשמש את ה-pVM מוחזר למארח, למשל כשה-pVM נהרס, הוא נמחק.
הזיכרון של כל ה-pVM ותוכנת הקושחה של ה-pVM מאתחול אחד של המכשיר נמחקים לפני שתוכנת האתחול של מערכת ההפעלה פועלת באתחול הבא של המכשיר.
כשמחוברת תכונת ניפוי באגים בחומרה, כמו SJTAG, ל-pVM אין גישה למפתחות שהונפקו בעבר.
קושחת ה-pVM לא תופעל אם היא לא תוכל לאמת את התמונה הראשונית.
קושחת ה-pVM לא תופעל אם תהיה פגיעה בתקינות של
instance.img
.רק המכונה הספציפית יכולה להפיק את רשת האישורים של DICE ואת מזהי המכשירים המשולבים (CDIs) שסופקו למכונה הווירטואלית.
מערכת הפעלה לאורחים
Microdroid הוא דוגמה למערכת הפעלה שפועלת בתוך pVM. Microdroid מורכב מאתחול מבוסס-U-boot, מ-GKI, מקבוצת משנה של מרחב המשתמש של Android וממרכז הפעלה של מטען יעיל. המאפיינים האלו נשמרים במקרה של פריצה בכל pVM, כולל המארח. מערכות הפעלה חלופיות שפועלות ב-pVM אמורות לספק מאפיינים דומים.
Microdroid לא יתעדכן אם לא ניתן לאמת את
boot.img
,super.img
,vbmeta.img
אוvbmeta\_system.img
.אם אימות ה-APK ייכשל, Microdroid לא יופעל.
אותה מכונה של Microdroid לא תופעל גם אם ה-APK עודכן.
Microdroid לא יופעל אם אחת מ-APEXes נכשלת באימות.
המיקרו-דרום לא יופעל (או לא יבצע אתחול במצב ראשוני נקי) אם יהיה שינוי ב-
instance.img
מחוץ ל-pVM של האורח.Microdroid מספק אימות לרשת האתחול.
כל שינוי (ללא חתימה) בתמונות הדיסק ששותפו עם ה-pVM של האורח גורם לשגיאת קלט/פלט בצד ה-pVM.
רק המכונה הספציפית יכולה להפיק את שרשרת האישורים וה-CDIs של DICE שסופקו למכונה הווירטואלית.
כתיבה בנפח אחסון מוצפן היא סודית, אבל אין הגנה מפני החזרה ברמת פירוט של בלוק הצפנה. בנוסף, פגיעה חיצונית שרירותית אחרת בבלוק נתונים גורמת לכך שהבלוק הזה יופיע כזבל ב-Microdroid, במקום שיזוהה באופן מפורש כשגיאת קלט/פלט.
Android
אלה מאפיינים שנשמרים על ידי Android בתור המארח, אבל לא תקפים במקרה של פריצה למארח:
מכונה וירטואלית אורחת לא יכולה לקיים אינטראקציה ישירה עם מכונות וירטואליות אורחות אחרות (למשל, ליצור
vsock
חיבור).רק ה-
VirtualizationService
ב-pVM של המארח יכול ליצור ערוץ תקשורת ל-pVM.רק האפליקציות שחתומות באמצעות מפתח הפלטפורמה יכולות לבקש הרשאה ליצור מכונות וירטואליות פרטיות, להיות הבעלים שלהן או לבצע איתן אינטראקציה.
המזהה, שנקרא מזהה הקשר (CID), משמש להגדרת חיבורי
vsock
בין המארח ל-pVM, ולא נעשה בו שימוש חוזר כש-pVM המארח פועל. לדוגמה, אי אפשר להחליף מכונה וירטואלית שפועלת ב-pVM אחרת.
זמינות
בהקשר של מכונות וירטואליות של אורחים, זמינות מתייחסת לחלוקת משאבים מספקת על ידי המארח לאורחים, כדי שהאורחים יוכלו לבצע את המשימות שהם נועדו לבצע.
בין האחריות של המארח נכללת תזמון של מעבדי ה-CPU הווירטואליים של ה-pVM. בניגוד למערכות ה-hypervisor הרגילות מסוג 1 (כמו Xen), ב-KVM הוחלט במפורש להקצות את תזמון עומסי העבודה לליבה של המארח. בגלל הגודל והמורכבות של מתזמן המשימות של היום, החלטת התכנון הזו מפחיתה באופן משמעותי את גודל בסיס המחשוב המהימן (TCB) ומאפשרת למארח לקבל החלטות מתוכננות יותר לגבי תזמון כדי לבצע אופטימיזציה של הביצועים. עם זאת, מארח זדוני יכול לבחור לא לקבוע אף פעם פגישה עם אורח.
באופן דומה, pKVM גם מאציל את הטיפול בהפרעות פיזיות לליבה של המארח כדי להפחית את המורכבות של hypervisor ולהשאיר את המארח אחראי על התזמון. אנחנו משקיעים מאמצים כדי לוודא שההעברה של השיבושים של האורחים תגרום רק להתקפת מניעת שירות (DDoS) (מעט מדי שיבושים, יותר מדי שיבושים או שיבושים שהועברו ליעדים שגויים).
לבסוף, תהליך המכונה הווירטואלית (VMM) של המארח אחראי להקצאת זיכרון ולמתן מכשירים וירטואליים, כמו כרטיס רשת. VMM זדוני יכול להסתיר משאבים מהאורח.
למרות ש-pKVM לא מספק זמינות לאורחים, העיצוב מגן על הזמינות של המארח מפני אורחים זדוניים, כי המארח תמיד יכול לבטל או לסיים את הפעילות של אורח ולשחרר את המשאבים שלו.
הפעלה מאובטחת
הנתונים קשורים למכונות של pVM, והפעלה מאובטחת מבטיחה שאפשר לשלוט בגישה לנתונים של המכונה. האתחול הראשון של מכונה מקצה אותה באופן אקראי ליצירה אקראית של ערך salt סודי ל-pVM וחילוץ פרטים, כמו אימות מפתחות ציבוריים וגיבובים, מהתמונות שנטענו. המידע הזה משמש לאימות אתחולים הבאים של המכונה הווירטואלית המוגנת, וכדי לוודא שהסודות של המכונה ייחשפו רק לאימג'ים שעברו אימות. התהליך הזה מתרחש בכל שלב טעינה ב-pVM: קושחת pVM, pVM ABL, Microdroid וכו'.
DICE מספק לכל שלב טעינה זוג מפתחות לאימות, והחלק הציבורי שלהם מאושר באישור DICE של השלב הזה. צמד המפתחות הזה יכול להשתנות בין אתחולים, ולכן נגזר גם סוד חותמת שהוא יציב במכונה הווירטואלית במהלך הפעלות מחדש, ולכן מתאים להגנה על מצב מתמיד. הסוד לצורך החתימה הוא בעל ערך רב למכונה הווירטואלית, ולכן אסור להשתמש בו ישירות. במקום זאת, צריך להפיק מפתחות חותמת מהסוד לחתימה, ולהשמיד את הסוד לחתימה מוקדם ככל האפשר.
כל שלב שולח לשלב הבא אובייקט CBOR עם קידוד דטרמיני. האובייקט הזה מכיל סודות ורשת האישורים של DICE, שמכילה מידע מצטבר על הסטטוס, למשל אם השלב האחרון נטען בצורה מאובטחת.
מכשירים ללא נעילת הצפנה
כשמנעילים את המכשיר באמצעות fastboot oem unlock
, נתוני המשתמש נמחקים.
התהליך הזה מגן על נתוני המשתמשים מפני גישה לא מורשית. גם נתונים פרטיים של מכונה וירטואלית פרטית (pVM) לא תקפים אחרי ביטול הנעילה של המכשיר.
אחרי ביטול הנעילה, הבעלים של המכשיר יכולים לבצע מחיקת נתונים (flash) מחדש של מחיצות שבדרך כלל מוגנות באמצעות אתחול מאומת, כולל המחיצות שמכילות את ההטמעה של pKVM. לכן, לא ניתן יהיה לסמוך על pKVM במכשיר לא נעול כדי לשמור על מודל האבטחה.
צדדים מרוחקים יכולים לזהות את המצב הלא מאובטח הזה על ידי בדיקת מצב ההפעלה המאומתת של המכשיר באישור אימות המפתח.