التحكم في الوصول التقديري (DAC)

غالبًا ما تحتاج كائنات وخدمات نظام الملفات المضافة إلى الإصدار إلى معرفات منفصلة وفريدة ، تُعرف باسم معرفات Android (AIDs). في الوقت الحالي ، تستخدم العديد من الموارد مثل الملفات والخدمات معرّفات AID الأساسية (المعرفة بنظام Android) دون داعٍ ؛ في كثير من الحالات ، يمكنك استخدام معرّفات OEM (المعرّفة من قِبل OEM) بدلاً من ذلك.

مددت الإصدارات السابقة من الروبوت (الروبوت 7.X وخفض) آلية الإيدز باستخدام جهاز محددة android_filesystem_config.h الملف لتحديد قدرات الملفات و / أو العرف OEM الإيدز. ومع ذلك ، كان هذا النظام غير بديهي لأنه لا يدعم استخدام أسماء لطيفة لمعرفات OEM ، مما يتطلب منك تحديد الأرقام الأولية لحقول المستخدم والمجموعة دون طريقة لربط اسم مألوف بـ AID الرقمي.

تدعم الإصدارات الأحدث من Android (Android 8.0 والإصدارات الأحدث) طريقة جديدة لتوسيع إمكانيات نظام الملفات. تدعم هذه الطريقة الجديدة ما يلي:

  • مواقع مصادر متعددة لملفات التكوين (تتيح تكوينات بناء قابلة للتوسيع).
  • التحقق من سلامة وقت الإنشاء لقيم AID لـ OEM.
  • إنشاء رأس OEM AID مخصص يمكن استخدامه في الملفات المصدر حسب الحاجة.
  • اقتران اسم مألوف بقيمة OEM AID الفعلية. يدعم وسيطات السلسلة غير الرقمية للمستخدم والمجموعة ، مثل "foo" بدلاً من "2901".

وتشمل التحسينات الإضافية إزالة android_ids[] مجموعة من system/core/libcutils/include/private/android_filesystem_config.h . هذه المجموعة موجودة الآن في بيونيك عن مجموعة ولدت خاصة تماما، مع من يمكنهم الدخول عبر getpwnam() و getgrnam() . (وهذا له تأثير جانبي على إنتاج ثنائيات مستقرة كما يتم تعديل الإيدز الأساسية.) لالأدوات وملف README مع مزيد من التفاصيل، يرجى الرجوع إلى build/make/tools/fs_config .

إضافة معرفات Android (AIDs)

الروبوت 8.0 إزالة android_ids[] مجموعة من المشاريع مفتوحة المصدر الروبوت (AOSP). بدلا من ذلك المتولدة عن أسماء صديقة للAID من system/core/libcutils/include/private/android_filesystem_config.h ملف الرأس عند إنشاء بيونيك 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.

تكوين المساعدات

لتمكين آلية جديدة لمكافحة الايدز، مجموعة TARGET_FS_CONFIG_GEN في BoardConfig.mk الملف. يحتوي هذا المتغير على قائمة بملفات التكوين ، مما يتيح لك إلحاق الملفات حسب الحاجة.

من الاتفاقية، وملفات التكوين استخدام اسم config.fs ، ولكن في الواقع يمكنك استخدام أي اسم. config.fs الملفات في شكل رسائل كتبها هذا المؤلف بيثون ConfigParser وتشمل قسم قبعات (لتكوين قدرات نظام الملفات)، والجزء الإيدز (لتكوين OEM الإيدز).

تكوين قسم القبعات

ويدعم قسم القبعات تحديد قدرات نظام الملفات على نظام الملفات الكائنات داخل البناء (يجب على الملفات نفسها كما تدعم هذه الوظيفة).

لأن تشغيل خدمة مستقرة كجذر في الروبوت يؤدي إلى اختبار توافق جناح (CTS) الفشل، المتطلبات السابقة للاحتفاظ بقدرة أثناء تشغيل عملية أو خدمة المتورطين اقامة قدرات ثم استخدام setuid / setgid إلى AID المناسبة لتشغيل. باستخدام الأحرف الاستهلالية ، يمكنك تخطي هذه المتطلبات وجعل النواة تقوم بذلك نيابةً عنك. عندما يتم تسليم السيطرة إلى main() ، عملية لديها بالفعل قدرات يحتاجها حتى خدمتكم يمكن استخدام المستخدم الجذر غير ومجموعة (هذه هي الطريقة المفضلة لبدء خدمات متميزة).

