בקרת גישה לפי שיקול דעת (DAC)

אובייקטים ושירותים של מערכת קבצים שנוספו ל-build זקוקים לעתים קרובות למזהים נפרדים וייחודיים, הידועים כ-Android IDs (AIDs). נכון לעכשיו, משאבים רבים כגון קבצים ושירותים משתמשים ב-AIDs ליבה (מוגדרת אנדרואיד) שלא לצורך; במקרים רבים אתה יכול להשתמש ב-OEM (בהגדרת OEM) במקום זאת.

גרסאות קודמות של אנדרואיד (אנדרואיד 7.x ומטה) הרחיבו את מנגנון ה-AIDs באמצעות קובץ android_filesystem_config.h ספציפי למכשיר כדי לציין יכולות של מערכת הקבצים ו/או עזרי OEM מותאמים אישית. עם זאת, מערכת זו הייתה לא אינטואיטיבית מכיוון שהיא לא תמכה בשימוש בשמות נחמדים עבור מכשירי OEM AID, מה שדרש ממך לציין את המספר הגולמי עבור שדות המשתמש והקבוצה ללא דרך לשייך שם ידידותי ל-AID המספרי.

גרסאות חדשות יותר של אנדרואיד (אנדרואיד 8.0 ומעלה) תומכות בשיטה חדשה להרחבת יכולות מערכת הקבצים. לשיטה חדשה זו יש תמיכה בפעולות הבאות:

  • מיקומי מקור מרובים לקובצי תצורה (מאפשר תצורות בנייה הניתנות להרחבה).
  • בדיקת שפיות בזמן בנייה של ערכי OEM AID.
  • יצירת כותרת OEM AID מותאמת אישית שניתן להשתמש בה בקבצי מקור לפי הצורך.
  • שיוך של שם ידידותי עם ערך OEM AID בפועל. תומך בארגומנטים לא מספריים של מחרוזת עבור משתמש וקבוצה, כלומר "foo" במקום "2901".

שיפורים נוספים כוללים את הסרת מערך ה- android_ids[] מ- system/core/libcutils/include/private/android_filesystem_config.h . מערך זה קיים כעת ב- Bionic כמערך שנוצר באופן פרטי לחלוטין, עם אביזרים דרך getpwnam() ו- getgrnam() . (יש לכך תופעת הלוואי של ייצור קבצים בינאריים יציבים כאשר מכשירי הליבה משתנים.) לקבלת כלי עבודה וקובץ README עם פרטים נוספים, עיין ב- build/make/tools/fs_config .

הוספת מזהי אנדרואיד (AIDs)

אנדרואיד 8.0 הסירה את מערך android_ids[] מפרויקט הקוד הפתוח של Android (AOSP). כל השמות הידידותיים ל-AID נוצרים במקום זאת מקובץ הכותרת system/core/libcutils/include/private/android_filesystem_config.h בעת יצירת מערך ה-Bionic android_ids[] . כל define התאמת AID_* נקלטת על ידי הכלים ו- * הופך לשם באותיות קטנות.

לדוגמה, ב- private/android_filesystem_config.h :

#define AID_SYSTEM 1000

הופך ל:

  • שם ידידותי: מערכת
  • uid: 1000
  • gid: 1000

כדי להוסיף AID ליבה AOSP חדש, פשוט הוסף את ה- #define לקובץ הכותרת android_filesystem_config.h . ה-AID יופק בעת הבנייה ויהיה זמין לממשקים המשתמשים בארגומנטים של משתמש וקבוצה. הכלי מאמת שה-AID החדש אינו בטווחי ה-APP או OEM; הוא גם מכבד שינויים בטווחים הללו ואמור להגדיר מחדש באופן אוטומטי בשינויים או בטווחים חדשים שמורים OEM.

הגדרת איידס

כדי להפעיל את מנגנון ה-AIDS החדש, הגדר את TARGET_FS_CONFIG_GEN בקובץ BoardConfig.mk . משתנה זה מכיל רשימה של קובצי תצורה, המאפשר לך להוסיף קבצים לפי הצורך.

