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

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

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

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

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

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

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

أزال الإصدار 8.0 من Android مصفوفة android_ids[] من مشروع Android مفتوح المصدر (AOSP). بدلاً من ذلك، يتم إنشاء جميع الأسماء المناسبة لمعرّفات Android من ملف العنوان system/core/libcutils/include/private/android_filesystem_config.h عند إنشاء مصفوفة android_ids[] في Bionic. تختار الأدوات أي define يطابق AID_* ويصبح * الاسم بالأحرف الصغيرة.

على سبيل المثال، في private/android_filesystem_config.h:

#define AID_SYSTEM 1000

يصبح:

  • الاسم المناسب: system
  • uid: 1000
  • gid: 1000

لإضافة معرّف Android أساسي جديد في مشروع Android المفتوح المصدر (AOSP)، ما عليك سوى إضافة #define إلى android_filesystem_config.h ملف العنوان. يتم إنشاء معرّف Android في وقت الإصدار وإتاحته للواجهات التي تستخدم وسيطات المستخدم والمجموعة. تتحقّق الأدوات من عدم وجود معرّف Android الجديد ضمن نطاقات التطبيق أو مصنّع المعدات الأصلية ، كما تأخذ في الاعتبار التغييرات التي تطرأ على هذه النطاقات ويجب إعادة ضبطها تلقائيًا عند إجراء تغييرات أو إضافة نطاقات جديدة محجوزة لمصنّع المعدات الأصلية.

ضبط معرّفات Android

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

تستخدم ملفات الإعداد بشكل تقليدي الاسم config.fs، ولكن في الواقع يمكنك استخدام أي اسم. تكون ملفات config.fs بتنسيق ini الخاص بـ Python ConfigParser وتتضمّن قسمًا للأحرف الكبيرة (لضبط إمكانات نظام الملفات) وقسمًا لمعرّفات Android (لضبط معرّفات Android الخاصة بمصنّع المعدات الأصلية).

ضبط قسم الإمكانات

يتيح قسم الإمكانات ضبط إمكانات نظام الملفات على كائنات نظام الملفات ضمن الإصدار (يجب أن يتيح نظام الملفات نفسه هذه الوظيفة أيضًا).

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

يستخدم قسم الإمكانات البنية التالية:

القسم القيمة التعريف
[path] مسار نظام الملفات الذي تريد ضبطه يُعد المسار الذي ينتهي بـ / دليلًا، وإلا فهو ملف.

يُعد تحديد أقسام متعددة باستخدام [path] نفسه في ملفات مختلفة خطأً. في إصدارات Python التي تقل عن 3.2 أو تساويه، قد يحتوي الملف نفسه على أقسام تلغي القسم السابق، وفي Python 3.2، يتم ضبطه على وضع التدقيق الصارم.
mode وضع الملف الثماني وضع ملف ثماني صالح يتألف من 3 أرقام على الأقل إذا تم تحديد 3، يتم إضافة 0 في البداية، وإلا يتم استخدام الوضع كما هو.
user AID_<user> إما C define لمعرّف Android صالح أو الاسم المناسب (على سبيل المثال، يتم قبول كل من AID_RADIO وradio). لتحديد معرّف Android مخصّص، يُرجى الاطّلاع على ضبط قسم معرّفات Android.
group AID_<group> يُرجى الاطّلاع على user.
caps cap* الاسم كما هو معلن في bionic/libc/kernel/uapi/linux/capability.h بدون CAP_ في البداية يُسمح باستخدام الأحرف الكبيرة والصغيرة. يمكن أن تكون الإمكانات أيضًا القيم الأولية:
  • ثنائي (0b0101)
  • ثماني (0455)
  • عدد صحيح (42)
  • سداسي عشري (0xFF)
يجب الفصل بين الإمكانات المتعددة باستخدام مسافات بيضاء.

للاطّلاع على مثال على الاستخدام، يُرجى الرجوع إلى استخدام إمكانات نظام الملفات.

ضبط قسم معرّفات Android

يحتوي قسم معرّفات Android على معرّفات Android الخاصة بمصنّع المعدات الأصلية ويستخدم البنية التالية:

