تتناول هذه المقالة كيفية بناء سياسة 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
: -
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
على الجهاز:

يتكون ملف sepolicy
من ملفات مصدر متعددة:
- يتم إنشاء
policy.conf
للنص العادي عن طريق ربط فئاتsecurity_classes
وinitial_sids
وملفات*.te
وgenfs_contexts
وport_contexts
بهذا الترتيب. - لكل ملف (مثل
security_classes
) ، يكون محتواه عبارة عن سلسلة من الملفات التي تحمل الاسم نفسه ضمنsystem/sepolicy/
وBOARDS_SEPOLICY_DIRS
. - يتم إرسال
policy.conf
إلى برنامج التحويل البرمجي SELinux للتحقق من بناء الجملة ويتم تجميعه في تنسيق ثنائيsepolicy
على الجهاز.الشكل 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 Common Intermediate Language (CIL) ، على وجه التحديد:
- سياسة النظام الأساسي العام (نظام + نص_نظام + منتج)
- سياسة خاصة + عامة مشتركة
- سياسة البائع + البائع و
BOARD_SEPOLICY_DIRS
- إصدار السياسة المقدمة من قبل الجمهور كجزء من سياسة البائع. يتم ذلك باستخدام سياسة CIL العامة المنتجة لإبلاغ السياسة العامة + المورد +
BOARD_SEPOLICY_DIRS
فيما يتعلق بالأجزاء التي يجب تحويلها إلى سمات سيتم ربطها بسياسة النظام الأساسي. - إنشاء ملف خرائط يربط بين النظام الأساسي وأجزاء البائع. في البداية ، يربط هذا فقط الأنواع من السياسة العامة بالسمات المقابلة في سياسة البائع ؛ لاحقًا ، سيوفر أيضًا الأساس للملف المحفوظ في إصدارات النظام الأساسي المستقبلية ، مما يتيح التوافق مع سياسة البائع التي تستهدف إصدار النظام الأساسي هذا.
- دمج ملفات السياسة (صِف كلاً من الحلول الموجودة على الجهاز والحلول المترجمة مسبقًا).
- اجمع بين سياسة الخرائط والنظام الأساسي والمورد.
- تجميع ملف الإخراج ثنائي السياسة.
- كلاهما
/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
غير موجودين. أو كلاهما موجود ومتطابق.
سياسة بناء 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 في القسم المقابل. تشمل الخطوات ما يلي:
سياسة 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
.
في حالة اختلاف أي منها ، تعود init
إلى مسار الترجمة على الجهاز. راجع system/core/init/selinux.cpp
لمزيد من التفاصيل.