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

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

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

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

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

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

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

أزال Android 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

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

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

إعداد قسم الأحرف الكبيرة

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

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

يستخدم قسم الأحرف الكبيرة الصيغة التالية:

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

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

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

ضبط قسم AID

يحتوي قسم AID على معرّفات المُصنّع الأصلي للجهاز ويستخدم الصيغة التالية:

القسم القيمة التعريف
[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)

للاطّلاع على أمثلة على الاستخدام، راجِع تعريف المصنّع الأصلي للجهاز. أسماء AID واستخدام AIDs من قِبل المصنّعين الأصليين

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

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

تحديد أسماء AID للمصنّع الأصلي للجهاز

لتحديد معرّف AID للمصنّع الأصلي للجهاز، يجب إنشاء ملف 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 المخصّصة في إصدار جديد.

استخدام معرّفات المصنّعين الأصليين للأجهزة

لاستخدام AID من مُصنّع أصلي، يجب تضمين oemaids_headers في الرمز C في رمز C 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. مثلاً:

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

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

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

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

لتمكين إمكانات نظام الملفات، أنشئ قسمًا للأحرف الكبيرة في ملف 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)

غيّر الإصدار 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 هو تم تضمينها تلقائيًا لتوفير #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 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 والإصدارات الأقدم، ضَع في اعتبارك ما يلي: الإصدار 6.x من نظام التشغيل Android

  • إزالة بعض التعريفات والبنى والتعريفات المضمَّنة.
  • يجب الإشارة إلى 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) في SELinux على على النظام الهدف، وعمليات التنفيذ التي تتضمن الملفات التنفيذية المستهدفة التي تستخدم fs_config() يجب أن تضمن إمكانية الوصول.