אפליקציות בעלות הרשאות מיוחדות הן אפליקציות מערכת שנמצאות בספרייה priv-app
במחיצת תמונת מערכת. המחיצות שמשמשות לגרסאות של Android הן:
- Android מגרסה 9 ואילך:
/system, /product, /vendor
- Android מגרסה 8.1 ומטה:
/system
בעבר, ליצרני מכשירים הייתה שליטה מועטה בהרשאות חתימה | הרשאות מיוחדות שאפשר להעניק לאפליקציות מיוחדות. החל מ-Android 8.0, יצרנים יכולים להעניק במפורש הרשאות מיוחדות בקובצי ה-XML של הגדרות המערכת בספרייה /etc/permissions
. החל מ-Android 9, אפשר להעניק או לדחות במפורש את כל ההרשאות המיוחדות. אם לא ניתנות הרשאות מיוחדות,
המכשיר לא יופעל.
בקובץ privapp-permissions.xml
אפשר רק להעניק או לשלול הרשאות לאפליקציות עם הרשאות מיוחדות באותה מחיצה. לדוגמה, אם אפליקציה במחיצה /product
מבקשת הרשאות מיוחדות, רק קובץ privapp-permissions.xml
ב-/product
יכול לאשר או לדחות את הבקשה.
הוספת רשימת היתרים
אפשר לפרט את רשימות ההיתרים של האפליקציות בקובץ XML אחד או בכמה קובצי XML שנמצאים בספרייה /etc/permissions
:
/etc/permissions/privapp-permissions-OEM_NAME.xml
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
אין כלל מחמיר לגבי האופן שבו התוכן מאורגן. מפתחי מכשירים יכולים לקבוע את מבנה התוכן, בתנאי שכל האפליקציות מ-/system/priv-app
נמצאות ברשימת ההיתרים. לדוגמה, Google פיתחה רשימת היתרים אחת לכל האפליקציות עם הרשאות מיוחדות.
מומלץ לארגן את המידע באופן הבא:
- הרשאות לאפליקציות שכבר נכללות בעץ פרויקט הקוד הפתוח של Android (AOSP) מפורטות ב-
/etc/permissions/privapp-permissions-platform.xml
. - באפליקציות אחרות, משתמשים בקבצים מהצורה:
/etc/permissions/privapp-permissions-DEVICE_NAME.xml
.
התאמה אישית של רשימת היתרים
AOSP כולל הטמעה של רשימת היתרים שאפשר להתאים אישית לפי הצורך.
אם צריך לדחות הרשאה, עורכים את ה-XML כדי להשתמש בתג deny-permission
במקום בתג 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
.
אכיפה של רשימת היתרים
אחרי שיוצרים את רשימות ההיתרים, מגדירים את מאפיין ה-build ro.control_privapp_permissions=enforce
כדי להפעיל את האכיפה בזמן ריצה.
הוספה לרשימת ההיתרים נדרשת רק להרשאות שמוצהרות על ידי אפליקציות עם package="android"
. המאפיין ro.control_privapp_permissions
state חייב להתאים לסעיף 9.1 Permissions
במסמך ההגדרה של תאימות (CDD).