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