בדף הזה מוסבר איך מערכת 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
. הפעולות האלה מוצעות גם על ידי שירותsurfaceflinger
Binder, שאפליקציות מורשות יכולות לגשת אליו. -
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
.או
- אפליקציות שזקוקות לגישה ישירה ל-
vendor
HALs צריכות להיות בעלות דומיין 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_contexts
file_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_contexts
service_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_contexts
hwservice_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/.
- תוסף ספציפי למכשיר לפלטפורמה