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

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