Android 特權許可白名單



極力推薦文章:歡迎收藏
Android 干貨分享

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您將收獲以下內容:

一、priv-app 白名單簡介
二、添加priv-app 白名單
三、生成priv-app白名單
四、自定義priv-app白名單
五、查找缺少的priv-app權限
六、執行priv-app白名單
七、priv-app 中申請權限未添加特許白名單遇到的坑

一、priv-app 白名單簡介

特權應用程序是位於/system/priv-app系統映像目錄中的系統應用程序 。從歷史上看,設備實施者幾乎無法控制哪些特權權限可以授予特權應用程序。從Android 8.0開始,實現者可以在/etc/permissions目錄中的系統配置XML文件中明確地將特權應用程序列入白名單。未在這些XML文件中明確列出的應用程序未被授予特權權限。

特別注意事項
僅對 具有package =“android”的應用程序聲明的 權限才需要白名單 。Google Play進展使用com.examplecom.android命名空間。

二、添加priv-app 白名單

應用程序的權限白名單可以列在frameworks/base/etc/permissions 目錄中的單個或多個XML文件中,如下所示:

frameworks/base/etc/permissions/privapp-permissions-OEM_NAME.xml
frameworks/base/etc/permissions/privapp-permissions-DEVICE_NAME.xml

組織內容沒有嚴格的規則。只要所有應用程序/system/priv-app都列入白名單,設備實施者就可以確定內容結構 。例如,GoogleGoogle開發的所有特權應用程序都有一個白名單。我們建議使用以下組織:

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

三、生成priv-app白名單

要為系統映像上的所有可用應用程序自動生成白名單,請使用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文件,該 文件列出了要列入白名單的所有簽名特權權限:

development/tools/privapp_permissions/privapp_permissions.py

此工具生成 XML內容,可以將其用作單個文件或拆分為多個文件/etc/permissions。如果設備已在/etc/permissions目錄中包含白名單,則 該工具僅打印差異(即缺少要添加到白名單的特權權限)。這對於審計目的也很有用:添加新版本的應用程序時,該工具會檢測所需的其他權限。
3.將生成的文件復制到/etc/permissions目錄,系統將在引導期間讀取這些文件。

四、自定義priv-app白名單

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

默認情況下,privapp_permissions.py腳本會生成輸出,該輸出會自動授予特權應用程序請求的任何權限。如果存在應拒絕的權限,請編輯XML以使用“拒絕權限”標記而不是“權限”標記。例如(frameworks/base/data/etc/privapp-permissions-platform.xml)

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

五、查找缺少的priv-app權限

啟動新設備時,通過啟用過渡日志模式來查找缺少的權限:

ro.control_privapp_permissions=log

可以使用adb 命令獲取該屬性的值,命令如下:

C:\Users\Administrator>adb root
C:\Users\Administrator>adb remount
Not running as root. Try "adb root" first.
C:\Users\Administrator>adb shell getprop ro.control_privapp_permissions
log
C:\Users\Administrator>

adb 獲取特權白名單屬性

日志文件中會報告違規,但仍會授予權限。這樣可以在提供違規列表的同時使設備保持工作狀態。錯誤消息格式如下:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} - 
 not in privapp-permissions whitelist

必須通過將應用添加到白名單來解決所有違規問題。如果未添加,即使應用程序位於priv-app路徑中,也不會向應用程序授予缺少的權限。

六、執行priv-app白名單

在使用白名單后,通過設置構建屬性來啟用運行時強制實施ro.control_privapp_permissions=enforce

七、priv-app 中申請權限未添加特許白名單遇到的坑

如果priv-app中申請了一些權限后沒有在此文件添加,在強制執行ro.control_privapp_permissions=enforce時候,可能會導致手機無法開機情況。

小編遇到無法開機的異常Log信息如下:

06-04 10:48:38.750  1756  1756 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
06-04 10:48:38.750  1756  1756 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.android.cellbroadcastreceiver: android.permission.MANAGE_ACTIVITY_STACKS, com.android.cellbroadcastreceiver: android.permission.STATUS_BAR}
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:2010)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:89)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.pm.permission.PermissionManagerService$PermissionManagerInternalImpl.systemReady(PermissionManagerService.java:2057)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:21446)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.SystemServer.startOtherServices(SystemServer.java:1803)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.SystemServer.run(SystemServer.java:453)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.server.SystemServer.main(SystemServer.java:316)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:504)
06-04 10:48:38.750  1756  1756 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:838)

