特權權限白名單

特權應用程式是位於系統映像分割區上的priv-app目錄中的系統應用程式。 Android 版本使用的分割區是:

  • Android 9 及更高版本: /system, /product, /vendor
  • Android 8.1 及更低版本: /system

從歷史上看,設備製造商幾乎無法控制哪個簽名 |可以將特權權限授予特權應用程式。從 Android 8.0 開始,製造商可以在/etc/permissions目錄中的系統配置 XML 檔案中明確授予特權。從 Android 9 開始,實作者可以明確授予或拒絕所有特權。如果未授予特權,設備將無法啟動。

privapp-permissions.xml檔案只能向同一分割區上的特權應用程式授予或拒絕權限。例如,如果/product分區上的應用程式請求特權權限,則該請求只能由/product上的privapp-permissions.xml檔案授予或拒絕。

新增允許名單

應用程式的權限允許清單可以在單一 XML 檔案或位於frameworks/base/etc/permissions目錄中的多個 XML 檔案中列出:

  • /etc/permissions/privapp-permissions- OEM_NAME .xml
  • /etc/permissions/privapp-permissions- DEVICE_NAME .xml

對於內容的組織方式沒有嚴格的規則。只要/system/priv-app中的所有應用程式都列入白名單,設備實現者就可以確定內容結構。例如,Google為所有特權應用程式開發了一個單一的許可名單。我們推薦以下組織:

  • /etc/permissions/privapp-permissions-platform.xml中列出了已包含在Android 開源專案 (AOSP)樹中的應用程式的權限。
  • 對於其他應用程序,請使用/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來啟用執行時間強制。

僅對於具有package="android"的應用程式聲明的權限才需要列入白名單。 ro.control_privapp_permissions屬性狀態必須遵守相容性定義文件 (CDD) 中的第 9.1 節權限