Android 屬性 allowBackup 安全風險淺析

1. allowBackup 安全風險描述

Android API Level 8 及其以上 Android 系統提供了爲應用程序數據的備份和恢復功能,此功能的開關決定於該應用程序中 AndroidManifest.xml 文件中的 allowBackup 屬性值,其屬性值默認是 True。當 allowBackup 標誌爲 true 時,用戶即可通過 adb backup 和 adb restore 來進行對應用數據的備份和恢復,這可能會帶來一定的安全風險。

Android 屬性 allowBackup 安全風險源於 adb backup 容許任何一個能夠打開 USB 調試開關的人從Android 手機中複製應用數據到外設,一旦應用數據被備份之後,所有應用數據都可被用戶讀取;adb restore 容許用戶指定一個恢復的數據來源(即備份的應用數據)來恢復應用程序數據的創建。因此,當一個應用數據被備份之後,用戶即可在其他 Android 手機或模擬器上安裝同一個應用,以及通過恢復該備份的應用數據到該設備上,在該設備上打開該應用即可恢復到被備份的應用程序的狀態。

尤其是通訊錄應用,一旦應用程序支持備份和恢復功能,***者即可通過 adb backup 和 adb restore 進行恢復新安裝的同一個應用來查看聊天記錄等信息;對於支付金融類應用,***者可通過此來進行惡意支付、盜取存款等;因此爲了安全起見,開發者務必將 allowBackup 標誌值設置爲 false 來關閉應用程序的備份和恢復功能,以免造成信息泄露和財產損失。

2. allowBackup 安全影響範圍

Android API Level 8 以及以上系統。

3. allowBackup 安全風險詳情

  1. allowBackup 風險位置:AndroidMannifest.xml 文件 android:allowBackup 屬性

  2. allowBackup 風險觸發前提條件:未將 AndroidMannifest.xml 文件中的 android:allowBackup 屬性值設爲 false

  3. allowBackup 風險原理:當 allowBackup 標誌值爲 true 時,即可通過 adb backup 和 adb restore 來備份和恢復應用程序數據

4. allowBackup 詳細風險 POC

  1. 不在 AndroidManifest.xml 文件設置 allowBackup 屬性值,其默認值爲 true,則應用可通過 adb 命令進行備份整個應用的數據

    AndroidManifest.xml 文件內容:

    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.alibaba.jaq.allowbackuppoc"
              android:versionCode="1"
              android:versionName="1.0">
        <uses-sdk android:minSdkVersion="10"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <application
                   android:label="@string/app_name">
            <activity android:name="LoginActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
            <activity android:name=".HomeActivity"/>
        </application></manifest>

    該POC應用啓動後如下左圖所示與登錄之後如下右圖所示:

    bVk2YO

    通過adb命令備份該應用登錄之後的應用數據:

    bVk2YR

    bVk2YS

    通過作者 Nikolay Elenkov 寫的解密程序 Android Backup Extractor 解密出備份的文件 allowBackup.ab,可得知該 POC 應用的數據(登錄用戶名和密碼)如下圖所示:

    bVk2YT

    在另外一臺 Android 手機上,安裝該 POC 應用,然後通過恢復上面備份的數據,可以使得新安裝的應用達到登錄狀態:

    bVk2Y0

    恢復數據之前:

    bVk2Y1

    點擊“恢復我的數據”,恢復數據之後,在沒有輸入用戶名和密碼的情況下,通過恢復數據,點擊應用圖標,直接進入登錄狀態:

    bVk2Y2

  2.  AndroidManifest.xml 文件顯示設置 allowBackup 屬性值爲 false,即 android:allowBackup="false",則 Android 應用不可通過 adb 命令進行備份和恢復整個應用的數據

    AndroidManifest.xml文件內容:

    <?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.alibaba.jaq.allowbackuppoc"
              android:versionCode="1"
              android:versionName="1.0">
        <uses-sdk android:minSdkVersion="10"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <application
                android:allowBackup="false"
                android:label="@string/app_name">
            <activity android:name="LoginActivity"
                      android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
            <activity android:name=".HomeActivity"/>
        </application></manifest>

    該POC應用啓動後如下左圖所示與登錄之後如下右圖所示:

    bVk2Y3

    通過adb命令備份該應用登錄之後的應用數據:

    bVk2Y4

    通過解密出備份的文件”allowBackup.ab”,通過如下圖所示可得知該POC應用的備份的數據爲空,因此備份不成功:

    bVk2Y6

    在另外一臺Android手機上,安裝該POC應用,然後通過恢復上面備份的數據,可以使得新安裝的應用達到登錄狀態:

    bVk2Y9

    恢復數據之前:

    bVk2Za

    恢復數據之後,重新打開應用,發現沒有直接進入登錄狀態:

    bVk2Zb

5. allowBackup 風險修復建議

出於安全考慮,阿里聚安全建議關閉應用備份功能:在 AndroidMenifest.xml 文件中,將相應組件的 “android:allowBackup” 屬性設置爲 “false”,如下示例:

全選複製放進筆記<application
        android:allowBackup="false"
        android:label="@string/app_name">
    <activity android:name="LoginActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
    <activity android:name=".HomeActivity"/></application>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章