این صفحه توضیح میدهد که Android چگونه مشکلات سازگاری خطمشی را با بهروزرسانیهای فرا-هوای پلتفرم (OTA) مدیریت میکند، جایی که تنظیمات SELinux پلتفرم جدید ممکن است با تنظیمات SELinux فروشنده قدیمی متفاوت باشد.
مالکیت اشیا و برچسب گذاری
مالکیت باید به وضوح برای هر شی تعریف شود تا خط مشی پلتفرم و فروشنده جدا بماند. برای مثال، اگر خطمشی فروشنده برچسب /dev/foo و خطمشی پلتفرم برچسب /dev/foo در OTA بعدی بگذارد، رفتار نامشخصی مانند انکار غیرمنتظره یا مهمتر از آن، خرابی بوت وجود دارد. برای SELinux، این به عنوان یک برخورد برچسب نشان می دهد. گره دستگاه می تواند تنها یک برچسب داشته باشد که به هر برچسبی که آخرین بار اعمال می شود، حل می شود. در نتیجه:
- فرآیندهایی که نیاز به دسترسی به برچسب ناموفق اعمال شده دارند، دسترسی به منبع را از دست می دهند.
- فرآیندهایی که به فایل دسترسی پیدا می کنند ممکن است به دلیل ایجاد گره دستگاه اشتباه شکسته شوند.
برخورد بین برچسبهای پلتفرم و فروشنده میتواند برای هر شی که دارای برچسب SELinux باشد، از جمله ویژگیها، سرویسها، فرآیندها، فایلها و سوکتها رخ دهد. برای جلوگیری از این مسائل، مالکیت این اشیاء را به وضوح تعریف کنید.
فاصله نام تایپ/ویژگی
علاوه بر برخورد برچسب ها، نام های نوع و ویژگی SELinux نیز می توانند با هم برخورد کنند. SELinux اجازه نمی دهد چندین اعلان از انواع و ویژگی های یکسان وجود داشته باشد. خطمشی با اعلانهای تکراری تدوین نمیشود. برای جلوگیری از برخورد نام نوع و ویژگی، همه اعلانهای فروشنده توصیه میشود که با پیشوند vendor_ شروع شوند. به عنوان مثال، فروشندگان باید type vendor_foo, domain; به جای type foo, domain; .
مالکیت فایل
جلوگیری از برخورد برای فایلها چالش برانگیز است زیرا پلتفرم و سیاست فروشنده هر دو معمولاً برچسبهایی را برای همه سیستمهای فایل ارائه میکنند. بر خلاف نامگذاری نوع، فاصله نام فایل ها عملی نیست زیرا بسیاری از آنها توسط هسته ایجاد می شوند. برای جلوگیری از این برخوردها، راهنمای نامگذاری فایل سیستم ها را در این بخش دنبال کنید. برای اندروید 8.0، اینها توصیه هایی بدون اعمال فنی هستند. در آینده، این توصیهها توسط مجموعه تست فروشنده (VTS) اعمال خواهند شد.
سیستم (/سیستم)
فقط تصویر سیستم باید از طریق file_contexts ، service_contexts و غیره برای اجزای /system برچسبهایی ارائه کند. اگر برچسبهایی برای اجزای /system در خطمشی فروشنده اضافه شود، ممکن است بهروزرسانی OTA فقط چارچوبی امکانپذیر نباشد.
فروشنده (/فروشنده)
خطمشی AOSP SELinux قبلاً قسمتهایی از پارتیشن vendor را که پلتفرم با آن تعامل دارد برچسبگذاری میکند، که نوشتن قوانین SELinux را برای فرآیندهای پلتفرم قادر میسازد تا بتوانند به بخشهایی از پارتیشن vendor دسترسی داشته باشند یا صحبت کنند. مثال ها:
| /مسیر فروشنده | برچسب ارائه شده توسط پلتفرم | فرآیندهای پلت فرم بسته به برچسب |
|---|---|---|
/vendor(/. * )? | vendor_file | همه کلاینت های HAL در فریم ورک، ueventd و غیره. |
/vendor/framework(/. * )? | vendor_framework_file | dex2oat ، appdomain و غیره |
/vendor/app(/. * )? | vendor_app_file | dex2oat ، installd ، idmap و غیره. |
/vendor/overlay(/. * ) | vendor_overlay_file | system_server ، zygote ، idmap و غیره |
در نتیجه، هنگام برچسب زدن فایلهای اضافی در پارتیشن vendor ، قوانین خاصی باید دنبال شوند (از طریق neverallows اجرا میشوند):
-
vendor_fileباید برچسب پیش فرض برای همه فایل های پارتیشنvendorباشد. خط مشی پلتفرم به این نیاز دارد تا به پیاده سازی های HAL از طریق عبور دسترسی داشته باشد. - همه
exec_typesجدید اضافه شده در پارتیشنvendorاز طریق سیاست فروشنده باید ویژگیvendor_file_typeداشته باشند. این از طریق neverallows اجرا می شود. - برای جلوگیری از درگیری با بهروزرسانیهای پلتفرم/چارچوب آینده، از برچسبگذاری فایلهای غیر از
exec_typesدر پارتیشنvendorخودداری کنید. - همه وابستگیهای کتابخانه برای HALهای فرآیندی شناساییشده توسط AOSP باید بهعنوان
same_process_hal_file.
Procfs (/proc)
فایلهای موجود در /proc را میتوان تنها با استفاده از برچسب genfscon برچسبگذاری کرد. در Android 7.0، هم پلتفرم و هم خطمشی فروشنده از genfscon برای برچسبگذاری فایلها در procfs استفاده میکردند.
توصیه: فقط برچسبهای خط مشی پلتفرم /proc . اگر فرآیندهای فروشنده نیاز به دسترسی به فایلهایی در /proc دارند که در حال حاضر با برچسب پیشفرض ( proc ) برچسبگذاری شدهاند، خطمشی فروشنده نباید بهصراحت آنها را برچسبگذاری کند و در عوض باید از نوع proc عمومی برای افزودن قوانین برای دامنههای فروشنده استفاده کند. این به بهروزرسانیهای پلتفرم اجازه میدهد تا رابطهای هسته آینده را که از طریق procfs در معرض دید قرار میگیرند، تطبیق دهد و آنها را به صراحت در صورت نیاز برچسبگذاری کند.
اشکال زدایی (/sys/kernel/debug)
Debugfs می توان هم در file_contexts و هم genfscon برچسب گذاری کرد. در اندروید 7.0 تا اندروید 10، هم پلتفرم و هم برچسب فروشنده debugfs .
در اندروید 11، debugfs قابل دسترسی نیست یا روی دستگاه های تولیدی نصب می شود. سازندگان دستگاه باید debugfs حذف کنند.
Tracefs (/sys/kernel/debug/tracing)
Tracefs می توان هم در file_contexts و هم genfscon برچسب گذاری کرد. در Android 7.0، فقط پلتفرم tracefs را برچسب گذاری می کند.
توصیه: فقط پلتفرم میتواند tracefs برچسبگذاری کند.
Sysfs (/sys)
فایلهای موجود در /sys ممکن است با استفاده از file_contexts و genfscon برچسبگذاری شوند. در Android 7.0، هم پلتفرم و هم فروشنده از genfscon برای برچسب زدن فایلها در sysfs استفاده میکنند.
توصیه: پلتفرم ممکن است گرههای sysfs را که مختص دستگاه نیستند برچسبگذاری کند. در غیر این صورت، فقط فروشنده می تواند فایل ها را برچسب گذاری کند.
tmpfs (/dev)
فایلهای موجود در /dev ممکن است در file_contexts برچسبگذاری شوند. در Android 7.0، هم پلتفرم و هم برچسب فروشنده در اینجا فایل میشوند.
توصیه: فروشنده ممکن است فقط فایلها را در /dev/vendor برچسب بزند (به عنوان مثال، /dev/vendor/foo ، /dev/vendor/socket/bar ).
Rootfs (/)
فایل های موجود در / ممکن است در file_contexts برچسب گذاری شوند. در Android 7.0، فایلهای برچسب پلتفرم و فروشنده در اینجا هستند.
توصیه: فقط سیستم میتواند فایلها را در / برچسبگذاری کند.
داده (/داده)
داده ها از طریق ترکیبی از file_contexts و seapp_contexts برچسب گذاری می شوند.
توصیه: برچسبگذاری فروشنده خارج از /data/vendor را ممنوع کنید. فقط پلتفرم میتواند سایر بخشهای /data را برچسبگذاری کند.
نسخه برچسب Genfs
با شروع API فروشنده سطح 202504، برچسبهای SELinux جدیدتر که با genfscon در system/sepolicy/compat/plat_sepolicy_genfs_ ver .cil اختصاص داده شدهاند، برای پارتیشنهای vendor قدیمیتر اختیاری هستند. این به پارتیشن های vendor قدیمی اجازه می دهد تا اجرای SEPolicy موجود خود را حفظ کنند. این توسط متغیر Makefile BOARD_GENFS_LABELS_VERSION کنترل می شود که در /vendor/etc/selinux/genfs_labels_version.txt ذخیره می شود.
مثال:
- در فروشنده API سطح 202404، گره
/sys/class/udcبه طور پیشفرض برچسبsysfsدارد. - با شروع API فروشنده 202504،
/sys/class/udcدارای برچسبsysfs_udcاست.
با این حال، /sys/class/udc ممکن است توسط پارتیشنهای vendor با استفاده از سطح API 202404، چه با برچسب sysfs پیشفرض یا یک برچسب خاص فروشنده، استفاده شود. برچسب زدن بدون قید و شرط /sys/class/udc به عنوان sysfs_udc می تواند سازگاری با این پارتیشن های vendor را از بین ببرد. با علامت زدن BOARD_GENFS_LABELS_VERSION ، پلتفرم همچنان از برچسبها و مجوزهای قبلی برای پارتیشنهای vendor قدیمی استفاده میکند.
BOARD_GENFS_LABELS_VERSION می تواند بزرگتر یا مساوی سطح API فروشنده باشد. به عنوان مثال، پارتیشنهای vendor با استفاده از سطح API 202404 میتوانند BOARD_GENFS_LABELS_VERSION روی 202504 تنظیم کنند تا برچسبهای جدیدی را که در سال 202504 معرفی شدهاند، بپذیرند. فهرست برچسبهای genfs خاص 202504 را ببینید.
هنگام برچسبگذاری گرههای genfscon ، پلتفرم باید پارتیشنهای vendor قدیمیتر را در نظر بگیرد و مکانیسمهای بازگشتی را برای سازگاری در صورت نیاز پیادهسازی کند. این پلتفرم میتواند از کتابخانههای فقط پلتفرم برای پرس و جو از نسخه genfs labels استفاده کند.
- در بومی، از
libgenfslabelsversionاستفاده کنید. برای فایل هدرlibgenfslabelsversionبهgenfslabelsversion.hمراجعه کنید. - در جاوا،
android.os.SELinux.getGenfsLabelsVersion()استفاده کنید.
پلت فرم-سیاست عمومی
خط مشی پلتفرم SELinux به خصوصی و عمومی تقسیم می شود. خطمشی عمومی پلتفرم شامل انواع و ویژگیهایی است که همیشه برای سطح API فروشنده در دسترس هستند و به عنوان یک API بین پلتفرم و فروشنده عمل میکنند. این خطمشی در معرض نویسندگان خطمشی فروشنده قرار میگیرد تا فروشندگان بتوانند فایلهای خطمشی فروشنده را بسازند، که وقتی با خطمشی خصوصی پلتفرم ترکیب میشود، منجر به یک خطمشی کاملاً کاربردی برای دستگاه میشود. خط مشی پلتفرم عمومی در system/sepolicy/public تعریف شده است.
به عنوان مثال، یک نوع vendor_init که فرآیند init را در زمینه فروشنده نشان میدهد، تحت system/sepolicy/public/vendor_init.te تعریف میشود:
type vendor_init, domain;
فروشندگان می توانند برای نوشتن قوانین خط مشی سفارشی به نوع vendor_init مراجعه کنند:
# Allow vendor_init to set vendor_audio_prop in vendor's init scripts
set_prop(vendor_init, vendor_audio_prop)ویژگی های سازگاری
خط مشی SELinux یک تعامل بین انواع منبع و هدف برای کلاسها و مجوزهای شی خاص است. هر شی (به عنوان مثال، پردازش ها، فایل ها) تحت تاثیر سیاست SELinux می تواند تنها یک نوع داشته باشد، اما آن نوع ممکن است چندین ویژگی داشته باشد.
این خط مشی بیشتر بر اساس انواع موجود نوشته شده است. در اینجا، vendor_init و debugfs هر دو نوع هستند:
allow vendor_init debugfs:dir { mounton };
این کار به این دلیل کار می کند که خط مشی با آگاهی از همه نوع نوشته شده است. با این حال، اگر خطمشی فروشنده و خطمشی پلتفرم از انواع خاصی استفاده میکنند، و برچسب یک شی خاص تنها در یکی از آن خطمشیها تغییر میکند، دیگری ممکن است حاوی خطمشی باشد که قبلاً به آن اعتماد کرده بود یا دسترسی را از دست داده است. برای مثال، فرض کنید که سیاست پلتفرم، گرههای sysfs را به عنوان sysfs برچسبگذاری میکند:
/sys(/.*)? u:object_r:sysfs:s0
خط مشی فروشنده دسترسی به /sys/usb را با برچسب sysfs اعطا می کند:
allow vendor_init sysfs:chr_file rw_file_perms;
اگر خطمشی پلتفرم به برچسب /sys/usb بهعنوان sysfs_usb تغییر یابد، خطمشی فروشنده یکسان میماند، اما vendor_init به دلیل عدم وجود خطمشی برای نوع جدید sysfs_usb ، دسترسی به /sys/usb را از دست میدهد:
/sys/usb u:object_r:sysfs_usb:s0
برای حل این مشکل، اندروید مفهومی از ویژگی های نسخه شده را معرفی می کند. در زمان کامپایل، سیستم ساخت به طور خودکار انواع عمومی پلتفرم مورد استفاده در خط مشی فروشنده را به این ویژگی های نسخه شده ترجمه می کند. این ترجمه با نگاشت فایل هایی که یک ویژگی نسخه شده را با یک یا چند نوع عمومی از پلتفرم مرتبط می کنند، فعال می شود.
برای مثال، فرض کنید که /sys/usb در خطمشی پلتفرم 202504 بهعنوان sysfs برچسبگذاری شده است، و سیاست فروشنده 202504 vendor_init دسترسی به /sys/usb میدهد. در این مورد:
- خط مشی فروشنده یک قانون
allow vendor_init sysfs:chr_file rw_file_perms;، زیرا/sys/usbدر خط مشی پلتفرم 202504 به عنوانsysfsبرچسب گذاری شده است. هنگامی که سیستم ساخت، خطمشی فروشنده را کامپایل میکند، به طور خودکار قانون را بهallow vendor_init _202504 sysfs _202504 :chr_file rw_file_perms;. ویژگیهایvendor_init_202504وsysfs_202504با انواعvendor_initوsysfsمطابقت دارند که انواع تعریفشده توسط پلتفرم هستند. - سیستم ساخت یک فایل نگاشت هویت
/system/etc/selinux/mapping/202504.cilرا تولید می کند. از آنجایی که همsystemو هم پارتیشنvendorاز یک نسخه202504استفاده می کنند، فایل نگاشت شامل نگاشت هویت ازtype_202504تاtypeاست. برای مثالvendor_init_202504بهvendor_initوsysfs_202504بهsysfsنگاشت شده است:(typeattributeset sysfs_202504 (sysfs)) (typeattributeset vendor_init_202504 (vendor_init)) ...
هنگامی که نسخه از 202504 به 202604 کاهش می یابد، یک فایل نگاشت جدید برای پارتیشن های vendor 202504 تحت system/sepolicy/private/compat/202504/202504.cil ایجاد می شود که در /system/etc/selinux/mapping/202504.cil نصب می شود system پارتیشن ها در ابتدا، این فایل نگاشت حاوی نگاشت هویت است، همانطور که قبلا توضیح داده شد. اگر یک برچسب جدید sysfs_usb برای /sys/usb به خطمشی پلتفرم 202604 اضافه شود، فایل نگاشت به نقشه sysfs_202504 به sysfs_usb بهروزرسانی میشود:
(typeattributeset sysfs_202504 (sysfs sysfs_usb)) (typeattributeset vendor_init_202504 (vendor_init)) ...
این به روز رسانی به قانون سیاست فروشنده تبدیل شده اجازه می allow vendor_init_202504 sysfs_202504:chr_file rw_file_perms; برای اعطای خودکار دسترسی vendor_init به نوع جدید sysfs_usb .
برای حفظ سازگاری با پارتیشنهای vendor قدیمی، هر زمان که یک نوع عمومی جدید اضافه میشود، آن نوع باید حداقل به یکی از ویژگیهای نسخهبندیشده در فایل نگاشت system/sepolicy/private/compat/ ver / ver .cil نگاشت شود، یا در لیست system/sepolicy/private/compat/ ver / ver .ignore.cil قرار گیرد تا بیان شود که هیچ نوع منطبقی با نوع vendor قبلی وجود ندارد.
ترکیبی از خط مشی پلتفرم، خطمشی فروشنده و فایل نگاشت به سیستم اجازه میدهد بدون بهروزرسانی خطمشی فروشنده، بهروزرسانی شود. همچنین تبدیل به ویژگیهای نسخهشده بهطور خودکار اتفاق میافتد، بنابراین خطمشی فروشنده نیازی به مراقبت از نسخهسازی ندارد و از انواع عمومی استفاده میکند.
system_ext سیاست عمومی عمومی و محصول
از Android 11، پارتیشنهای system_ext و product مجازند انواع عمومی تعیینشده خود را به پارتیشن vendor صادر کنند. مانند خطمشی عمومی پلتفرم، خطمشی فروشنده از انواع و قوانینی استفاده میکند که بهطور خودکار به ویژگیهای نسخهشده ترجمه میشوند، برای مثال، از type به type_ ver ، جایی که ver سطح API فروشنده پارتیشن vendor است.
زمانی که system_ext و پارتیشنهای product بر اساس نسخه پلتفرم یکسانی هستند ver سیستم ساخت فایلهای نگاشت پایه را به system_ext/etc/selinux/mapping/ ver .cil و product/etc/selinux/mapping/ ver .cil تولید میکند که حاوی نگاشت هویت از type تا type_ ver . خط مشی فروشنده می تواند به type با ویژگی نسخه شده type_ ver دسترسی داشته باشد.
در صورتی که فقط system_ext و پارتیشنهای product بهروزرسانی شوند، مثلاً ver به ver+1 (یا بالاتر)، در حالی که پارتیشن vendor در ver باقی میماند، ممکن است خطمشی فروشنده دسترسی به انواع system_ext و پارتیشنهای product را از دست بدهد. برای جلوگیری از شکستگی، system_ext و پارتیشنهای product باید فایلهای نقشهبرداری را از انواع بتن به ویژگیهای type_ ver ارائه دهند. هر شریک در صورتی که از پارتیشن vendor ver ver+1 (یا بالاتر) system_ext پارتیشنهای product پشتیبانی میکند، مسئول نگهداری فایلهای نگاشت است.
برای نصب فایلهای نگاشت در system_ext و پارتیشنهای product ، از پیادهکنندههای دستگاه یا فروشندگان انتظار میرود:
- فایل های نگاشت پایه تولید شده را از ver
system_extو پارتیشن هایproductدر درخت منبع آنها کپی کنید. - فایل های نقشه برداری را در صورت نیاز اصلاح کنید.
- فایلهای نگاشت را در ver+1 (یا جدیدتر)
system_extو پارتیشنهایproductنصب کنید.
برای مثال، فرض کنید پارتیشن 202504 system_ext یک نوع عمومی به نام foo_type دارد. سپس system_ext/etc/selinux/mapping/202504.cil در پارتیشن system_ext 202504 به شکل زیر است:
(typeattributeset foo_type_202504 (foo_type)) (expandtypeattribute foo_type_202504 true) (typeattribute foo_type_202504)
اگر bar_type به system_ext 202604 اضافه شود، و اگر bar_type باید به foo_type برای پارتیشن vendor 202504 نگاشت شود، 202504.cil می توان از (typeattributeset foo_type_202504 (foo_type)) به (typeattributeset foo_type_202504 (foo_type bar_type)) به روز کرد. (typeattributeset foo_type_202504 (foo_type bar_type)) و سپس در پارتیشن 202604 system_ext نصب می شود. پارتیشن vendor 202504 می تواند به دسترسی به foo_type و bar_type 202604 system_ext ادامه دهد.
تغییرات ویژگی برای اندروید 9
دستگاه هایی که به اندروید 9 ارتقا می یابند می توانند از ویژگی های زیر استفاده کنند، اما دستگاه هایی که با اندروید 9 راه اندازی می شوند نباید.
صفات ناقض
Android 9 شامل این ویژگی های مرتبط با دامنه است:
-
data_between_core_and_vendor_violators. مشخصه برای همه دامنههایی که الزام به اشتراکگذاری نکردن فایلها از طریق مسیر بینvendorوcoredomainsرا نقض میکنند. فرآیندهای پلت فرم و فروشنده نباید از فایل های روی دیسک برای برقراری ارتباط استفاده کنند (ABI ناپایدار). توصیه:- کد فروشنده باید از
/data/vendorاستفاده کند. - سیستم نباید از
/data/vendorاستفاده کند.
- کد فروشنده باید از
-
system_executes_vendor_violators. مشخصه برای همه دامنههای سیستم (به جز دامنههایinitوshell domains) که الزام اجرای نکردن باینریهای فروشنده را نقض میکنند. اجرای باینری های فروشنده دارای API ناپایدار است. پلتفرم نباید باینری های فروشنده را مستقیماً اجرا کند. توصیه:- چنین وابستگی های پلتفرمی به باینری های فروشنده باید پشت HIDL HAL ها باشد.
یا
-
coredomainsکه نیاز به دسترسی به باینریهای فروشنده دارند، باید به پارتیشنvendorمنتقل شوند و بنابراین،coredomainنیستند.
- چنین وابستگی های پلتفرمی به باینری های فروشنده باید پشت HIDL HAL ها باشد.
ویژگی های غیر قابل اعتماد
برنامههای غیرقابل اعتمادی که کد دلخواه را میزبانی میکنند، نباید به سرویسهای HwBinder دسترسی داشته باشند، به جز برنامههایی که برای دسترسی از چنین برنامههایی به اندازه کافی ایمن در نظر گرفته میشوند (به سرویسهای ایمن زیر مراجعه کنید). دو دلیل اصلی برای این امر عبارتند از:
- سرورهای HwBinder احراز هویت مشتری را انجام نمی دهند زیرا HIDL در حال حاضر اطلاعات UID تماس گیرنده را نشان نمی دهد. حتی اگر HIDL چنین دادههایی را افشا کند، بسیاری از سرویسهای HwBinder یا در سطح پایینتر از برنامهها (مانند HAL) کار میکنند یا نباید برای مجوز به هویت برنامه تکیه کنند. بنابراین، برای ایمن بودن، فرض پیشفرض این است که هر سرویس HwBinder با همه مشتریان خود بهطور مساوی برای انجام عملیات ارائهشده توسط این سرویس دارای مجوز هستند.
- سرورهای HAL (زیرمجموعه ای از خدمات HwBinder) حاوی کدهایی با نرخ بروز مشکلات امنیتی بالاتر از اجزای
system/coreهستند و به لایه های پایینی پشته (تا به سخت افزار) دسترسی دارند و بنابراین فرصت های دور زدن مدل امنیتی اندروید را افزایش می دهند.
خدمات ایمن
خدمات ایمن عبارتند از:
-
same_process_hwservice. این سرویسها (طبق تعریف) در فرآیند مشتری اجرا میشوند و بنابراین دسترسی یکسانی به دامنه مشتری دارند که فرآیند در آن اجرا میشود. -
coredomain_hwservice. این خدمات خطرات مرتبط با دلیل شماره 2 را ایجاد نمی کنند. -
hal_configstore_ISurfaceFlingerConfigs. این سرویس به طور خاص برای استفاده توسط هر دامنه طراحی شده است. -
hal_graphics_allocator_hwservice. این عملیات همچنین توسط سرویسsurfaceflingerBinder ارائه می شود که برنامه ها مجاز به دسترسی به آن هستند. -
hal_omx_hwservice. این یک نسخه HwBinder از سرویسmediacodecBinder است که برنامه ها مجاز به دسترسی به آن هستند. -
hal_codec2_hwservice. این نسخه جدیدترhal_omx_hwserviceاست.
ویژگی های قابل استفاده
همه hwservices که ایمن در نظر گرفته نمی شوند دارای ویژگی untrusted_app_visible_hwservice هستند. سرورهای HAL مربوطه دارای ویژگی untrusted_app_visible_halserver هستند. دستگاههایی که با Android 9 راهاندازی میشوند نباید از هیچ یک از ویژگیهای untrusted استفاده کنند.
توصیه:
- برنامههای غیرقابل اعتماد باید در عوض با سرویس سیستمی که با فروشنده HIDL HAL صحبت میکند صحبت کنند. به عنوان مثال، برنامه ها می توانند با
binderservicedomainصحبت کنند، سپسmediaserver(که یکbinderservicedomainاست) به نوبه خود باhal_graphics_allocatorصحبت می کند.یا
- برنامههایی که نیاز به دسترسی مستقیم به HALهای
vendorدارند، باید دامنه سیاستگذاری تعریفشده توسط فروشنده خود را داشته باشند.
تست های ویژگی فایل
اندروید 9 شامل تستهای زمان ساخت است که اطمینان میدهد همه فایلها در مکانهای خاص دارای ویژگیهای مناسب هستند (مانند همه فایلهای موجود در sysfs دارای ویژگی sysfs_type مورد نیاز هستند).
برچسب زدن زمینه های SELinux
برای حمایت از تمایز بین پلتفرم و سیاست فروشنده، سیستم فایلهای زمینه SELinux را متفاوت میسازد تا آنها را جدا نگه دارد.
زمینه های فایل
اندروید 8.0 تغییرات زیر را برای file_contexts ارائه کرد:
- برای جلوگیری از سربار کامپایل اضافی روی دستگاه در هنگام بوت کردن،
file_contextsبه شکل باینری وجود ندارد. درعوض، فایل متنی با بیان منظم مانند{property, service}_contexts(همانطور که قبل از 7.0 بودند) قابل خواندن هستند. -
file_contextsبین دو فایل تقسیم می شود:-
plat_file_contexts-
file_contextپلتفرم Android که هیچ برچسب مخصوص دستگاه ندارد، به جز برای برچسب زدن بخشهایی از پارتیشن/vendorکه باید دقیقاً برچسبگذاری شوند تا از عملکرد صحیح فایلهای sepolicy اطمینان حاصل شود. - باید در پارتیشن
systemدر/system/etc/selinux/plat_file_contextsروی دستگاه قرار داشته باشد و توسطinitدر ابتدا همراه با فروشندهfile_contextبارگذاری شود.
-
-
vendor_file_contexts-
file_contextمخصوص دستگاه که با ترکیبfile_contextsموجود در فهرستهای راهنمایBOARD_SEPOLICY_DIRSدر فایلهایBoardconfig.mkدستگاه ساخته شده است. - باید در
/vendor/etc/selinux/vendor_file_contextsدر پارتیشنvendorنصب شود و در ابتدا توسطinitهمراه باfile_contextپلتفرم بارگذاری شود.
-
-
زمینه های ملکی
در اندروید 8.0، property_contexts بین دو فایل تقسیم میشود:
-
plat_property_contexts-
property_contextپلتفرم Android که برچسب مخصوص دستگاه ندارد. - باید در پارتیشن
systemدر/system/etc/selinux/plat_property_contextsقرار داشته باشد و توسطinitدر ابتدا همراه با vendorproperty_contextsبارگذاری شود.
-
-
vendor_property_contexts-
property_contextمخصوص دستگاه با ترکیبproperty_contextsیافت شده در دایرکتوری های اشاره شده توسطBOARD_SEPOLICY_DIRSدر فایل هایBoardconfig.mkدستگاه ساخته شده است. - باید در پارتیشن
vendorدر/vendor/etc/selinux/vendor_property_contextsقرار داشته باشد و در ابتدا توسطinitبه همراهproperty_contextپلت فرم بارگذاری شود.
-
زمینه های خدماتی
در اندروید 8.0، service_contexts بین فایلهای زیر تقسیم میشود:
-
plat_service_contexts-
service_contextمخصوص پلتفرم Android برایservicemanager.service_contextهیچ برچسب مخصوص دستگاه ندارد. - باید در پارتیشن
systemدر/system/etc/selinux/plat_service_contextsقرار داشته باشد و توسطservicemanagerدر ابتدا همراه با فروشندهservice_contextsبارگیری شود.
-
-
vendor_service_contexts-
service_contextمخصوص دستگاه که با ترکیبservice_contextsیافت شده در دایرکتوری های اشاره شده توسطBOARD_SEPOLICY_DIRSدر فایل هایBoardconfig.mkدستگاه ساخته شده است. - باید در پارتیشن
vendorدر/vendor/etc/selinux/vendor_service_contextsقرار داشته باشد و توسطservicemanagerدر ابتدا همراه با platformservice_contextsبارگیری شود. - اگرچه
servicemanagerدر زمان راهاندازی به دنبال این فایل میگردد، اما برای یک دستگاهTREBLEکاملاً سازگار،vendor_service_contextsنباید وجود داشته باشد. این به این دلیل است که تمام تعامل بینvendorو فرآیندهایsystemباید از طریقhwservicemanager/hwbinderانجام شود.
-
-
plat_hwservice_contexts- پلتفرم Android
hwservice_contextبرایhwservicemanagerکه هیچ برچسب مخصوص دستگاه ندارد. - باید در پارتیشن
systemدر/system/etc/selinux/plat_hwservice_contextsقرار داشته باشد و در ابتدا توسطhwservicemanagerهمراه باvendor_hwservice_contextsبارگیری شود.
- پلتفرم Android
-
vendor_hwservice_contexts-
hwservice_contextمخصوص دستگاه که با ترکیبhwservice_contextsیافت شده در دایرکتوری های اشاره شده توسطBOARD_SEPOLICY_DIRSدر فایل هایBoardconfig.mkدستگاه ساخته شده است. - باید در پارتیشن
vendorدر/vendor/etc/selinux/vendor_hwservice_contextsقرار داشته باشد و در ابتدا توسطhwservicemanagerهمراه باplat_service_contextsبارگیری شود.
-
-
vndservice_contexts-
service_contextمخصوص دستگاه برایvndservicemanagerساخته شده با ترکیبvndservice_contextsموجود در فهرستهای راهنمایBOARD_SEPOLICY_DIRSدرBoardconfig.mkدستگاه. - این فایل باید در پارتیشن
vendorدر/vendor/etc/selinux/vndservice_contextsقرار داشته باشد و در ابتدا توسطvndservicemanagerبارگیری شود.
-
زمینه های Seapp
در اندروید 8.0، seapp_contexts بین دو فایل تقسیم میشود:
-
plat_seapp_contexts- پلتفرم Android
seapp_contextکه هیچ تغییری خاص دستگاه ندارد. - باید در پارتیشن
systemدر/system/etc/selinux/plat_seapp_contexts.
- پلتفرم Android
-
vendor_seapp_contexts- پسوند خاص دستگاه برای پلتفرم
seapp_contextبا ترکیبseapp_contextsموجود در فهرستهای راهنمایBOARD_SEPOLICY_DIRSدر فایلهایBoardconfig.mkدستگاه ساخته شده است. - باید در پارتیشن
vendorدر/vendor/etc/selinux/vendor_seapp_contextsساکن باشد.
- پسوند خاص دستگاه برای پلتفرم
مجوزهای MAC
در اندروید 8.0، mac_permissions.xml بین دو فایل تقسیم میشود:
- پلتفرم
mac_permissions.xml- پلتفرم Android
mac_permissions.xmlکه هیچ تغییری خاص دستگاه ندارد. - باید در پارتیشن
systemدر/system/etc/selinux/.
- پلتفرم Android
-
mac_permissions.xmlغیرپلتفرمی- پسوند مخصوص دستگاه برای پلتفرم
mac_permissions.xmlساخته شده ازmac_permissions.xmlکه در فهرستهای راهنمایBOARD_SEPOLICY_DIRSدر فایلهایBoardconfig.mkدستگاه یافت میشود. - باید در پارتیشن
vendorدر/vendor/etc/selinux/.
- پسوند مخصوص دستگاه برای پلتفرم