يستخدم قسم الأحرف الكبيرة بناء الجملة التالي:

الجزء قيمة تعريف
[path] مسار نظام الملفات المطلوب تكوينه. المسار الذي ينتهي بـ / يعتبر dir ، وإلا فهو ملف.

ومن خطأ لتحديد مقاطع متعددة مع نفس [path] في ملفات مختلفة. في إصدارات Python <= 3.2 ، قد يحتوي الملف نفسه على أقسام تتجاوز القسم السابق ؛ في Python 3.2 ، تم ضبطه على الوضع المتشدد.
mode وضع الملف الثماني وضع ملف ثماني صالح يتكون من 3 أرقام على الأقل. إذا تم تحديد 3 ، فسيكون مسبوقًا بـ 0 ، ويستخدم وضع else كما هو.
user AID_ <المستخدم> إما C define لAID صالحة أو اسم مألوف (على سبيل المثال كل من AID_RADIO و radio مقبولة). لتحديد AID مخصصة، انظر تكوين قسم AID .
group AID_ <مجموعة> نفس المستخدم.
caps قبعة* الاسم كما أعلن في bionic/libc/kernel/uapi/linux/capability.h دون الرائدة CAP_ . حالة مختلطة مسموح بها. يمكن أن تكون القبعات أيضًا خامًا:
  • ثنائي (0b0101)
  • ثماني (0455)
  • انت (42)
  • عرافة (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)
  • قسم التصميم
    • 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 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

يمكن الآن أن يستهلك النظام بشكل عام في بناء جديد AID المخصص الخاص بك.

استخدام مساعدات OEM

لاستخدام AID OEM، في التعليمات البرمجية C الخاص بك، وتشمل oemaids_headers في ماكيفيلي يرتبط بك، وإضافة #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. على سبيل المثال:

  • في 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
    

لأنه يتم تنفيذ التعيين الداخلي من اسم مألوف لرمز المستخدم من قبل /vendor/etc/passwd و /vendor/etc/group ، يجب أن يتم تنظيمها قسم بائع.

ربط الأسماء المألوفة

يتضمن Android 9 دعمًا لإقران اسم مألوف بقيمة OEM AID الفعلية. يمكنك استخدام الحجج سلسلة غير رقمية للمستخدم والمجموعة، أي "vendor_ فو" بدلا من "2901".

التحويل من AID إلى أسماء مألوفة

ل OEM الإيدز ، الروبوت 8.x من المطلوب استخدام oem_#### مع getpwnam وظائف مماثلة، وكذلك في الأماكن التي عمليات البحث عبر مقبض getpwnam (مثل init البرامج النصية). في الروبوت 9، يمكنك استخدام getpwnam و getgrnam الأصدقاء في بيونيك لتحويل من الروبوت معرفات (الإيدز) إلى أسماء الصديقة والعكس بالعكس.

استخدام إمكانيات نظام الملفات

لتمكين قدرات نظام الملفات، إنشاء قسم القبعات في 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 سياسة سيلينو الخدمة لم يعد بحاجة القدرة 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 . إن استخدام قواعد المطابقة والتحليل المنفصلة للأدلة والملفات (التي يمكن أن تستخدم تعبيرات glob إضافية) مكّن 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 إلى منطقة عازلة، ويعرف قواعد لملف التضمين إضفاء الطابع المؤسسي على قواعد 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 في تكوين المجلس، مع 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 موجودا. إذا كان هذا الملف موجودا في أي مكان آخر، مجموعة مجلس التكوين متغير 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 الشيطان لإضافة دعم قفل أعقاب في 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 .
  • تحتفظ لنفسها بالحق في تطبيق سيلينو الضوابط وصول إلزامية (MAC) إلى ملفات التكوين على النظام الهدف، التطبيقات التي تشمل التنفيذية الهدف مخصصة باستخدام fs_config() يجب ضمان الوصول.