特權權限白名單

特權應用程序是位於系統映像分區之一的priv-app目錄中的系統應用程序。用於 Android 版本的分區是

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

在整個頁面中, /etc/permissions/priv-app解析為partition /etc/permissions/priv-app

從歷史上看,設備製造商幾乎無法控制哪些簽名|特權權限可以授予特權應用程序。從 Android 8.0 開始,製造商必須在/etc/permissions目錄中的系統配置 XML 文件中明確授予特權。從 Android 9 開始,實現者必須明確授予或拒絕所有特權權限,否則設備將無法啟動。

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

添加白名單

應用程序的權限允許列表可以在單個 XML 或多個 XML 文件中列出,這些文件位於frameworks/base/etc/permissions目錄中,如下所示:

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

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

  • /etc/permissions/privapp-permissions-platform.xml中列出了已包含在 Android 開源項目 (AOSP) 樹中的應用的權限。
  • Google 應用程序的權限列在/etc/permissions/privapp-permissions-google.xml中。
  • 對於其他應用程序,請使用以下形式的文件: /etc/permissions/privapp-permissions- DEVICE_NAME .xml

自定義許可名單

AOSP 包括一個可根據需要自定義的允許列表實施。 AOSP 中包含的應用程序的權限已在/etc/permissions/privapp-permissions-platform.xml中列入許可名單。

如果存在應拒絕的權限,請編輯 XML 以使用“拒絕權限”標記而不是“權限”標記。例子:

<!-- 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 8.0 及更低版本上,受影響的應用不會被授予缺少的權限,即使它們位於priv-app路徑中也是如此。
  • 在 Android 9 及更高版本上,違反(特權權限)意味著設備無法啟動。您必須明確允許或拒絕所有特權權限

執行許可名單

允許列表到位後,通過設置構建屬性ro.control_privapp_permissions=enforce啟用運行時強制。