سياسة بناء SELinux

تتناول هذه المقالة كيفية بناء سياسة SELinux. تم بناء سياسة SELinux من مزيج من سياسة AOSP الأساسية (النظام الأساسي) والسياسة الخاصة بالجهاز (البائع). دمج تدفق بناء سياسة SELinux لنظام Android 4.4 حتى Android 7.0 جميع أجزاء sepolicy ثم إنشاء ملفات متجانسة في الدليل الجذر. هذا يعني أن بائعي SoC ومصنعي ODM قاموا بتعديل boot.img (للأجهزة غير A / B) أو system.img (لأجهزة A / B) في كل مرة يتم فيها تعديل السياسة.

في Android 8.0 والإصدارات الأحدث ، تم إنشاء النظام الأساسي وسياسة البائع بشكل منفصل. يمكن لشركات SOC و OEM تحديث أجزائها من السياسة ، وبناء صورهم (مثل ، vendor.img و boot.img ) ، ثم تحديث تلك الصور بشكل مستقل عن تحديثات النظام الأساسي.

ومع ذلك ، نظرًا لأنه يتم تخزين ملفات سياسة SELinux المعيارية على أقسام /vendor ، يجب أن تقوم عملية init بتركيب أقسام النظام والمورد مسبقًا حتى تتمكن من قراءة ملفات SELinux من تلك الأقسام ودمجها مع ملفات SELinux الأساسية في دليل النظام (قبل تحميلها في النواة).

ملفات المصدر

منطق بناء SELinux موجود في هذه الملفات:

  • external/selinux : مشروع SELinux خارجي ، يستخدم لبناء أدوات مساعدة لسطر أوامر HOST لتجميع سياسة SELinux والتسميات.
    • external/selinux/libselinux : يستخدم Android مجموعة فرعية فقط من مشروع libselinux الخارجي جنبًا إلى جنب مع بعض التخصيصات الخاصة بنظام Android. للحصول على التفاصيل ، راجع external/selinux/README.android .
    • external/selinux/libsepol :
      • chkcon : تحديد ما إذا كان سياق الأمان صالحًا لسياسة ثنائية معينة (مضيف قابل للتنفيذ).
      • libsepol : مكتبة SELinux لمعالجة سياسات الأمن الثنائي (مكتبة مضيفة ثابتة / مشتركة ، مكتبة ثابتة مستهدفة).
    • external/selinux/checkpolicy : برنامج التحويل البرمجي لسياسة SELinux (الملفات التنفيذية للمضيف: checkpolicy ، checkmodule ، و dispol ). يعتمد على libsepol .
  • system/sepolicy : تكوينات سياسة SELinux لنظام Android الأساسي ، بما في ذلك السياقات وملفات السياسة. المنطق الرئيسي لبناء سياسة الانقطاع موجود هنا أيضًا ( system/sepolicy/Android.mk ).

لمزيد من التفاصيل حول الملفات الموجودة في system/sepolicy Implementing SELinux .

Android 7.0 والإصدارات الأقدم

يتناول هذا القسم كيفية إنشاء سياسة SELinux في Android 7.x والإصدارات الأقدم.

سياسة بناء SELinux

يتم إنشاء سياسة SELinux من خلال الجمع بين سياسة AOSP الأساسية والتخصيصات الخاصة بالجهاز. يتم بعد ذلك تمرير السياسة المجمعة إلى مجمع السياسة ومدققات مختلفة. يتم إجراء التخصيص الخاص بالجهاز من خلال متغير BOARD_SEPOLICY_DIRS المحدد في ملف Boardconfig.mk الخاص بالجهاز. يحتوي متغير البناء العام هذا على قائمة بالدلائل التي تحدد الترتيب الذي يتم البحث فيه عن ملفات السياسة الإضافية.

على سبيل المثال ، قد يضيف كل من بائع SoC و ODM دليلاً ، واحدًا للإعدادات الخاصة بـ SoC والآخر للإعدادات الخاصة بالجهاز ، لإنشاء تكوينات SELinux النهائية لجهاز معين:

  • BOARD_SEPOLICY_DIRS += device/ SOC /common/sepolicy
  • BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy

