Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

特權權限白名單

特權應用程序是位於系統映像分區之一上的priv-app目錄中的系統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文件只能授予或拒絕同一分區上特權應用程序的權限。例如,如果/vendor分區上的應用程序請求特權,則該請求只能由/vendor上的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中的所有/system/priv-app都列入白名單,設備實施者就可以確定內容結構。例如,對於由Google開發的所有特權應用,Google都有一個白名單,並建議採用以下組織:

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

生成白名單

要為系統映像上可用的所有應用程序自動生成白名單,請使用development/tools/privapp_permissions/privapp_permissions.py的AOSP命令行工具。要生成設備特定的privapp-permissions.xml的初始版本:

  1. 建立系統映像:
        . build/envsetup.sh
        lunch PRODUCT_NAME
        make -j
  2. 運行privapp_permissions.py腳本以生成一個privapp-permissions.xml文件,該文件列出了需要列入白名單的所有簽名|特權:
    development/tools/privapp_permissions/privapp_permissions.py
    此工具可打印XML內容,該內容可以用作單個文件,也可以拆分為多個文件。 /etc/permissions目錄路徑。如果設備已在/etc/permissions目錄中包含白名單,則該工具僅打印差異(例如,您需要添加到白名單中的缺少簽名|特權)。這對於審核目的也很有用:添加新版本的應用程序時,該工具會檢測到所需的其他權限。
  3. 將生成的文件複製到適當的/etc/permissions目錄,系統在引導過程中從中讀取文件。

自定義白名單

AOSP包括一個白名單實現,可以根據需要進行自定義。 AOSP中包含的應用程序許可已在/etc/permissions/privapp-permissions-platform.xml列入白名單。

默認情況下, privapp_permissions.py腳本生成的輸出會自動授予特權應用程序請求的任何權限。如果存在應拒絕的權限,請編輯XML以使用“ deny-permission”標籤而不是“ permission”標籤。例:

<!--
    This XML file declares which signature|privileged permissions should be
    granted 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 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 whitelist

必須通過將缺少的權限添加到適當的白名單中來解決所有違規問題。

  • 在Android 8.0及更低版本上,即使受影響的應用程序位於priv-app路徑中,也不會被授予缺少的權限。
  • 在Android 9及更高版本上,違反( 特權權限)表示設備無法啟動 。您必須明確允許或拒絕所有特權權限

強制白名單

白名單到位後,通過設置構建屬性ro.control_privapp_permissions=enforce啟用運行時ro.control_privapp_permissions=enforce