القسم القيمة التعريف
[AID_<name>] يمكن أن يحتوي <name> على أحرف كبيرة وأرقام وشرطات سفلية. يُستخدم الإصدار بالأحرف الصغيرة كاسم مناسب. يستخدم ملف العنوان الذي تم إنشاؤه لتضمين الرمز AID_<name> نفسه.

يُعد تحديد أقسام متعددة باستخدام نفسه (غير حساسة لحالة الأحرف مع القيود نفسها التي تنطبق على [path]) خطأً.

<name> يجب أن يبدأ باسم قسم لضمان عدم تعارضه مع مصادر مختلفة.AID_<name>
value <number> سلسلة أرقام صالحة بتنسيق 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)

للاطّلاع على أمثلة على الاستخدام، يُرجى الرجوع إلى تحديد أسماء معرّفات Android الخاصة بمصنّع المعدات الأصلية واستخدام معرّفات Android الخاصة بمصنّع المعدات الأصلية.

أمثلة على استخدام هذه الكلمة في جملة

توضّح الأمثلة التالية كيفية تحديد معرّف Android خاص بمصنّع المعدات الأصلية واستخدامه وكيفية تفعيل إمكانات نظام الملفات. يجب أن تبدأ أسماء معرّفات Android الخاصة بمصنّع المعدات الأصلية ([AID_name]) باسم قسم، مثل "vendor_" لضمان عدم تعارضها مع أسماء AOSP المستقبلية أو الأقسام الأخرى.

تحديد أسماء معرّفات Android الخاصة بمصنّع المعدات الأصلية

لتحديد معرّف Android خاص بمصنّع المعدات الأصلية، أنشئ ملف config.fs واضبط قيمة معرّف Android. على سبيل المثال، في 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

يمكن الآن للنظام بشكل عام استخدام معرّف Android المخصّص في إصدار جديد.

استخدام معرّفات Android الخاصة بمصنّع المعدات الأصلية

لاستخدام معرّف Android خاص بمصنّع المعدات الأصلية، ضِّمن oemaids_headers في ملف Makefile المرتبط في رمز C، وأضِف #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، يمكنك استخدام الاسم المناسب لأي واجهة تتيح أسماء معرّفات Android. على سبيل المثال:

  • في أمر 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 ربط اسم مناسب بقيمة معرّف Android الفعلي الخاص بمصنّع المعدات الأصلية. يمكنك استخدام وسيطات السلسلة غير الرقمية للمستخدم والمجموعة، أي "vendor_foo" بدلاً من "2901".

التحويل من معرّف Android إلى الأسماء المناسبة

بالنسبة إلى معرّفات Android الخاصة بمصنّع المعدات الأصلية، كان الإصدار 8.x من Android يتطلب استخدام oem_#### مع getpwnam والدوال المشابهة، بالإضافة إلى الأماكن التي تعالج عمليات البحث باستخدام getpwnam (مثل init البرمجية). في Android 9، يمكنك استخدام الدوال getpwnam وgetgrnam في Bionic للتحويل من معرّفات Android إلى الأسماء المناسبة والعكس.

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

لتفعيل إمكانات نظام الملفات، أنشئ قسم الإمكانات في ملف 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 ويمكن حذفها.

ضبط عمليات الإلغاء (الإصداران 6.x و7.x من Android)

في Android 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 في إعداد اللوحة ، مع اسم أساسي إلزامي هو 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. يُرجى مراعاة ما يلي:

  • كل إدخال في البنية هو الوضع ورقم تعريف المستخدم ورقم تعريف المجموعة والإمكانات والاسم. system/core/include/private/android_filesystem_config.h يتم تضمينه تلقائيًا لتوفير `define` في البيان (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 file system
+** 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.
  • يحتفظ Android بالحق في تطبيق عناصر التحكّم الإلزامية في الوصول (MAC) في SELinux على ملفات الإعداد على النظام المستهدف، ويجب أن تضمن عمليات التنفيذ التي تتضمّن ملفات تنفيذية مخصّصة للهدف باستخدام fs_config() إمكانية الوصول.