برنامههای دارای امتیاز، برنامههای سیستمی هستند که در فهرست priv-app
در یکی از پارتیشنهای تصویر سیستم قرار دارند. پارتیشن های مورد استفاده برای نسخه های اندروید هستند
- اندروید 8.1 و پایین تر -
/system
- Android 9 و بالاتر -
/system, /product, /vendor
در سرتاسر این صفحه، /etc/permissions/priv-app
به partition /etc/permissions/priv-app
تغییر می کند.
از لحاظ تاریخی، سازندگان دستگاه کنترل کمی بر روی اینکه کدام مجوزهای امضا میتوان به برنامههای ممتاز اعطا شد، نداشتند. با شروع اندروید 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
در لیست مجاز باشند. به عنوان مثال، Google یک لیست مجاز واحد برای همه برنامه های دارای امتیاز توسعه یافته توسط Google دارد و سازمان زیر را توصیه می کند:
- مجوزهای برنامههایی که قبلاً در درخت پروژه منبع باز Android (AOSP) گنجانده شدهاند در
/etc/permissions/privapp-permissions-platform.xml
فهرست شدهاند. - مجوزهای برنامه های Google در
/etc/permissions/privapp-permissions-google.xml
فهرست شده است. - برای سایر برنامهها، از فایلهایی به این شکل استفاده کنید:
/etc/permissions/privapp-permissions- DEVICE_NAME .xml
.
ایجاد لیست های مجاز
برای ایجاد خودکار لیست مجاز برای همه برنامههای موجود در تصویر سیستم، از ابزار خط فرمان AOSP در development/tools/privapp_permissions/privapp_permissions.py
استفاده کنید. برای ایجاد نسخه اولیه privapp-permissions.xml
مخصوص دستگاه:
- یک تصویر سیستم بسازید:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- اسکریپت
privapp_permissions.py
را اجرا کنید تا یک فایلprivapp-permissions.xml
ایجاد کنید که همه امضا را فهرست می کند|مجوزهای ممتاز مورد نیاز برای درج اجازه لیست:development/tools/privapp_permissions/privapp_permissions.py
این ابزار محتوای XML را چاپ می کند که می تواند به عنوان یک فایل استفاده شود یا به چندین فایل تقسیم شود. در مسیر دایرکتوری/etc/permissions
. اگر دستگاه از قبل دارای لیستهای مجاز در فهرستهای/etc/permissions
، ابزار فقط تفاوتها را چاپ میکند (مانند امضای گمشده|مجوزهای ممتازی که باید به فهرست مجاز اضافه کنید). این برای اهداف ممیزی نیز مفید است: هنگامی که نسخه جدیدی از برنامه اضافه می شود، ابزار مجوزهای اضافی مورد نیاز را شناسایی می کند. - فایل های تولید شده را در دایرکتوری
/etc/permissions
مناسب کپی کنید، جایی که سیستم فایل ها را در هنگام بوت می خواند.
سفارشی کردن لیست های مجاز
AOSP شامل اجرای لیست مجاز است که می تواند در صورت نیاز سفارشی شود. مجوزهای برنامههای موجود در AOSP قبلاً در /etc/permissions/privapp-permissions-platform.xml
.
به طور پیش فرض، اسکریپت privapp_permissions.py
خروجی ایجاد می کند که به طور خودکار هر گونه مجوز درخواست شده توسط یک برنامه ممتاز را اعطا می کند. اگر مجوزهایی وجود دارد که باید رد شوند، XML را ویرایش کنید تا به جای تگ «مجوز» از تگ «رد کردن مجوز» استفاده کنید. مثال:
<!-- 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
همه تخلفات باید با افزودن مجوزهای از دست رفته به لیست های مجاز مناسب رسیدگی شود.
- در اندروید 8.0 و پایینتر، برنامههای آسیبدیده حتی اگر در مسیر
priv-app
باشند، مجوزهای از دست رفته را دریافت نمیکنند. - در اندروید 9 و بالاتر، نقض (مجوزهای ممتاز ) به این معنی است که دستگاه بوت نمیشود . شما باید صراحتاً همه مجوزهای ممتاز را مجاز یا رد کنید
اجرای لیست های مجاز
پس از قرار گرفتن لیست های مجاز، با تنظیم ویژگی ساخت ro.control_privapp_permissions=enforce
، اجرای زمان اجرا را فعال کنید.