לפי המוסכמה, קבצי תצורה משתמשים בשם config.fs , אך בפועל ניתן להשתמש בכל שם. קבצי config.fs הם בפורמט Python ConfigParser ini וכוללים קטע כובעים (להגדרת יכולות מערכת הקבצים) וקטע AIDs (להגדרת רכיבי עזר OEM).

קביעת תצורה של סעיף המכסים

סעיף ה-caps תומך בהגדרת יכולות מערכת הקבצים על אובייקטים של מערכת קבצים בתוך ה-build (מערכת הקבצים עצמה חייבת גם לתמוך בפונקציונליות זו).

מכיוון שהפעלת שירות יציב כ-root באנדרואיד גורמת לכשל של Compatibility Test Suite (CTS) , דרישות קודמות לשמירה על יכולת בזמן הפעלת תהליך או שירות כללו הגדרת יכולות ואז שימוש setuid / setgid ל-AID תקין להפעלה. עם קפסים, אתה יכול לדלג על הדרישות האלה ולבקש מהקרנל לעשות את זה בשבילך. כאשר השליטה מועברת ל- main() , לתהליך שלך כבר יש את היכולות הדרושות לו כך שהשירות שלך יכול להשתמש במשתמש וקבוצה שאינם שורשיים (זו הדרך המועדפת להפעלת שירותים מועדפים).

קטע ה-caps משתמש בתחביר הבא:

סָעִיף ערך הַגדָרָה
[path] נתיב מערכת הקבצים להגדרה. נתיב המסתיים ב-/ נחשב ל-dir, אחרת זה קובץ.

זוהי שגיאה לציין מספר מקטעים עם אותו [path] בקבצים שונים. בגירסאות Python <= 3.2, אותו קובץ עשוי להכיל קטעים שעוקפים את הסעיף הקודם; ב-Python 3.2, הוא מוגדר למצב קפדני.
mode מצב קובץ אוקטלי מצב קובץ אוקטלי חוקי של 3 ספרות לפחות. אם צוין 3, יש לו קידומת 0, מצב אחר משמש כפי שהוא.
user AID_<user> או שה-C define עבור AID חוקי או השם הידידותי (למשל, AID_RADIO וגם radio מקובלים). להגדרת AID מותאם אישית, ראה הגדרת סעיף AID .
group AID_<קבוצה> זהה למשתמש.
caps כובע* השם כפי שהוצהר ב- bionic/libc/kernel/uapi/linux/capability.h ללא ה- CAP_ המוביל. מותר מקרה מעורב. כובעים יכולים להיות גם הגולמיים:
  • בינארי (0b0101)
  • אוקטל (0455)
  • int (42)
  • hex (0xFF)
הפרד מספר מכסים באמצעות רווחים לבנים.

לקבלת דוגמה לשימוש, ראה שימוש ביכולות של מערכת קבצים .

הגדרת סעיף ה-AID

קטע ה-AID מכיל עזרי OEM ומשתמש בתחביר הבא:

סָעִיף ערך הַגדָרָה
[AID_<name>] ה- <name> יכול להכיל תווים באותיות רישיות, מספרים וקווים תחתונים. הגרסה באותיות קטנות משמשת כשם הידידותי. קובץ הכותרת שנוצר עבור הכללת קוד משתמש ב- AID_<name> .

זו שגיאה לציין מספר מקטעים עם אותו AID_<name> (לא תלוי רישיות עם אותם אילוצים כמו [path] ).

<name> חייב להתחיל בשם מחיצה כדי להבטיח שהיא לא מתנגשת עם מקורות שונים.
value <מספר> מחרוזת מספרים חוקית בסגנון C (הקסוס, אוקטלי, בינארי ועשרוני).

זו שגיאה לציין מספר חלקים עם אותה אפשרות ערך.

יש לציין אפשרויות ערך בטווח המתאים למחיצה המשמשת ב- <name> . רשימת המחיצות התקפות והטווחים המתאימים להן מוגדרת ב- system/core/libcutils/include/private/android_filesystem_config.h . האפשרויות הן:
  • מחיצת ספקים
    • AID_OEM_RESERVED_START(2900) - AID_OEM_RESERVED_END(2999)
    • AID_OEM_RESERVED_2_START(5000) - AID_OEM_RESERVED_2_END(5999)
  • מחיצת מערכת
    • AID_SYSTEM_RESERVED_START(6000) - AID_SYSTEM_RESERVED_END(6499)
  • מחיצת ODM
    • AID_ODM_RESERVED_START(6500) - AID_ODM_RESERVED_END(6999)
  • מחיצת מוצר
    • AID_PRODUCT_RESERVED_START(7000) - AID_PRODUCT_RESERVED_END(7499)
  • System_ext מחיצה
    • AID_SYSTEM_EXT_RESERVED_START(7500) - AID_SYSTEM_EXT_RESERVED_END(7999)