يتم تجميع محتوى ملفات file_contexts في system/sepolicy و BOARD_SEPOLICY_DIRS لإنشاء ملف file_contexts.bin على الجهاز:

تُظهر هذه الصورة منطق إنشاء SELinux لنظام Android 7.x.
الشكل 1 . منطق بناء SELinux

يتكون ملف sepolicy من ملفات مصدر متعددة:

  • يتم إنشاء policy.conf للنص العادي عن طريق ربط فئات security_classes و initial_sids وملفات *.te و genfs_contexts و port_contexts بهذا الترتيب.
  • لكل ملف (مثل security_classes ) ، يكون محتواه عبارة عن سلسلة من الملفات التي تحمل الاسم نفسه ضمن system/sepolicy/ و BOARDS_SEPOLICY_DIRS .
  • يتم إرسال policy.conf إلى برنامج التحويل البرمجي SELinux للتحقق من بناء الجملة ويتم تجميعه في تنسيق ثنائي sepolicy على الجهاز.
    تُظهر هذه الصورة الملفات التي تنشئ ملف سياسة SELinux لنظام Android 7.x.
    الشكل 2 . ملف سياسة SELinux

ملفات SELinux

بعد التجميع ، عادةً ما تحتوي أجهزة Android التي تعمل بنظام 7.x والإصدارات الأقدم على الملفات التالية المتعلقة بـ SELinux:

  • selinux_version
  • sepolicy: إخراج ثنائي بعد دمج ملفات السياسة (مثل ، security_classes ، و initial_sids ، و *.te )
  • file_contexts
  • property_contexts
  • seapp_contexts
  • service_contexts
  • system/etc/mac_permissions.xml

لمزيد من التفاصيل ، راجع تنفيذ SELinux .

تهيئة SELinux

عند بدء تشغيل النظام ، يكون SELinux في وضع السماح (وليس في وضع الإنفاذ). تؤدي عملية init المهام التالية:

  • يقوم بتحميل الملفات sepolicy من ramdisk إلى النواة من خلال /sys/fs/selinux/load .
  • يحول SELinux إلى وضع الإنفاذ.
  • يقوم بتشغيل re-exec() لتطبيق قاعدة مجال SELinux على نفسه.

لتقصير وقت التمهيد ، قم بإجراء re-exec() في عملية init في أسرع وقت ممكن.

Android 8.0 والإصدارات الأحدث

في Android 8.0 ، يتم تقسيم سياسة SELinux إلى مكونات النظام الأساسي والمورد للسماح بتحديثات سياسة النظام الأساسي / البائع المستقل مع الحفاظ على التوافق.

يتم تقسيم النظام الأساسي إلى أجزاء خاصة بالنظام الأساسي وأجزاء عامة للنظام الأساسي لتصدير أنواع وسمات معينة إلى كتّاب سياسة البائعين. يتم ضمان الحفاظ على الأنواع / السمات العامة للنظام الأساسي كواجهات برمجة تطبيقات ثابتة لإصدار نظام أساسي معين. يمكن ضمان التوافق مع الأنواع / السمات العامة للنظام الأساسي السابق للعديد من الإصدارات باستخدام ملفات تعيين النظام الأساسي.

المنصة العامة للسياسة العامة

تتضمن السياسة العامة للنظام الأساسي كل ما هو محدد في system/sepolicy/public . يمكن للنظام الأساسي أن يفترض أن الأنواع والسمات المحددة بموجب السياسة العامة هي واجهات برمجة تطبيقات ثابتة لإصدار نظام أساسي معين. يشكل هذا جزءًا من السياسة المنفصلة التي يتم تصديرها بواسطة النظام الأساسي والتي قد يكتب عليها مطورو سياسة البائع (أي الجهاز) سياسة إضافية خاصة بالجهاز.

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

المنصة الخاصة

