Android 属性 allowBackup 安全风险浅析

1. allowBackup 安全风险描述

Android API Level 8 及其以上 Android 系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中 AndroidManifest.xml 文件中的 allowBackup 属性值,其属性值默认是 True。当 allowBackup 标志为 true 时,用户便可经过 adb backup 和 adb restore 来进行对应用数据的备份和恢复,这可能会带来必定的安全风险。android

Android 属性 allowBackup 安全风险源于 adb backup 允许任何一个可以打开 USB 调试开关的人从Android 手机中复制应用数据到外设,一旦应用数据被备份以后,全部应用数据均可被用户读取;adb restore 允许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的建立。所以,当一个应用数据被备份以后,用户便可在其余 Android 手机或模拟器上安装同一个应用,以及经过恢复该备份的应用数据到该设备上,在该设备上打开该应用便可恢复到被备份的应用程序的状态。安全

尤为是通信录应用,一旦应用程序支持备份和恢复功能,攻击者便可经过 adb backup 和 adb restore 进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可经过此来进行恶意支付、盗取存款等;所以为了安全起见,开发者务必将 allowBackup 标志值设置为 false 来关闭应用程序的备份和恢复功能,以避免形成信息泄露和财产损失。app

2. allowBackup 安全影响范围

Android API Level 8 以及以上系统。spa

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 命令进行备份整个应用的数据3d

    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应用启动后以下左图所示与登陆以后以下右图所示:rest

    TB12ICfHpXXXXctaXXXgR0z3pXX-537-451.jpg

    经过adb命令备份该应用登陆以后的应用数据:code

    TB1rzaLGXXXXXagaFXXisSGPpXX-688-114.png

    TB1D3JDGXXXXXccaXXXA0gJJXXX-720-1280.png

    经过做者 Nikolay Elenkov 写的解密程序 Android Backup Extractor 解密出备份的文件 allowBackup.ab,可得知该 POC 应用的数据(登陆用户名和密码)以下图所示:xml

    TB1TD9nHpXXXXclXpXXnq.t_XXX-766-252.png

    在另一台 Android 手机上,安装该 POC 应用,而后经过恢复上面备份的数据,可使得新安装的应用达到登陆状态:htm

    TB1hLaqHpXXXXcvXXXXaa2PRVXX-438-44.png

    恢复数据以前:

    TB1qKO_HXXXXXbDaXXXLwJp0pXX-529-428.jpg

    点击“恢复个人数据”,恢复数据以后,在没有输入用户名和密码的状况下,经过恢复数据,点击应用图标,直接进入登陆状态:

    TB1JTWmHpXXXXXOXFXXqJ18FpXX-1080-1920.png

  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应用启动后以下左图所示与登陆以后以下右图所示:

    TB1H.epHpXXXXcdXXXXrVMtUpXX-521-437.jpg

    经过adb命令备份该应用登陆以后的应用数据:

    TB1V9GmHpXXXXc_XpXXRFMb4FXX-695-69.png

    经过解密出备份的文件”allowBackup.ab”,经过以下图所示可得知该POC应用的备份的数据为空,所以备份不成功:

    TB1h1S0HXXXXXcLXVXXD4go_XXX-766-195.png

    在另一台Android手机上,安装该POC应用,而后经过恢复上面备份的数据,可使得新安装的应用达到登陆状态:

    TB1r7OnHpXXXXcDXpXXwKTEOpXX-475-128.png

    恢复数据以前:

    TB1ah1aGVXXXXcDapXXxKht0pXX-532-452.jpg

    恢复数据以后,从新打开应用,发现没有直接进入登陆状态:

    TB1LpaoHpXXXXcXXpXXqJ18FpXX-1080-1920.png

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>

转自 阿里聚安全博客常见漏洞系列

相关文章
相关标签/搜索