לדוגמאות שימוש, ראה הגדרת שמות OEM AID ושימוש ב-OEM AIDs .

דוגמאות לשימוש

הדוגמאות הבאות מפרטות כיצד להגדיר ולהשתמש ב-OEM AID וכיצד להפעיל יכולות של מערכת קבצים. שמות OEM AID ( [AID_ name ] ) חייבים להתחיל בשם מחיצה כגון " vendor_ " כדי להבטיח שהם אינם מתנגשים עם שמות AOSP עתידיים או מחיצות אחרות.

הגדרת שמות OEM AID

כדי להגדיר AID OEM, צור קובץ config.fs והגדר את ערך ה-AID. לדוגמה, ב- device/x/y/config.fs , הגדר את הדברים הבאים:

[AID_VENDOR_FOO]
value: 2900

לאחר יצירת הקובץ, הגדר את המשתנה TARGET_FS_CONFIG_GEN והצביע עליו ב- BoardConfig.mk . לדוגמה, ב- device/x/y/BoardConfig.mk , הגדר את הדברים הבאים:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

כעת ניתן לצרוך את העזר המותאם אישית שלך על ידי המערכת בכללותה במבנה חדש.

שימוש בעזרים OEM

כדי להשתמש ב-OEM AID, בקוד C שלך, כלול את oemaids_headers ב-Makefile המשויך שלך, והוסף #include "generated_oem_aid.h" , ולאחר מכן התחל להשתמש במזהים המוצהרים. לדוגמה, ב- my_file.c , הוסף את הדברים הבאים:

#include "generated_oem_aid.h"
…

