إعداد المورّد

تتمتّع عملية init بأذونات غير محدودة تقريبًا، وتستخدم نصوصًا برمجية للإدخال من كل من قسمَي النظام والمورّد من أجل تهيئة النظام أثناء عملية التشغيل. يؤدي هذا الوصول إلى ثغرة كبيرة في تقسيم النظام/المورّد في Treble، لأنّ نصوص المورّد البرمجية قد توجّه عملية init إلى الوصول إلى الملفات والخصائص وما إلى ذلك التي لا تشكّل جزءًا من واجهة ثنائية للتطبيق مستقرة بين النظام والمورّد (ABI).

تم تصميم Vendor init لسدّ هذه الثغرة من خلال استخدام نطاق vendor_init منفصل في نظام التشغيل Linux المحسّن للأمان (SELinux) لتنفيذ الأوامر الواردة في /vendor بأذونات خاصة بالمورّد.

الآلية

تنشئ عملية init الخاصة بالمورّد نسخة من عملية init كعملية فرعية في وقت مبكر من عملية التشغيل باستخدام سياق SELinux u:r:vendor_init:s0. يتمتع سياق SELinux هذا بعدد أقل بكثير من الأذونات مقارنةً بسياق init التلقائي، ويقتصر وصوله على الملفات والخصائص وما إلى ذلك التي تكون إما خاصة بالمورّد أو جزءًا من واجهة ABI الثابتة بين النظام والمورّد.

يتحقّق برنامج init من كل نص برمجي يتم تحميله لمعرفة ما إذا كان مساره يبدأ بـ /vendor، وإذا كان الأمر كذلك، يضع علامة عليه للإشارة إلى أنّه يجب تنفيذ أوامره في سياق init الخاص بالمورّد. يتم إضافة تعليق توضيحي إلى كل دالة init مدمجة باستخدام قيمة منطقية تحدد ما إذا كان يجب تشغيل الأمر في العملية الفرعية vendor init أم لا:

  • يتم وضع تعليقات توضيحية على معظم الأوامر التي تصل إلى نظام الملفات لتشغيلها في العملية الفرعية vendor init، وبالتالي تخضع لسياسة الأمان (SEPolicy) الخاصة بـ vendor init.
  • يتم تنفيذ معظم الأوامر التي تؤثر في حالة بدء التشغيل الداخلية (مثل بدء الخدمات وإيقافها) ضمن عملية بدء التشغيل العادية. يتم إعلام هذه الأوامر بأنّ البرنامج النصي الخاص بالمورّد يستدعيها لتنفيذ عملية معالجة الأذونات غير المتعلّقة بنظام SELinux.

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

استخدام عملية الإعداد الخاصة بالمورّد

يكون خيار Vendor init مفعَّلاً تلقائيًا، وتنطبق قيوده على جميع نصوص init البرمجية الموجودة في القسم /vendor. يجب أن يكون إعداد البائع شفافًا للبائعين الذين لا تصل نصوصهم البرمجية إلى ملفات النظام وخصائصه وما إلى ذلك.

ومع ذلك، إذا كانت الأوامر في نص برمجي خاص بمورّد معيّن تنتهك القيود المفروضة على عملية إعداد المورّد، سيتعذّر تنفيذ الأوامر. تحتوي الأوامر التي يتعذّر تنفيذها على سطر في سجلّ النواة (يمكن الاطّلاع عليه باستخدام dmesg) من عملية init يشير إلى تعذّر التنفيذ. تتضمّن عملية تدقيق SELinux أي أمر غير ناجح تعذّر تنفيذه بسبب سياسة SELinux. مثال على خطأ يتضمّن تدقيق SELinux:

type=1400 audit(1511821362.996:9): avc: denied { search } for pid=540 comm="init" name="nfc" dev="sda45" ino=1310721 scontext=u:r:vendor_init:s0 tcontext=u:object_r:nfc_data_file:s0 tclass=dir permissive=0
init: Command 'write /data/nfc/bad_file_access 1234' action=boot (/vendor/etc/init/hw/init.walleye.rc:422) took 2ms and failed: Unable to write to file '/data/nfc/bad_file_access': open() failed: Permission denied

إذا تعذّر تنفيذ أمر، يتوفّر خياران:

  • إذا كان الأمر يتعذّر تنفيذه بسبب قيود مقصودة (مثل إذا كان الأمر يصل إلى ملف أو سمة نظام)، يجب إعادة تنفيذ الأمر بطريقة متوافقة مع Treble، وذلك من خلال واجهات ثابتة فقط. تمنع قواعد Neverallow إضافة أذونات للوصول إلى ملفات النظام التي لا تشكّل جزءًا من واجهة ABI الثابتة بين النظام والمورّد.
  • إذا كان تصنيف SELinux جديدًا ولم يتم منح أذونات له في vendor_init.te النظام أو استبعاد أذونات من خلال قواعد neverallow، قد يتم منح التصنيف الجديد أذونات في vendor_init.te الخاص بالجهاز.

بالنسبة إلى الأجهزة التي تم طرحها قبل Android 9، يمكن تجاوز قواعد neverallows من خلال إضافة السمة data_between_core_and_vendor_violators إلى الملف vendor_init.te الخاص بالجهاز.

مواقع الرموز

يتم تنفيذ الجزء الأكبر من منطق عملية الاتصال بين العمليات (IPC) الخاصة بتهيئة المورّد في system/core/init/subcontext.cpp.

يتوفّر جدول الأوامر في الفئة BuiltinFunctionMap في system/core/init/builtins.cpp ويتضمّن تعليقات توضيحية تشير إلى ما إذا كان يجب تنفيذ الأمر في العملية الفرعية vendor init.

يتم تقسيم SEPolicy الخاص ببرنامج vendor init بين الدليلين الخاص (system/sepolicy/private/vendor_init.te) والعام (system/sepolicy/public/vendor_init.te) في system/sepolicy.