برنامههای دارای امتیاز، برنامههای سیستمی هستند که در فهرست priv-app
در یک پارتیشن تصویر سیستم قرار دارند. پارتیشن های مورد استفاده برای نسخه های اندروید عبارتند از:
- اندروید 9 و بالاتر:
/system, /product, /vendor
- اندروید 8.1 و پایین تر:
/system
از لحاظ تاریخی، سازندگان دستگاه کنترل کمی بر روی امضای | مجوزهای ممتاز را می توان به برنامه های ممتاز اعطا کرد. با شروع Android 8.0، سازندگان می توانند به صراحت مجوزهای ممتازی را در فایل های XML پیکربندی سیستم در فهرست /etc/permissions
اعطا کنند. از اندروید 9، پیادهکنندهها میتوانند به صراحت تمام مجوزهای ممتاز را اعطا یا رد کنند. اگر مجوزهای ممتاز داده نشود، دستگاه بوت نمیشود.
فایل privapp-permissions.xml
فقط می تواند مجوزها را برای برنامه های دارای امتیاز در همان پارتیشن اعطا یا رد کند. به عنوان مثال، اگر یک برنامه در پارتیشن /product
مجوزهای ممتاز درخواست کند، این درخواست فقط می تواند توسط یک فایل privapp-permissions.xml
در /product
اعطا یا رد شود.
یک لیست مجاز اضافه کنید
لیست مجوزهای برنامهها را میتوان در یک فایل XML یا در چندین فایل XML واقع در frameworks/base/etc/permissions
فهرست کرد:
-
/etc/permissions/privapp-permissions- OEM_NAME .xml
-
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
هیچ قانون سختگیرانه ای در مورد نحوه سازماندهی محتوا اعمال نمی شود. پیادهکنندههای دستگاه میتوانند ساختار محتوا را تعیین کنند تا زمانی که همه برنامههای /system/priv-app
در لیست مجاز باشند. به عنوان مثال، گوگل یک لیست مجاز واحد برای همه برنامه های دارای امتیاز ایجاد کرده است. ما سازمان زیر را توصیه می کنیم:
- مجوزهای برنامههایی که قبلاً در درخت پروژه منبع باز Android (AOSP) گنجانده شدهاند در
/etc/permissions/privapp-permissions-platform.xml
فهرست شدهاند. - برای سایر برنامهها، از فایلهای فرم
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
استفاده کنید.
یک لیست مجاز را سفارشی کنید
AOSP شامل اجرای لیست مجاز است که می تواند در صورت نیاز سفارشی شود.
اگر یک مجوز باید رد شود، XML را ویرایش کنید تا به جای تگ permission
، از یک تگ deny-permission
استفاده کنید. به عنوان مثال:
<!-- This XML file declares which signature|privileged permissions to grant to privileged apps that come with the platform --> <permissions> <privapp-permissions package="com.android.backupconfirm"> <permission name="android.permission.BACKUP"/> <permission name="android.permission.CRYPT_KEEPER"/> </privapp-permissions> <privapp-permissions package="com.android.cellbroadcastreceiver"> <!-- Don't allow the application to interact across users --> <deny-permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MODIFY_PHONE_STATE"/> <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/> <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/> </privapp-permissions> ...
مجوزهای از دست رفته را پیدا کنید
برای یافتن مجوزهای از دست رفته هنگام راهاندازی دستگاه جدید، حالت گزارش انتقالی را فعال کنید:
ro.control_privapp_permissions=log
تخلفات در فایل گزارش گزارش شده است. مجوزهای غیر ممتاز داده می شود. انجام این کار تضمین می کند که دستگاه در حالت کار باقی می ماند و در عین حال لیست تخلفات را ارائه می دهد. فرمت پیام خطا به صورت زیر است:
PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - not in privapp-permissions allowlist
همه تخلفات باید با افزودن مجوزهای از دست رفته به لیست های مجاز مناسب رسیدگی شود. توجه داشته باشید که در:
- Android 9 و بالاتر، نقض مجوزهای ممتاز مانع از راه اندازی دستگاه می شود. در عوض، شما باید صراحتاً اجازه دهید یا تمام مجوزهای ممتاز را رد کنید.
- Android 8.0 و پایین تر، مجوزهای از دست رفته علیرغم اینکه در مسیر
priv-app
قرار دارند، به برنامه های آسیب دیده اعطا نمی شوند.
یک لیست مجاز را اجرا کنید
پس از ایجاد لیست های مجاز خود، با تنظیم ویژگی ساخت ro.control_privapp_permissions=enforce
، اجرای زمان اجرا را فعال کنید.
Allowlisting فقط برای مجوزهای اعلام شده توسط برنامه های دارای package="android"
مورد نیاز است. وضعیت ویژگی ro.control_privapp_permissions
باید به بخش 9.1 مجوزها در سند تعریف سازگاری (CDD) پایبند باشد.