רשימת היתרים להרשאות עם הרשאות פרימיום

אפליקציות בעלות הרשאות מיוחדות הן אפליקציות מערכת שנמצאות בספרייה 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).