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

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

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

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

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

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

הוספת מזהי Android (AID)

אנדרואיד 8.0 הסיר את android_ids[] מערך מפרויקט קוד פתוח אנדרואיד (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 וכוללים סעיף כובעים (להגדרת יכולות מערכת הקבצים) וכן סעיף איידס (להגדרת איידס OEM).

הגדרת סעיף הכובעים

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

בגלל הפעלת שירות יציב כ root Android גורמת Suite מבחן תאימות (CTS) כישלון, דרישות קודמות לשימור יכולת כשתריץ תהליך או שירות מעורב בהקמת יכולות מכן באמצעות setuid / setgid לגוף מסייע מתאים לפעולה. בעזרת מכסים, תוכל לדלג על דרישות אלה ולגרום לגרעין לעשות זאת עבורך. כאשר שליטה מסר ל main() , התהליך שלך כבר יש את היכולות שהוא צריך כדי השירות שלך יכול להשתמש במשתמש הלא שורש וקבוצתי (זו הדרך המועדפת להתחלת שירותים חסויים).

סעיף הכיפות משתמש בתחביר הבא:

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

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

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

הגדרת הקטע AID

חלק AID מכיל OEM AIDs ומשתמש בתחביר הבא:

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

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

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

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

יש לציין אפשרויות ערך בטווח מתאים המחיצה בשימוש <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)

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

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

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

הגדרת שמות עזרת OEM

כדי להגדיר עזר 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

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

שימוש בסיוע OEM

כדי להשתמש כעזר OEM, בקוד 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

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

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

  • In a 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 , מחיצת הספק חייבת להיות מותקנת.

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

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

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

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

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

כדי לאפשר יכולות מערכת הקבצים, ליצור קטע קליעים 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 שיחות. בנוסף, vendor_ foo מדיניות SELinux של השירות כבר לא צריך יכולת 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 .

בעוד שיטת ההדחה של הרחבת מערכת הקבצים הוחלפה על ידי מערכת התצורה המודולרית שהוצגה ב- Android 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.

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

  • עבור ספריות, להשתמש 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 בתצורת הלוח, עם basename נאכף של android_filesystem_config.h .

כולל דריסת קבצים

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

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

כדי להגדיר את מערכת הקבצים ב- Android 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 Daemon להוסיף תמיכה מנעול ומתעוררת 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 (MAC) כדי קבצי תצורה במערכת היעד, הטמעות כוללות רצת היעד מותאמת אישית באמצעות fs_config() חייב להבטיח גישה.