يتضمن نظام الحماية الخاص بالمنصة كل ما تم تعريفه ضمن /system/sepolicy/private . يشكل هذا الجزء من السياسة أنواعًا وأذونات وسمات خاصة بالنظام الأساسي فقط مطلوبة لوظائف النظام الأساسي. لا يتم تصديرها إلى كتّاب سياسة vendor/device . يجب ألا يكتب كتّاب السياسة خارج النظام الأساسي امتدادات السياسة الخاصة بهم بناءً على الأنواع / السمات / القواعد المحددة في سياسة النظام الأساسي الخاصة. علاوة على ذلك ، يُسمح بتعديل هذه القواعد أو قد تختفي كجزء من تحديث إطار العمل فقط.

منصة الخرائط الخاصة

يتضمن تعيين النظام الأساسي الخاص بيانات السياسة التي تحدد السمات المعروضة في السياسة العامة للنظام الأساسي لإصدارات النظام الأساسي السابقة للأنواع الملموسة المستخدمة في السياسة العامة للنظام الأساسي الحالي. يضمن ذلك استمرار عمل سياسة البائع التي تمت كتابتها استنادًا إلى السمات العامة للنظام الأساسي من إصدار (إصدارات) السياسة العامة السابقة للنظام الأساسي. يعتمد تعيين الإصدار على مجموعة متغير البناء PLATFORM_SEPOLICY_VERSION في AOSP لإصدار نظام أساسي معين. يوجد ملف تعيين منفصل لكل إصدار نظام أساسي سابق من المتوقع أن يقبل منه هذا النظام الأساسي سياسة البائع. لمزيد من التفاصيل ، راجع التوافق .

Android 11 والإصدارات الأحدث

نص_ النظام وفصل المنتج

في Android 11 ، تمت إضافة سياسة system_ext وسياسة المنتج. مثل سياسة النظام الأساسي ، يتم تقسيم سياسة system_ext وسياسة المنتج إلى سياسة عامة وسياسة خاصة.

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

تحتوي السياسة الخاصة على أنواع وأذونات وسمات خاصة بالنص النظام فقط وأنواع المنتج فقط المطلوبة لوظيفة نص النظام وأقسام المنتج. السياسة الخاصة غير مرئية للبائع ، مما يعني أن هذه القواعد داخلية ويسمح بتعديلها.

نص_ النظام ورسم خرائط المنتج

