تلتزم Google بتعزيز المساواة العرقية للمجتمعات السوداء. أنظر كيف.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

البائع الأولي

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

تم تصميم الحرف الأول البائع لإغلاق هذا الثقب باستخدام تعزيز الأمن لينكس (سيلينو) نطاق منفصل vendor_init لتشغيل الأوامر وجدت في /vendor مع أذونات بائع محددة.

آلية

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

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

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

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

استخدام البائع الأولية

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

ومع ذلك ، إذا انتهكت الأوامر الموجودة في البرنامج النصي الخاص ببائع معين قيود تهيئة البائع ، فستفشل الأوامر. الأوامر الفاشلة لها خط في سجل النواة (مرئي مع dmesg) من التهيئة تشير إلى الفشل. يرافق تدقيق 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

إذا فشل الأمر ، فهناك خياران:

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

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

مواقع الرمز

الجزء الأكبر من المنطق الخاص ببائع init الأول الخاص بالمورد موجود في system / core / init / subcontext.cpp .

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

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