特權應用程序是位於系統映像分區之一的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
。
生成許可名單
要為系統映像上可用的所有應用程序自動生成允許列表,請使用位於development/tools/privapp_permissions/privapp_permissions.py
的 AOSP 命令行工具。要生成特定於設備的privapp-permissions.xml
的初始版本:
- 構建系統鏡像:
. build/envsetup.sh
lunch PRODUCT_NAME
make -j
- 運行
privapp_permissions.py
腳本以生成一個privapp-permissions.xml
文件,該文件列出了所有需要被列入白名單的簽名|特權權限:development/tools/privapp_permissions/privapp_permissions.py
此工具打印可用作單個文件或拆分為多個文件的 XML 內容在/etc/permissions
目錄路徑中。如果設備已在/etc/permissions
目錄中包含允許列表,則該工具僅打印差異(例如缺少您需要添加到允許列表中的簽名|特權權限)。這對於審計也很有用:添加新版本的應用程序時,該工具會檢測所需的額外權限。 - 將生成的文件複製到相應的
/etc/permissions
目錄,系統會在引導期間讀取這些文件。
自定義許可名單
AOSP 包括一個可根據需要自定義的允許列表實施。 AOSP 中包含的應用程序的權限已在/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 及更高版本上,違反(特權權限)意味著設備無法啟動。您必須明確允許或拒絕所有特權權限
執行許可名單
允許列表到位後,通過設置構建屬性ro.control_privapp_permissions=enforce
啟用運行時強制。