يُسمح لـ system_ext والمنتج بتصدير الأنواع العامة المعينة إلى البائع. ومع ذلك ، فإن مسؤولية الحفاظ على التوافق تقع على عاتق كل شريك. من أجل التوافق ، يمكن للشركاء توفير ملفات الخرائط الخاصة بهم والتي تعين سمات النسخ للإصدارات السابقة للأنواع الملموسة المستخدمة في السياسة العامة الحالية.

  • لتثبيت ملف تعيين لـ system_ext ، ضع ملف cil يحتوي على معلومات التعيين المرغوبة لـ {SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil ، ثم أضف system_ext_{ver}.cil إلى PRODUCT_PACKAGES .
  • لتثبيت ملف تعيين للمنتج ، ضع ملف cil يحتوي على معلومات التعيين المطلوبة إلى {PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil ، ثم أضف product_{ver}.cil إلى PRODUCT_PACKAGES .
  • راجع أحد الأمثلة التي تضيف ملف تعيين لقسم منتج جهاز redbull.

    سياسة بناء SELinux

    تم وضع سياسة SELinux في Android 8.0 من خلال الجمع بين القطع من /system و /vendor . المنطق الخاص بإعداد هذا بشكل مناسب موجود في /platform/system/sepolicy/Android.mk .

    السياسة موجودة في المواقع التالية:

    موقع يتضمن
    system/sepolicy/public واجهة برمجة تطبيقات النظام الأساسي
    system/sepolicy/private تفاصيل تنفيذ النظام الأساسي (يمكن للموردين تجاهلها)
    system/sepolicy/vendor ملفات السياسة والسياق التي يمكن للبائعين استخدامها (يمكن للبائعين تجاهلها إذا رغبت في ذلك)
    BOARD_SEPOLICY_DIRS سياسة البائع
    BOARD_ODM_SEPOLICY_DIRS (Android 9 والإصدارات الأحدث) Odm sepolicy
    SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) System_ext's sepolicy API
    SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) تفاصيل تنفيذ System_ext (يمكن للموردين تجاهلها)
    PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) واجهة برمجة التطبيقات الخاصة بالمنتج
    PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) تفاصيل تنفيذ المنتج (يمكن للموردين تجاهلها)

    يأخذ نظام البناء هذه السياسة وينتج مكونات سياسة النظام ، والنص النظام ، والمنتج ، والبائع ، و ODM في القسم المقابل. تشمل الخطوات ما يلي:

    1. تحويل السياسات إلى تنسيق SELinux Common Intermediate Language (CIL) ، على وجه التحديد:
      1. سياسة النظام الأساسي العام (نظام + نص_نظام + منتج)
      2. سياسة خاصة + عامة مشتركة
      3. سياسة البائع + البائع و BOARD_SEPOLICY_DIRS
    2. إصدار السياسة المقدمة من قبل الجمهور كجزء من سياسة البائع. يتم ذلك باستخدام سياسة CIL العامة المنتجة لإبلاغ السياسة العامة + المورد + BOARD_SEPOLICY_DIRS فيما يتعلق بالأجزاء التي يجب تحويلها إلى سمات سيتم ربطها بسياسة النظام الأساسي.
    3. إنشاء ملف خرائط يربط بين النظام الأساسي وأجزاء البائع. في البداية ، يربط هذا فقط الأنواع من السياسة العامة بالسمات المقابلة في سياسة البائع ؛ لاحقًا ، سيوفر أيضًا الأساس للملف المحفوظ في إصدارات النظام الأساسي المستقبلية ، مما يتيح التوافق مع سياسة البائع التي تستهدف إصدار النظام الأساسي هذا.
    4. دمج ملفات السياسة (صِف كلاً من الحلول الموجودة على الجهاز والحلول المترجمة مسبقًا).
      1. اجمع بين سياسة الخرائط والنظام الأساسي والمورد.
      2. تجميع ملف الإخراج ثنائي السياسة.

    سياسة SELinux المجمعة مسبقًا

    قبل أن init بتشغيل SELinux ، يجمع init جميع ملفات CIL من الأقسام ( system ، system_ext ، product ، vendor ، odm ) ويجمعها في سياسة ثنائية ، التنسيق الذي يمكن تحميله إلى kernel. نظرًا لأن التجميع يستغرق وقتًا (عادةً 1-2 ثانية) ، يتم تجميع ملفات CIL مسبقًا في وقت الإنشاء ووضعها في إما /vendor/etc/selinux/precompiled_sepolicy أو /odm/etc/selinux/precompiled_sepolicy ، جنبًا إلى جنب مع تجزئات sha256 من ملفات CIL المدخلات. في وقت التشغيل ، يتحقق init مما إذا كان قد تم تحديث أي من ملفات السياسة عن طريق مقارنة التجزئة. إذا لم يتغير شيء ، يقوم init بتحميل السياسة المترجمة مسبقًا. إذا لم يكن الأمر كذلك ، فإن init تقوم بالتجميع السريع وتستخدمها بدلاً من المترجمة مسبقًا.

    وبشكل أكثر تحديدًا ، يتم استخدام السياسة المترجمة مسبقًا في حالة استيفاء جميع الشروط التالية. هنا ، يمثل {partition} القسم حيث توجد السياسة المترجمة مسبقًا: إما vendor أو odm .

    • كلاهما /system/etc/selinux/plat_sepolicy_and_mapping.sha256 و /{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256 موجودان ومتطابقان.
    • كلا /system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256 و /{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256 غير موجودين. أو كلاهما موجود ومتطابق.
    • كلا /product/etc/selinux/product_sepolicy_and_mapping.sha256 و /{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256 غير موجودين. أو كلاهما موجود ومتطابق.

    في حالة اختلاف أي منها ، تعود init إلى مسار الترجمة على الجهاز. راجع system/core/init/selinux.cpp لمزيد من التفاصيل.