If (ipc->uid == AID_VENDOR_FOO) {
  // Do something
...

בקובץ Android.bp המשויך שלך, הוסף את הדברים הבאים:

header_libs: ["oemaids_headers"],

אם אתה משתמש בקובץ Android.mk , הוסף את הדברים הבאים:

LOCAL_HEADER_LIBRARIES := oemaids_headers

שימוש בשמות ידידותיים

באנדרואיד 9, אתה יכול להשתמש בשם הידידותי עבור כל ממשק התומך בשמות AID. לדוגמה:

  • בפקודה chown ב- some/init.rc :
    chown vendor_foo /vendor/some/vendor_foo/file
    
  • service ב- some/init.rc :
    service vendor_foo /vendor/bin/foo_service
        user vendor_foo
        group vendor_foo
    

מכיוון שהמיפוי הפנימי מהשם הידידותי ל-uid מתבצע על ידי /vendor/etc/passwd ו- /vendor/etc/group , יש להרכיב את מחיצת הספק.

שיוך שמות ידידותיים

אנדרואיד 9 כולל תמיכה בשיוך שם ידידותי לערך OEM AID בפועל. אתה יכול להשתמש בארגומנטים לא מספריים של מחרוזת עבור משתמש וקבוצה, כלומר " vendor_foo " במקום "2901".

המרת AID לשמות ידידותיים

עבור מכשירי OEM AID , אנדרואיד 8.x דרשה שימוש ב- oem_#### עם getpwnam ופונקציות דומות, כמו גם במקומות המטפלים בחיפושים באמצעות getpwnam (כגון סקריפטים init ). באנדרואיד 9, אתה יכול להשתמש בחברים getpwnam ו- getgrnam ב- Bionic להמרה ממזהות אנדרואיד (AIDs) לשמות ידידותיים ולהיפך.

שימוש ביכולות מערכת הקבצים

כדי לאפשר יכולות של מערכת קבצים, צור קטע כובעים בקובץ config.fs . לדוגמה, ב- device/x/y/config.fs , הוסף את הסעיף הבא:

[system/bin/foo_service]
mode: 0555
user: AID_VENDOR_FOO
group: AID_SYSTEM
caps: SYS_ADMIN | SYS_NICE

לאחר יצירת הקובץ, הגדר את ה- TARGET_FS_CONFIG_GEN כך שיצביע על הקובץ הזה ב- BoardConfig.mk . לדוגמה, ב- device/x/y/BoardConfig.mk , הגדר את הדברים הבאים:

TARGET_FS_CONFIG_GEN += device/x/y/config.fs

כאשר vendor_ foo מבוצע, הוא מתחיל עם היכולות CAP_SYS_ADMIN ו- CAP_SYS_NICE ללא קריאות setuid ו- setgid . בנוסף, מדיניות ה-SELinux של vendor_ foo שירות כבר אינה זקוקה ליכולת setuid ו- setgid וניתנת למחיקה.

הגדרת עקיפות (Android 6.x-7.x)

אנדרואיד 6.0 העתיק fs_config ואת הגדרות המבנה המשויכות ( system/core/include/private/android_filesystem_config.h ) ל- system/core/libcutils/fs_config.c שם ניתן היה לעדכן או לעקוף אותם על ידי קבצים בינאריים המותקנים ב- /system/etc/fs_config_dirs ו /system/etc/fs_config_files . שימוש בכללי התאמה וניתוח נפרדים עבור ספריות וקבצים (שיכולים להשתמש בביטויי גלוב נוספים) אפשרו ל-Android לטפל בספריות וקבצים בשתי טבלאות שונות. הגדרות מבנה ב- system/core/libcutils/fs_config.c לא רק אפשרו קריאה בזמן ריצה של ספריות וקבצים, אלא שהמארח יכול להשתמש באותם קבצים במהלך זמן הבנייה כדי לבנות תמונות של מערכת קבצים כמו ${OUT}/system/etc/fs_config_dirs ו- ${OUT}/system/etc/fs_config_files .

בעוד ששיטת ההחלפה של הרחבת מערכת הקבצים הוחלפה על ידי מערכת התצורה המודולרית שהוצגה באנדרואיד 8.0, אתה עדיין יכול להשתמש בשיטה הישנה אם תרצה. הסעיפים הבאים מפרטים כיצד ליצור ולכלול קבצים לעקוף ולהגדיר את מערכת הקבצים.

יצירת קבצי עקיפה

אתה יכול ליצור את הקבצים הבינאריים המיושרים /system/etc/fs_config_dirs ו- /system/etc/fs_config_files באמצעות הכלי fs_config_generate ב- build/tools/fs_config . הכלי משתמש בפונקציית ספריית libcutils ( fs_config_generate() ) לניהול דרישות DAC לתוך מאגר ומגדיר כללים עבור קובץ include כדי למסד את כללי ה-DAC.

כדי להשתמש, צור קובץ כלול device/ vendor / device /android_filesystem_config.h שמתפקד כעקיפה. הקובץ חייב להשתמש בפורמט structure fs_path_config המוגדר ב- system/core/include/private/android_filesystem_config.h עם אתחולי המבנה הבאים עבור סמלי ספרייה וקבצים:

  • עבור ספריות, השתמש ב- android _device _dirs[] .
  • עבור קבצים, השתמש ב- android _device _files[] .

כאשר אינך משתמש android_device_dirs[] ו- android_device_files[] , אתה יכול להגדיר NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS ו- NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_FILES (ראה את הדוגמה למטה). אתה יכול גם לציין את קובץ העקיפה באמצעות TARGET_ANDROID_FILESYSTEM_CONFIG_H בתצורת הלוח, עם שם בסיס מאולץ של android_filesystem_config.h .

כולל קבצי עקיפה

כדי לכלול קבצים, ודא ש- PRODUCT_PACKAGES כולל fs_config_dirs ו/או fs_config_files כך שהוא יוכל להתקין אותם ב- /system/etc/fs_config_dirs ו- /system/etc/fs_config_files , בהתאמה. מערכת ה-build מחפשת את android_filesystem_config.h מותאם אישית ב $(TARGET_DEVICE_DIR) , שבו קיים BoardConfig.mk . אם קובץ זה קיים במקום אחר, הגדר את משתנה התצורה של הלוח TARGET_ANDROID_FILESYSTEM_CONFIG_H כך שיצביע על מיקום זה.

הגדרת מערכת הקבצים

כדי להגדיר את מערכת הקבצים באנדרואיד 6.0 ומעלה:

  1. צור את הקובץ $(TARGET_DEVICE_DIR)/android_filesystem_config.h .
  2. הוסף את fs_config_dirs ו/או fs_config_files ל- PRODUCT_PACKAGES בקובץ התצורה של הלוח (למשל, $(TARGET_DEVICE_DIR)/device.mk ).

דוגמה לעקוף

דוגמה זו מציגה תיקון לעקוף את הדמון system/bin/glgps כדי להוסיף תמיכה ב-wake lock בספריית device/ vendor / device . זכור את הדברים הבאים:

  • כל ערך מבנה הוא המצב, ה-uid, gid, היכולות והשם. system/core/include/private/android_filesystem_config.h נכלל באופן אוטומטי כדי לספק את המניפסט #defines ( AID_ROOT , AID_SHELL , CAP_BLOCK_SUSPEND ).
  • הקטע android_device_files[] כולל פעולה לדיכוי גישה ל- system/etc/fs_config_dirs כאשר לא צוין, המשמשת כהגנה נוספת של DAC בגין חוסר תוכן לעקיפות ספריות. עם זאת, זוהי הגנה חלשה; אם למישהו יש שליטה על /system , הוא בדרך כלל יכול לעשות כל מה שהוא רוצה.
diff --git a/android_filesystem_config.h b/android_filesystem_config.h
new file mode 100644
index 0000000..874195f
--- /dev/null
+++ b/android_filesystem_config.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+/* This file is used to define the properties of the filesystem
+** images generated by build tools (eg: mkbootfs) and
+** by the device side of adb.
+*/
+
+#define NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+/* static const struct fs_path_config android_device_dirs[] = { }; */
+
+/* Rules for files.
+** These rules are applied based on "first match", so they
+** should start with the most specific path and work their
+** way up to the root. Prefixes ending in * denotes wildcard
+** and will allow partial matches.
+*/
+static const struct fs_path_config android_device_files[] = {
+  { 00755, AID_ROOT, AID_SHELL, (1ULL << CAP_BLOCK_SUSPEND),
"system/bin/glgps" },
+#ifdef NO_ANDROID_FILESYSTEM_CONFIG_DEVICE_DIRS
+  { 00000, AID_ROOT, AID_ROOT, 0, "system/etc/fs_config_dirs" },
+#endif
+};


diff --git a/device.mk b/device.mk
index 0c71d21..235c1a7 100644
--- a/device.mk
+++ b/device.mk
@@ -18,7 +18,8 @@ PRODUCT_PACKAGES := \
     libwpa_client \
     hostapd \
     wpa_supplicant \
-    wpa_supplicant.conf
+    wpa_supplicant.conf \
+    fs_config_files

 ifeq ($(TARGET_PREBUILT_KERNEL),)
 ifeq ($(USE_SVELTE_KERNEL), true)

העברת מערכות קבצים ממהדורות קודמות

בעת העברת מערכות קבצים מ-Android 5.x ואילך, זכור כי Android 6.x

  • מסיר כמה כולל, מבנים והגדרות מוטבעות.
  • דורש הפניה ל- libcutils במקום לרוץ ישירות מ- system/core/include/private/android_filesystem_config.h . קובצי הפעלה פרטיים של יצרן המכשיר התלויים ב- system/code/include/private_filesystem_config.h עבור מבני הקובץ או הספרייה או fs_config חייבים להוסיף תלות בספריית libcutils .
  • דורש עותקים של סניף פרטי של יצרן המכשיר של system/core/include/private/android_filesystem_config.h עם תוכן נוסף על יעדים קיימים כדי לעבור למכשיר device/ vendor / device /android_filesystem_config.h .
  • שומרת לעצמה את הזכות להחיל SELinux Mandatory Access Controls (MAC) על קבצי תצורה במערכת היעד, יישומים הכוללים קובצי הפעלה מותאמים אישית של יעד באמצעות fs_config() חייבים להבטיח גישה.