特權權限許可名單

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

  • 的Android 8.1和更低- /system
  • 機器人9和更高- /system, /product, /vendor

在這一頁中, /etc/permissions/priv-app解析為partition /etc/permissions/priv-app

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

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

添加許可名單

針對應用許可allowlists可以在單個XML或在位於多個XML文件中列出frameworks/base/etc/permissions目錄如下:

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

組織內容沒有嚴格的規則。設備實現能夠確定內容結構,只要從所有應用/system/priv-app被allowlisted。例如,Google 為 Google 開發的所有特權應用制定了一個許可名單,並推薦以下組織:

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

生成許可名單

要為所有的系統映像上的哪些應用可以自動生成一個允許列表,在使用AOSP命令行工具development/tools/privapp_permissions/privapp_permissions.py 。為了生成特定於設備的的初始版本privapp-permissions.xml

  1. 建立一個系統映像:
        . build/envsetup.sh
        lunch PRODUCT_NAME
        make -j
  2. 運行privapp_permissions.py腳本生成一個privapp-permissions.xml文件,該文件列出了所有簽名|需要的特權權限被allowlisted:
    development/tools/privapp_permissions/privapp_permissions.py
    是既可以作為一個單一的文件,該工具輸出XML的內容,或者拆分成多個文件在/etc/permissions的目錄路徑。如果設備已經包含在allowlists /etc/permissions目錄,該工具只打印的差異(如缺少簽名|你需要添加到允許列表特權權限)。這對於審計目的也很有用:添加新版本的應用程序時,該工具會檢測所需的其他權限。
  3. 生成的文件複製到相應/etc/permissions目錄,其中的系統啟動時讀取文件。

自定義許可名單

AOSP 包括可根據需要自定義的許可名單實施。對於包含在AOSP應用程序的權限已經allowlisted在/etc/permissions/privapp-permissions-platform.xml

默認情況下, privapp_permissions.py腳本生成的輸出,可自動授予的特權應用程序要求的任何許可。如果存在應拒絕的權限,請編輯 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或更高,侵犯(特權權限)意味著設備無法引導。你必須明確地允許或拒絕所有特權權限

強制執行許可名單

allowlists到位後,能夠通過設置構建屬性運行時執行ro.control_privapp_permissions=enforce