解決方案
根據無法開機的報錯信息,需要將小區廣播中申請的權限添加到privapp-permissions-platform白名單中。

1.小區廣播申請權限AndroidManifest.xml如下:

 1 <?xml version="1.0" encoding="utf-8"?>
   2 <!--
   3 /*
   4  * Copyright (C) 2011 The Android Open Source Project
   5  *
   6  * Licensed under the Apache License, Version 2.0 (the "License");
   7  * you may not use this file except in compliance with the License.
   8  * You may obtain a copy of the License at
   9  *
  10  *      http://www.apache.org/licenses/LICENSE-2.0
  11  *
  12  * Unless required by applicable law or agreed to in writing, software
  13  * distributed under the License is distributed on an "AS IS" BASIS,
  14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15  * See the License for the specific language governing permissions and
  16  * limitations under the License.
  17  */
  18 -->
  19 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  20         package="com.android.cellbroadcastreceiver"
  21         android:sharedUserId="com.android.cellbroadcastreceiver.plugins">
  22 
  23     <original-package android:name="com.android.cellbroadcastreceiver" />
  24     <uses-sdk android:minSdkVersion="20" android:targetSdkVersion="28" />
  25     <uses-permission android:name="android.permission.RECEIVE_SMS" />
  26     <uses-permission android:name="android.permission.RECEIVE_EMERGENCY_BROADCAST" />
  27     <uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE" />
  28     <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
  29     <uses-permission android:name="android.permission.WAKE_LOCK" />
  30     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
  31     <uses-permission android:name="android.permission.VIBRATE" />
  32     <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
  33     <uses-permission android:name="android.permission.MANAGE_USERS" />
  34     <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  35     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  36     <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
  37     <uses-permission android:name="android.permission.STATUS_BAR" />
  38     <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
  39     <uses-permission android:name="android.permission.MANAGE_ACTIVITY_STACKS" />
  40 
  41     <application android:name="CellBroadcastReceiverApp"
  42             android:label="@string/app_label"
  43             android:supportsRtl="true"
  44             android:icon="@mipmap/ic_launcher"
  45             android:backupAgent="CellBroadcastBackupAgent"
  46             android:defaultToDeviceProtectedStorage="true"
  47             android:directBootAware="true">
            ... ...
 205 
 206     </application>
 207 </manifest>

2.需要將 priv-app 在AndroidMainfest.xml 中申請的權限 添加到特許白名單中(frameworks/base/data/etc/privapp-permissions-platform.xml)

   1 <?xml version="1.0" encoding="utf-8"?>
   2 <!--
   3   ~ Copyright (C) 2016 The Android Open Source Project
   4   ~
   5   ~ Licensed under the Apache License, Version 2.0 (the "License");
   6   ~ you may not use this file except in compliance with the License.
   7   ~ You may obtain a copy of the License at
   8   ~
   9   ~      http://www.apache.org/licenses/LICENSE-2.0
  10   ~
  11   ~ Unless required by applicable law or agreed to in writing, software
  12   ~ distributed under the License is distributed on an "AS IS" BASIS,
  13   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14   ~ See the License for the specific language governing permissions and
  15   ~ limitations under the License
  16   -->
  17 
  18 <!--
  19 This XML file declares which signature|privileged permissions should be granted to privileged
  20 applications that come with the platform
  21 -->
  22 <permissions>
          ... ... 
  36     <privapp-permissions package="com.android.cellbroadcastreceiver">
  37         <permission name="android.permission.INTERACT_ACROSS_USERS"/>
  38         <permission name="android.permission.MANAGE_USERS"/>
  39         <permission name="android.permission.MODIFY_PHONE_STATE"/>
  40         <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
  41         <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
  42         <permission name="android.permission.MANAGE_ACTIVITY_STACKS"/>
  43         <permission name="android.permission.STATUS_BAR"/>
  44     </privapp-permissions>

         ... ...
452 </permissions>

長按識別二維碼,領福利

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

如有侵權,請聯系小編,小編對此深感抱歉,屆時小編會刪除文章,立即停止侵權行為,請您多多包涵。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM