Security-Enhanced Linux ב-Android

כחלק מ מודל האבטחה של Android, מערכת Android משתמשת ב-Security-Enhanced Linux‏ (SELinux) כדי לאכוף בקרת גישה חובה (MAC) על כל התהליכים, גם על תהליכים שפועלים עם הרשאות root/superuser (יכולות Linux). חברות וארגונים רבים תרמו להטמעת SELinux ב-Android. בעזרת SELinux, מערכת Android יכולה להגן טוב יותר על שירותי המערכת ולהגביל אותם, לשלוט בגישה לנתוני האפליקציות וליומני המערכת, לצמצם את ההשפעות של תוכנות זדוניות ולהגן על המשתמשים מפני פגמים פוטנציאליים בקוד במכשירים ניידים.

SELinux פועל לפי העיקרון של דחייה כברירת מחדל: כל מה שלא מורשה באופן מפורש נדחה. ל-SELinux יש שני מצבים גלובליים:

  • מצב Permissive, שבו דחיית הרשאות מתועדת ביומן אבל לא נאכפת.
  • מצב אכיפה, שבו דחיית הרשאות מתועדת וגם נאכפת.

Android כולל את SELinux במצב אכיפה ומדיניות אבטחה תואמת שפועלת כברירת מחדל ב-AOSP. במצב אכיפה, הפעולות שאסור לבצע נמנעות וכל ניסיונות ההפרה מתועדים ביומן על ידי הליבה ב-dmesg וב-logcat. במהלך הפיתוח, כדאי להשתמש בשגיאות האלה כדי לשפר את התוכנה ואת כללי המדיניות של SELinux לפני האכיפה שלהם. פרטים נוספים זמינים במאמר הטמעת SELinux.

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

רקע

מודל האבטחה של Android מבוסס בחלקו על המושג של ארגזי חול לאפליקציות. כל אפליקציה פועלת בארגז חול משלה. לפני Android 4.3, ארגזים חוליים כאלה הוגדרו על ידי יצירת UID ייחודי של Linux לכל אפליקציה בזמן ההתקנה. ב-Android 4.3 ואילך נעשה שימוש ב-SELinux כדי להגדיר בצורה מדויקת יותר את הגבולות של ארגז החול לאפליקציות ב-Android.

ב-Android מגרסה 5.0 ואילך, אכיפת SELinux היא מלאה, על סמך הגרסה המאפשרת של Android 4.3 והאכיפה החלקית של Android 4.4. בעקבות השינוי הזה, מערכת Android עברה מאכיפה בקבוצה מוגבלת של דומיינים חיוניים (installd, ‏ netd, ‏ vold ו-zygote) לאכיפה בכל הדומיינים (יותר מ-60 דומיינים). פרטים נוספים:

  • כל הדברים נמצאים במצב אכיפה ב-Android מגרסה 5.x ואילך.
  • אסור להריץ בדומיין init תהליכים אחרים מלבד init.
  • דחייה גנרית כלשהי (block_device,‏ socket_device, ‏ default_service) מציינת שהמכשיר צריך דומיין מיוחד.

בגרסה 6.0 של Android, המערכת עוברת תהליך הקשחה על ידי צמצום הרשאות הגישה של המדיניות שלנו, כך שתכלול בידוד טוב יותר בין משתמשים, סינון IOCTL, הפחתת האיום של שירותים חשופים, הידוק נוסף של דומיינים של SELinux וגישה מוגבלת מאוד ל-/proc.

ב-Android 7.0 עודכנו ההגדרות של SELinux כדי לנעול עוד יותר את ארגז החול של האפליקציה ולצמצם את שטח ההתקפה. במהדורה הזו גם פצלנו את מחסנית mediaserver המונוליטית לתהליכים קטנים יותר כדי לצמצם את היקף ההרשאות שלהם. פרטים נוספים זמינים במאמרים הגנה על Android באמצעות עוד אמצעי הגנה בליבה של Linux והקשחת סטאק המדיה.

ב-Android 8.0 עודכנו רכיבי SELinux כך שיוכלו לפעול עם Treble, שמפריד את קוד הספק ברמה הנמוכה יותר מסביבת המערכת של Android. במהדורה הזו עודכנו כללי המדיניות של SELinux כדי לאפשר ליצרני מכשירים ולספקי SOC לעדכן את החלקים שלהם במדיניות, ליצור את התמונות שלהם (vendor.img,‏ boot.img וכו') ולאחר מכן לעדכן את התמונות האלה בנפרד מהפלטפורמה, ולהפך.

אפשר להשתמש במכשיר בגרסה מתקדמת יותר של פלטפורמה (מסגרת), אבל לא בגרסה ישנה יותר. לא ניתן להשתמש בתמונות של הספק (vendor.img/odm.img) בגרסה מתקדמת יותר מזו של הפלטפורמה (system.img). לכן, גרסה מתקדמת יותר של הפלטפורמה עלולה לגרום לבעיות תאימות ב-SELinux, כי מדיניות SELinux של הפלטפורמה היא בגרסה מתקדמת יותר מחלקי המדיניות של SELinux של הספק. המודל של Android 8.0 מספק שיטה לשמירה על תאימות כדי למנוע עדכוני OTA בו-זמניים מיותרים.

מקורות מידע נוספים

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