בדף הזה מוסבר איך מערכת Android מטפלת בבעיות תאימות למדיניות בעדכונים של הפלטפורמה דרך האוויר (OTA), שבהם הגדרות SELinux חדשות של הפלטפורמה עשויות להיות שונות מהגדרות SELinux ישנות של הספק.
בעלות על אובייקטים ותיוג שלהם
צריך להגדיר בבירור את הבעלות על כל אובייקט כדי להפריד בין המדיניות של הפלטפורמה לבין המדיניות של הספק. לדוגמה, אם תוויות מדיניות הספק /dev/foo ותוויות מדיניות הפלטפורמה /dev/foo מופיעות בעדכון OTA עוקב, תהיה התנהגות לא מוגדרת כמו דחייה לא צפויה, או גרוע מכך, כשל באתחול. ב-SELinux, זה מתבטא בהתנגשות של תוויות. לצומת device יכולה להיות רק תווית אחת, שמוגדרת לתווית האחרונה שמוחלת.
כתוצאה מכך:
- תהליכים שזקוקים לגישה לתווית שלא הוחלה בהצלחה מאבדים את הגישה למשאב.
- תהליכים שמקבלים גישה לקובץ עלולים להיכשל כי נוצר צומת מכשיר שגוי.
התנגשויות בין תוויות של פלטפורמה לבין תוויות של ספק יכולות להתרחש בכל אובייקט שיש לו תווית SELinux, כולל מאפיינים, שירותים, תהליכים, קבצים ושקעים. כדי להימנע מהבעיות האלה, צריך להגדיר בבירור את הבעלות על האובייקטים האלה.
הוספת מרחב שמות לסוגים או למאפיינים
בנוסף להתנגשויות בין תוויות, יכולות להיות גם התנגשויות בין שמות של סוגים ומאפיינים ב-SELinux. SELinux לא מאפשר הצהרות מרובות של אותם סוגים ומאפיינים. קומפילציה של מדיניות עם הצהרות כפולות נכשלת. כדי להימנע מהתנגשויות בין סוגים ושמות של מאפיינים, מומלץ מאוד שכל הצהרות הספקים יתחילו בקידומת vendor_. לדוגמה, ספקים צריכים להשתמש ב-type vendor_foo, domain; במקום ב-type foo, domain;.
הבעלות על הקובץ
קשה למנוע התנגשויות בקבצים כי המדיניות של הפלטפורמה ושל הספק מספקת בדרך כלל תוויות לכל מערכות הקבצים. בניגוד לשמות של סוגים, לא מעשי להשתמש במרחבי שמות לקבצים, כי הרבה מהם נוצרים על ידי ליבת המערכת. כדי למנוע התנגשויות כאלה, כדאי לפעול לפי ההנחיות למתן שמות למערכות קבצים שמפורטות בקטע הזה. ב-Android מגרסה 8.0, אלה המלצות ללא אכיפה טכנית. בעתיד, ההמלצות האלה ייאכפו על ידי חבילת הבדיקות של הספקים (VTS).
מערכת (/system)
רק תמונת המערכת צריכה לספק תוויות לרכיבים /system עד file_contexts, service_contexts וכו'. אם מוסיפים תוויות לרכיבים /system במדיניות הספק, יכול להיות שעדכון OTA רק של המסגרת לא יתאפשר.
ספק (/vendor)
מדיניות SELinux של AOSP כבר מתייגת חלקים של מחיצת vendor
שהפלטפורמה מקיימת איתה אינטראקציה, מה שמאפשר לכתוב כללי SELinux לתהליכי פלטפורמה כדי שיוכלו לתקשר עם חלקים של מחיצת vendor
או לגשת אליהם. לדוגמה:
| /vendor path | תווית שסופקה על ידי הפלטפורמה | תהליכי הפלטפורמה בהתאם לתווית |
|---|---|---|
/vendor(/.*)?
|
vendor_file
|
כל לקוחות ה-HAL ב-framework, ueventd וכו'.
|
/vendor/framework(/.*)?
|
vendor_framework_file
|
dex2oat, appdomain וכו'.
|
/vendor/app(/.*)?
|
vendor_app_file
|
dex2oat, installd, idmap וכו'.
|
/vendor/overlay(/.*)
|
vendor_overlay_file
|
system_server, zygote, idmap וכו'.
|
לכן, כשמתייגים קבצים נוספים במחיצה vendor, צריך לפעול לפי כללים ספציפיים (שנאכפים באמצעות neverallows):
vendor_fileחייבת להיות התווית שמוגדרת כברירת מחדל לכל הקבצים במחיצהvendor. מדיניות הפלטפורמה מחייבת את זה כדי לגשת להטמעות של HAL passthrough.- לכל
exec_typesחדש שנוסף במחיצהvendorדרך מדיניות הספק צריך להיות מאפייןvendor_file_type. האכיפה מתבצעת באמצעות neverallows. - כדי למנוע התנגשויות עם עדכונים עתידיים של פלטפורמות או מסגרות, אל תתייגו קבצים אחרים מלבד
exec_typesבמחיצהvendor. - כל התלות בספריות עבור HALs באותו תהליך שזוהו ב-AOSP צריכה להיות מסומנת בתווית
same_process_hal_file.
Procfs (/proc)
אפשר להוסיף תוויות לקבצים ב-/proc רק באמצעות התווית genfscon
label. ב-Android 7.0, גם המדיניות של הפלטפורמה וגם המדיניות של הספק השתמשו ב-genfscon כדי לתייג קבצים ב-procfs.
המלצה: רק תוויות של מדיניות הפלטפורמה /proc.
אם לספק יש צורך לגשת לקבצים ב-/proc שכרגע מסומנים בתווית ברירת המחדל (proc), מדיניות הספק לא צריכה לסמן אותם באופן מפורש, אלא להשתמש בסוג הכללי proc כדי להוסיף כללים לדומיינים של הספק. כך עדכוני הפלטפורמה יוכלו להתאים לממשקי ליבה עתידיים שנחשפים דרך procfs ולסמן אותם באופן מפורש לפי הצורך.
Debugfs (/sys/kernel/debug)
אפשר לתייג את Debugfs גם ב-file_contexts וגם ב-genfscon. ב-Android מגרסה 7.0 עד גרסה 10, התווית של הפלטפורמה וגם התווית של הספק
debugfs.
ב-Android 11, אי אפשר לגשת אל debugfs או לטעון אותו במכשירי ייצור. יצרני המכשירים צריכים להסיר את debugfs.
Tracefs (/sys/kernel/debug/tracing)
אפשר לתייג את Tracefs גם ב-file_contexts וגם ב-genfscon. ב-Android 7.0, רק תוויות הפלטפורמה tracefs.
המלצה: רק הפלטפורמה יכולה להוסיף את התווית tracefs.
Sysfs (/sys)
אפשר להוסיף תוויות לקבצים ב-/sys באמצעות file_contexts וגם באמצעות genfscon. ב-Android 7.0, גם הפלטפורמה וגם הספק משתמשים ב-genfscon כדי לתייג קבצים ב-sysfs.
המלצה: יכול להיות שהפלטפורמה תסמן צמתי sysfs
שאינם ספציפיים למכשיר. אחרת, רק ספקים יכולים להוסיף תוויות לקבצים.
tmpfs (/dev)
יכול להיות שקבצים ב-/dev יסומנו בתווית ב-file_contexts. ב-Android 7.0, קובצי התוויות של הפלטפורמה ושל הספק נמצאים כאן.
המלצה: יכול להיות שהספק יסמן רק קבצים ב-/dev/vendor (לדוגמה, /dev/vendor/foo, /dev/vendor/socket/bar).
Rootfs (/)
יכול להיות שקבצים ב-/ יסומנו בתווית ב-file_contexts. ב-Android 7.0, קובצי התוויות של הפלטפורמה והספק נמצאים כאן.
המלצה: רק המערכת יכולה להוסיף תוויות לקבצים ב-/.
נתונים (/data)
הנתונים מתויגים באמצעות שילוב של file_contexts ושל seapp_contexts.
המלצה: לא לאפשר לספקים להוסיף תוויות מחוץ ל-/data/vendor. רק הפלטפורמה יכולה לתייג חלקים אחרים של /data.
גרסת תוויות Genfs
החל מרמת vendor API 202504, תוויות SELinux חדשות יותר שהוקצו באמצעות genfscon ב-system/sepolicy/compat/plat_sepolicy_genfs_ver.cil הן אופציונליות למחיצות ישנות יותר של vendor. כך מחיצות ישנות יותר של vendor יכולות לשמור על ההטמעה הקיימת של SEPolicy.
השליטה בכך מתבצעת באמצעות המשתנה BOARD_GENFS_LABELS_VERSION בקובץ /vendor/etc/selinux/genfs_labels_version.txt.
דוגמה:
-
ב-API של הספק ברמה 202404, הצומת
/sys/class/udcמסומן כ-sysfsכברירת מחדל. -
החל מרמת ספק API 202504, התווית של
/sys/class/udcהיאsysfs_udc.sysfs_udc.
עם זאת, יכול להיות שהמחיצות /sys/class/udc נמצאות בשימוש ב-API ברמה 202404, עם התווית sysfs שמוגדרת כברירת מחדל או עם תווית ספציפית לספק.vendor הוספת התווית sysfs_udc ל-/sys/class/udc ללא תנאי עלולה לפגוע בתאימות למחיצות vendor האלה. אם מסמנים את התיבה BOARD_GENFS_LABELS_VERSION, הפלטפורמה ממשיכה להשתמש בתוויות ובהרשאות הקודמות למחיצות הישנות יותר של vendor.
הערך של BOARD_GENFS_LABELS_VERSION יכול להיות גדול או שווה לרמת ה-API של הספק. לדוגמה, vendor מחיצות שמשתמשות ברמת API 202404 יכולות להגדיר את BOARD_GENFS_LABELS_VERSION ל-202504 כדי להשתמש בתוויות חדשות שהוצגו ב-202504.
רשימת תוויות GenFS ספציפיות ל-202504
כשמתייגים צמתים של genfscon, הפלטפורמה צריכה להתחשב במחיצות ישנות יותר של vendor ולהטמיע מנגנוני חזרה לתאימות כשצריך. הפלטפורמה יכולה להשתמש בספריות שפועלות רק בפלטפורמה כדי לשלוח שאילתות לגבי גרסת התוויות של genfs.
-
במודעות מותאמות, צריך להשתמש ב-
libgenfslabelsversion. למידע על קובץ הכותרת שלlibgenfslabelsversion, ראוgenfslabelsversion.h. -
ב-Java, משתמשים ב-
android.os.SELinux.getGenfsLabelsVersion().
מדיניות ציבורית של פלטפורמה
מדיניות SELinux של הפלטפורמה מחולקת לפרטית ולציבורית. מדיניות הפלטפורמה הציבורית מורכבת מסוגים וממאפיינים שתמיד זמינים ברמת ספק API, ומשמשת כ-API בין הפלטפורמה לספק. המדיניות הזו מוצגת לכותבי מדיניות של ספקים כדי לאפשר להם ליצור קובצי מדיניות של ספקים. כשמשלבים את קובצי המדיניות האלה עם המדיניות הפרטית של הפלטפורמה, מתקבלת מדיניות מתפקדת באופן מלא למכשיר. מדיניות הפלטפורמה לציבור מוגדרת ב-system/sepolicy/public.
לדוגמה, סוג vendor_init, שמייצג את תהליך האתחול בהקשר של ספק, מוגדר בקטע system/sepolicy/public/vendor_init.te:
type vendor_init, domain;
ספקים יכולים להשתמש בסוג vendor_init כדי לכתוב כללי מדיניות בהתאמה אישית:
# Allow vendor_init to set vendor_audio_prop in vendor's init scripts
set_prop(vendor_init, vendor_audio_prop)מאפייני תאימות
מדיניות SELinux היא אינטראקציה בין סוגי מקור וסוגי יעד עבור מחלקות אובייקטים והרשאות ספציפיות. לכל אובייקט (לדוגמה, תהליכים, קבצים) שמושפע ממדיניות SELinux יכול להיות רק סוג אחד, אבל לסוג הזה יכולים להיות כמה מאפיינים.
המדיניות כתובה בעיקר במונחים של סוגים קיימים. בדוגמה הזו, גם vendor_init וגם debugfs הם סוגים:
allow vendor_init debugfs:dir { mounton };
השיטה הזו עובדת כי המדיניות נכתבה על סמך ידע בכל הסוגים. עם זאת, אם במדיניות הספק ובמדיניות הפלטפורמה נעשה שימוש בסוגים ספציפיים, והתווית של אובייקט ספציפי משתנה רק באחת מהמדיניות האלה, יכול להיות שהמדיניות השנייה תכיל מדיניות שקיבלה או איבדה גישה שהסתמכה עליה בעבר. לדוגמה, נניח שתוויות המדיניות של הפלטפורמה מסמנות צמתים של sysfs כ-sysfs:
/sys(/.*)? u:object_r:sysfs:s0
מדיניות הספק מעניקה גישה אל /sys/usb, שמסומן כ-sysfs:
allow vendor_init sysfs:chr_file rw_file_perms;
אם מדיניות הפלטפורמה משתנה לתווית /sys/usb בתור sysfs_usb, מדיניות הספק נשארת ללא שינוי, אבל vendor_init מאבדת את הגישה ל-/sys/usb בגלל היעדר מדיניות לסוג החדש sysfs_usb:
/sys/usb u:object_r:sysfs_usb:s0
כדי לפתור את הבעיה, ב-Android מוצג קונספט של מאפיינים עם גרסאות. בזמן ההידור, מערכת ה-Build מתרגמת באופן אוטומטי את הסוגים הציבוריים של הפלטפורמה שנעשה בהם שימוש במדיניות הספק למאפיינים האלה עם הגרסה. התרגום הזה מופעל על ידי מיפוי קבצים שמשייכים מאפיין עם ניהול גרסאות לסוג ציבורי אחד או יותר מהפלטפורמה.
לדוגמה, נניח שהמוצר /sys/usb מסומן בתווית sysfs במדיניות הפלטפורמה 202504, ומדיניות הספק 202504 מעניקה ל-vendor_init גישה ל-/sys/usb. במקרה כזה:
-
מדיניות הספק כותבת כלל
allow vendor_init sysfs:chr_file rw_file_perms;, כי/sys/usbמסומן בתוויתsysfsבמדיניות הפלטפורמה 202504. כשמערכת ה-build מבצעת קומפילציה של מדיניות הספק, היא מתרגמת אוטומטית את הכלל ל-allow vendor_init_202504 sysfs_202504:chr_file rw_file_perms;. המאפייניםvendor_init_202504ו-sysfs_202504תואמים לסוגיםvendor_initו-sysfs, שהם הסוגים שמוגדרים על ידי הפלטפורמה. -
מערכת ה-build יוצרת קובץ מיפוי זהויות
/system/etc/selinux/mapping/202504.cil. מכיוון שגם המחיצותsystemוגם המחיצותvendorמשתמשות באותה גרסה של202504, קובץ המיפוי מכיל מיפויי זהויות מ-type_202504ל-type. לדוגמה:vendor_init_202504ממופה ל-vendor_init, ו-sysfs_202504ממופה ל-sysfs:(typeattributeset sysfs_202504 (sysfs)) (typeattributeset vendor_init_202504 (vendor_init)) ...
כשהגרסה משתנה מ-202504 ל-202604, נוצר קובץ מיפוי חדש למחיצות 202504
vendor בתיקייה
system/sepolicy/private/compat/202504/202504.cil, שמותקן ב-/system/etc/selinux/mapping/202504.cil למחיצות 202604
או חדשות יותר system. בתחילה, קובץ המיפוי הזה מכיל מיפויי זהויות, כפי שתיארנו קודם. אם תווית חדשה sysfs_usb
בשביל /sys/usb תתווסף למדיניות הפלטפורמה 202604, קובץ המיפוי יעודכן כדי למפות את sysfs_202504 ל-sysfs_usb:
(typeattributeset sysfs_202504 (sysfs sysfs_usb)) (typeattributeset vendor_init_202504 (vendor_init)) ...
העדכון הזה מאפשר לכלל המדיניות של הספק שהומר allow
vendor_init_202504 sysfs_202504:chr_file rw_file_perms; להעניק באופן אוטומטי גישה לטיפוס החדש sysfs_usb.vendor_init
כדי לשמור על תאימות למחיצות vendor ישנות יותר, בכל פעם שמוסיפים סוג חדש של נתונים שגלויים לציבור, צריך למפות את הסוג הזה לפחות לאחד מהמאפיינים עם הגרסאות בקובץ המיפוי system/sepolicy/private/compat/ver/ver.cil, או לציין אותו בקטע system/sepolicy/private/compat/ver/ver.ignore.cil כדי לציין שאין סוג תואם בגרסאות הקודמות של הספק.
השילוב של מדיניות הפלטפורמה, מדיניות הספק וקובץ המיפוי מאפשר למערכת להתעדכן בלי לעדכן את מדיניות הספק. בנוסף, ההמרה למאפיינים עם מספור גרסאות מתבצעת באופן אוטומטי, כך שמדיניות הספק לא צריכה לטפל בניהול הגרסאות, והיא ממשיכה להשתמש בסוגים הציבוריים כמו שהם.
מדיניות ציבורית של מערכת_ext ומדיניות ציבורית של מוצרים
החל מ-Android 11, למחיצות system_ext ו-product מותר לייצא את הסוגים הציבוריים המיועדים שלהן למחיצה vendor. בדומה למדיניות הציבורית של הפלטפורמה, מדיניות הספק משתמשת בסוגים ובכללים שמתורגמים אוטומטית למאפיינים עם ניהול גרסאות. לדוגמה, מ-type ל-type_ver, כאשר ver הוא רמת ה-API של הספק במחיצה vendor.
אם המחיצות system_ext ו-product מבוססות על אותה גרסת פלטפורמה ver, מערכת ה-build יוצרת קובצי מיפוי בסיסיים ל-system_ext/etc/selinux/mapping/ver.cil ול-product/etc/selinux/mapping/ver.cil, שמכילים מיפויי זהות מ-type ל-type_ver.
ספק המדיניות יכול לגשת אל type באמצעות מאפיין עם גרסה type_ver.
אם רק המחיצות system_ext ו-product מתעדכנות, למשל מ-ver ל-ver+1 (או לגרסה מאוחרת יותר), בזמן שהמחיצה vendor נשארת בגרסה ver, יכול להיות שהמדיניות של הספק תאבד את הגישה לסוגים של המחיצות system_ext ו-product. כדי למנוע שבירה, מחיצות system_ext ו-product צריכות לספק קובצי מיפוי מסוגים קונקרטיים למאפייני type_ver. כל שותף אחראי לתחזוקת קובצי המיפוי, אם הוא תומך בחלוקת מחיצות של ver vendor עם ver+1 (או גרסה מתקדמת יותר) system_ext ומחיצות product.
כדי להתקין קובצי מיפוי במחיצות system_ext ו-product, יצרני מכשירים או ספקים צריכים:
- מעתיקים את קובצי מיפוי הבסיס שנוצרו מהמחיצות ver
system_extו-productאל עץ המקור שלהן. - משנים את קובצי המיפוי לפי הצורך.
-
מתקינים את קובצי המיפוי ב-ver+1 (או בגרסה מתקדמת יותר)
system_extובמחיצותproduct.
לדוגמה, נניח שלמחיצה 202504 system_ext יש סוג ציבורי אחד בשם foo_type. אחר כך
system_ext/etc/selinux/mapping/202504.cil
במחיצה 202504 system_ext זה נראה כך:
(typeattributeset foo_type_202504 (foo_type)) (expandtypeattribute foo_type_202504 true) (typeattribute foo_type_202504)
אם bar_type נוסף ל-202604 system_ext, ואם צריך למפות את bar_type ל-foo_type עבור המחיצה 202504vendor, אפשר לעדכן את 202504.cil מ-(typeattributeset foo_type_202504 (foo_type)) ל-(typeattributeset foo_type_202504 (foo_type bar_type)) ואז להתקין אותו במחיצה 202604 system_ext. מחיצת 202504
vendor יכולה להמשיך לגשת אל foo_type וbar_type של 202604
system_ext.
שינויים במאפיינים ב-Android 9
במכשירים שמשדרגים ל-Android 9 אפשר להשתמש במאפיינים הבאים, אבל במכשירים שמופעלים עם Android 9 אסור להשתמש בהם.
מאפיינים של מפרים
Android 9 כולל את המאפיינים הבאים שקשורים לדומיין:
-
data_between_core_and_vendor_violators. מאפיין לכל הדומיינים שלא עומדים בדרישה לא לשתף קבצים לפי נתיב ביןvendorלביןcoredomains. תהליכים של פלטפורמות וספקים לא צריכים להשתמש בקבצים בדיסק כדי לתקשר (ABI לא יציב). המלצה:- קוד הספק צריך להשתמש ב-
/data/vendor. - המערכת לא צריכה להשתמש ב-
/data/vendor.
- קוד הספק צריך להשתמש ב-
system_executes_vendor_violators. מאפיין לכל דומייני המערכת (מלבדinitו-shell domains) שמפירים את הדרישה שלא להפעיל קבצים בינאריים של ספקים. ההרצה של קבצים בינאריים של ספקים כוללת API לא יציב. הפלטפורמה לא אמורה להריץ קבצים בינאריים של ספקים באופן ישיר. המלצה:- יחסי תלות כאלה של פלטפורמות בקבצים בינאריים של ספקים חייבים להיות מאחורי HIDL HAL.
או
coredomainsשצריכים גישה לקבצים בינאריים של ספקים צריכים לעבור למחיצהvendorוכך להפסיק להיותcoredomain.
- יחסי תלות כאלה של פלטפורמות בקבצים בינאריים של ספקים חייבים להיות מאחורי HIDL HAL.
מאפיינים לא מהימנים
לאפליקציות לא מהימנות שמארחות קוד שרירותי לא צריכה להיות גישה לשירותי HwBinder, למעט לאפליקציות שנחשבות בטוחות מספיק לגישה מאפליקציות כאלה (ראו את רשימת השירותים הבטוחים בהמשך). יש שתי סיבות עיקריות לכך:
- שרתי HwBinder לא מבצעים אימות של לקוחות כי HIDL לא חושף כרגע מידע על מזהה המשתמש של המתקשר. גם אם HIDL היה חושף נתונים כאלה, הרבה שירותי HwBinder פועלים ברמה שמתחת לרמת האפליקציות (לדוגמה, HAL) או שלא יכולים להסתמך על זהות האפליקציה לצורך הרשאה. לכן, כדי להיות בטוחים, ההנחה שמוגדרת כברירת מחדל היא שכל שירות HwBinder מתייחס לכל הלקוחות שלו כבעלי הרשאה שווה לבצע פעולות שהשירות מציע.
- שרתי HAL (קבוצת משנה של שירותי HwBinder) מכילים קוד עם שיעור גבוה יותר של בעיות אבטחה בהשוואה לרכיבי
system/core, ויש להם גישה לשכבות הנמוכות יותר של המערך (עד לרמת החומרה), ולכן הם מגדילים את הסיכוי לעקוף את מודל האבטחה של Android.
שירותים בטוחים
שירותים בטוחים כוללים:
same_process_hwservice. השירותים האלה (בהגדרה) פועלים בתהליך של הלקוח, ולכן יש להם את אותה גישה כמו לדומיין של הלקוח שבו התהליך פועל.coredomain_hwservice. השירותים האלה לא יוצרים סיכונים שקשורים לסיבה מספר 2.hal_configstore_ISurfaceFlingerConfigs. השירות הזה מיועד לשימוש בכל דומיין.-
hal_graphics_allocator_hwservice. הפעולות האלה מוצעות גם על ידי שירותsurfaceflingerBinder, שאפליקציות מורשות יכולות לגשת אליו. -
hal_omx_hwservice. זוהי גרסת HwBinder שלmediacodecשירות Binder, שאפליקציות מורשות לגשת אליו. hal_codec2_hwservice. זו גרסה חדשה יותר שלhal_omx_hwservice.
מאפיינים שאפשר להשתמש בהם
לכל האפליקציות שhwservices לא נחשבות בטוחות יש את המאפיין untrusted_app_visible_hwservice. לשרתי ה-HAL המתאימים יש את המאפיין untrusted_app_visible_halserver. במכשירים עם Android 9 אסור להשתמש במאפיין untrusted.
המלצה:
- במקום זאת, אפליקציות לא מהימנות צריכות לתקשר עם שירות מערכת שמתקשר עם ספק HIDL HAL. לדוגמה, אפליקציות יכולות לדבר עם
binderservicedomain, ואזmediaserver(שהואbinderservicedomain) מדבר עםhal_graphics_allocator.או
- אפליקציות שזקוקות לגישה ישירה ל-
vendorHALs צריכות להיות בעלות דומיין sepolicy משלהן שמוגדר על ידי הספק.
בדיקות של מאפייני קובץ
Android 9 כולל בדיקות בזמן בנייה שמוודאות שלכל הקבצים במיקומים ספציפיים יש את המאפיינים המתאימים (לדוגמה, לכל הקבצים ב-sysfs יש את המאפיין הנדרש sysfs_type).
הוספת תוויות להקשרים של SELinux
כדי לתמוך בהבחנה בין מדיניות אבטחה של פלטפורמה לבין מדיניות אבטחה של ספק, המערכת יוצרת קובצי הקשר של SELinux באופן שונה כדי לשמור אותם בנפרד.
הקשרים של קבצים
ב-Android 8.0 בוצעו השינויים הבאים ב-file_contexts:
- כדי למנוע תקורה נוספת של קומפילציה במכשיר במהלך האתחול,
file_contextsלא יופיעו יותר בפורמט הבינארי. במקום זאת, הם קריאים, קובץ טקסט של ביטוי רגולרי כמו{property, service}_contexts(כמו שהיה לפני גרסה 7.0). - הנתונים
file_contextsמחולקים בין שני קבצים:plat_file_contexts- פלטפורמת Android
file_contextשאין לה תוויות ספציפיות למכשיר, למעט תוויות של חלקים במחיצה/vendorשצריך לתייג במדויק כדי להבטיח תפקוד תקין של קובצי sepolicy. - הוא צריך להיות במחיצת
systemבכתובת/system/etc/selinux/plat_file_contextsבמכשיר, להיטען על ידיinitבתחילת התהליך יחד עםfile_contextהספק.
- פלטפורמת Android
vendor_file_contextsfile_contextספציפי למכשיר, שנוצר משילוב שלfile_contextsשנמצא בספריות שאליהן מפנהBOARD_SEPOLICY_DIRSבקבצים שלBoardconfig.mkהמכשיר.- התוסף צריך להיות מותקן ב-
/vendor/etc/selinux/vendor_file_contextsבמחיצהvendor, ולהיטען על ידיinitבתחילת ההפעלה יחד עם הפלטפורמהfile_context.
הקשרים של הנכסים
ב-Android מגרסה 8.0, הקובץ property_contexts מחולק לשני קבצים:
plat_property_contexts- פלטפורמת Android
property_contextשלא כוללת תוויות ספציפיות למכשיר. - הוא צריך להיות במחיצה
systemבכתובת/system/etc/selinux/plat_property_contextsולהיטען על ידיinitבתחילת התהליך יחד עםproperty_contextsשל הספק.
- פלטפורמת Android
vendor_property_contexts-
property_contextספציפי למכשיר נוצר משילוב של property_contextsשנמצא בספריות שאליהן מפנה BOARD_SEPOLICY_DIRSבקבצים של המכשירBoardconfig.mk. - הקובץ צריך להיות במחיצה
vendorבנתיב/vendor/etc/selinux/vendor_property_contexts, והוא צריך להיטען על ידיinitבתחילת התהליך יחד עם הפלטפורמהproperty_context
-
הקשרים של השירות
ב-Android 8.0, הקובץ service_contexts מחולק לקבצים הבאים:
plat_service_contexts-
service_contextספציפי לפלטפורמת Android עבורservicemanager. ל-service_contextאין תוויות ספציפיות למכשיר. - הקובץ צריך להיות במחיצה
systemבכתובת/system/etc/selinux/plat_service_contexts, והוא נטען על ידיservicemanagerבהתחלה יחד עםservice_contexts.
-
vendor_service_contextsservice_contextספציפי למכשיר, נוצר משילוב שלservice_contextsשנמצא בספריות שאליהן מפנהBOARD_SEPOLICY_DIRSבקבצים שלBoardconfig.mkהמכשיר.- הקובץ צריך להיות במחיצה
vendorבנתיב/vendor/etc/selinux/vendor_service_contexts, והוא נטען על ידיservicemanagerבתחילת התהליך יחד עם פלטפורמתservice_contexts. - למרות ש-
servicemanagerמחפש את הקובץ הזה בזמן האתחול, במכשירTREBLEשעומד בכל הדרישות, הקובץvendor_service_contextsלא צריך להתקיים. הסיבה לכך היא שכל האינטראקציות בין התהליכיםvendorל-systemחייבות לעבור דרךhwservicemanager/hwbinder.
plat_hwservice_contexts- פלטפורמת Android
hwservice_contextעבורhwservicemanagerשלא הוגדרו לה תוויות ספציפיות למכשיר. - הקובץ חייב להיות במחיצה
systemבנתיב/system/etc/selinux/plat_hwservice_contexts, והוא נטען על ידיhwservicemanagerבתחילת התהליך יחד עםvendor_hwservice_contexts.
- פלטפורמת Android
vendor_hwservice_contextshwservice_contextספציפי למכשיר, נוצר משילוב שלhwservice_contextsשנמצא בספריות שאליהן מפנהBOARD_SEPOLICY_DIRSבקבצים שלBoardconfig.mkהמכשיר.- הקובץ חייב להיות במחיצה
vendorבכתובת/vendor/etc/selinux/vendor_hwservice_contexts, והוא נטען על ידיhwservicemanagerבתחילת התהליך יחד עםplat_service_contexts.
vndservice_contexts-
service_contextספציפי למכשיר עבור vndservicemanagerשנוצר משילוב של vndservice_contextsשנמצא בספריות שאליהן מפנה BOARD_SEPOLICY_DIRSב Boardconfig.mkשל המכשיר. - הקובץ הזה צריך להיות במחיצה
vendorבכתובת/vendor/etc/selinux/vndservice_contextsולהיטען על ידיvndservicemanagerבהתחלה.
-
הקשרים של Seapp
ב-Android מגרסה 8.0, הקובץ seapp_contexts מחולק לשני קבצים:
plat_seapp_contexts- פלטפורמת Android
seapp_contextללא שינויים ספציפיים למכשיר. - חייבים להתגורר במחיצה
systemבכתובת/system/etc/selinux/plat_seapp_contexts.
- פלטפורמת Android
vendor_seapp_contexts- תוסף ספציפי למכשיר לפלטפורמה
seapp_contextשנוצר על ידי שילוב שלseapp_contextsשנמצא בספריות שאליהן מפנהBOARD_SEPOLICY_DIRSבקובציBoardconfig.mkשל המכשיר. - חייבים להתגורר במחיצה
vendorבכתובת/vendor/etc/selinux/vendor_seapp_contexts.
- תוסף ספציפי למכשיר לפלטפורמה
הרשאות MAC
ב-Android מגרסה 8.0, הקובץ mac_permissions.xml מחולק לשני קבצים:
- פלטפורמה
mac_permissions.xml- פלטפורמת Android
mac_permissions.xmlללא שינויים ספציפיים למכשיר. - חייבים להתגורר במחיצה
systemבכתובת/system/etc/selinux/.
- פלטפורמת Android
- לא בפלטפורמה
mac_permissions.xml- תוסף ספציפי למכשיר לפלטפורמה
mac_permissions.xmlשנבנה מתוךmac_permissions.xmlשנמצא בספריות שאליהן מצביעBOARD_SEPOLICY_DIRSבקבצים שלBoardconfig.mkהמכשיר. - חייבים להתגורר במחיצה
vendorבכתובת/vendor/etc/selinux/.
- תוסף ספציפי למכשיר לפלטפורמה