AndroidMainfest.xml文件中allowBackup=true有什么风险?

前言:最近接到公司安全中心同学的邮件告知开发中的一款App存在数据备份及隐私泄漏的风险,具体为AndroidMainfest.xml文件中allowBackup=true,之前一直没有专门了解过这个属性的作用及有什么隐藏的风险,于是上网搜索了一下相关资料,发现这个属性还挺有意思的,包括属性的影响到底有多大和潜在风险啥的,于是记录此文,谈谈自己的理解。

准备工作
在我们开始演示之前,先做一些准备工作,因为相关的操作会用到aapt这个命令,所以我们要做的是配置一下环境变量。
在没有配置全局环境变量的电脑上打开终端,输入appt v会报以下提示:

bogon:~ ShingRing$ aapt v
-bash: aapt: command not found
bogon:~ ShingRing$ 

下面介绍以下配置全局的环境变量吧,不然每次还得到指定到目录下才能执行aapt命令。
aapt命令存在于咱们的Android-sdk-build-tools下对应任一版本目录下
在这里插入图片描述
① 打开终端,在根目录下输入touch命令

touch .bash_profile

这里解释一下touch命令,touch命令有两个功能:
一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;
二是用来创建新的空文件。

在根目录下输入ls -a命令,查看是否有.bash_profile文件,若已存在,则可以省略第①步。

② 使用open命令打开.bash_profile文件,并进行编辑,在文件末尾追加以下代码行

AAPT_HOME=/Users/ShingRing/Library/Android/sdk/build-tools/25.0.2
export AAPT_HOME
export PATH=$PATH:$AAPT_HOME

注意,AAPT_HOME可以是你的sdk的build-tools的任意版本的路径。

③ 重新开启一个Terminal,此时再输入aapt v命令,可以看到aapt的版本信息,此时aapt的环境变量配置成功。

bogon:~ ShingRing$ aapt v
Android Asset Packaging Tool, v0.2-3544217
bogon:~ ShingRing$ 

好了,到这里我们需要用到的命令已经配置好了,下面接着看allowBackup。

官方描述

android:allowBackup
Whether to allow the application to participate in the backup and restore infrastructure. If this attribute is set to false, no backup or restore of the application will ever be performed, even by a full-system backup that would otherwise cause all application data to be saved via adb. The default value of this attribute is true.

翻译过来就是:
是否允许应用程序参与备份和还原基础结构。如果此属性设置为false,则不会执行应用程序的备份或还原,即使是全系统备份也会导致所有应用程序数据都通过adb保存。此属性的默认值为true。

再看看网上的描述:
Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB 调试开关的人从Android手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当用户的数据被备份了,那么他就可以将这个数据通过备份恢复到其他的手机或者模拟器上。这对用户来说是不被允许的。因此为了安全起见,开发者务必将allowBackup标志值设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。

好了,到这里相信大家对allowBackup这是个什么东西,干什么用的,有了一定的理解,那么我们就理论结合实践弄一个demo来演示一下如何操作吧。

演示流程
1.新建工程,在输入框中输入数据,点击保存按钮,将数据保存到设备中;
2.通过aapt命令查看apk中的属性文件等等。
3.在终端执行adb backup命令,将app中的数据进行备份;
4.换台设备,安装apk,然后在终端执行adb restore 命令,将数据恢复到新设备上;
5.使用abe工具查看数据

1.新建demo项目
首先创建一个项目工程,然后绘制几个简单布局,样式就这样
在这里插入图片描述
主要功能就是输入数据后点击保存按钮,即可将数据保存到SharedPreferences中。
然后编译打包生成apk,下面我们用准备工作中提到的aapt命令对apk进行一些分析。

2.分析AndroidManifest.xml
我们拿到一个apk的时候,都可以通过aapt命令查看他的AndroidManifest.xml内容

bogon:~ ShingRing$ aapt dump xmltree allowbackup-debug.apk AndroidManifest.xml > /Users/ShingRing/demo.txt 

这样就会在输出目录下多出一个demo.txt文件,我们打开该文件

N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=2)
    A: android:versionCode(0x0101021b)=(type 0x10)0x1
    A: android:versionName(0x0101021c)="1.0" (Raw: "1.0")
    A: package="com.demo.allowbackup" (Raw: "com.demo.allowbackup")
    E: uses-sdk (line=7)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0xf
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x1c
    E: application (line=11)
      A: android:theme(0x01010000)=@0x7f070000
      A: android:label(0x01010001)=@0x7f060000
      A: android:icon(0x01010002)=@0x7f050000
      A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
      A: android:testOnly(0x01010272)=(type 0x12)0xffffffff
      A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff
      A: android:supportsRtl(0x010103af)=(type 0x12)0xffffffff
      A: android:roundIcon(0x0101052c)=@0x7f050001
      E: activity (line=20)
        A: android:name(0x01010003)="com.allowbackup.MainActivity" (Raw: "com.allowbackup.MainActivity")
        E: intent-filter (line=21)
          E: action (line=22)
            A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
          E: category (line=24)
            A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")

注意到这一行:

A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff

这里可以看到allowBackup设置的值是true,因为非0的都是true。说明allowbackup-debug.apk这个应用是可以使用adb backup命令进行隐私数据的备份的,下面就来看一下如何进行备份。

3.备份数据
我们在安装apk的设备上启动app,然后填充一些数据,点击保存按钮,将数据保存到手机中。
在这里插入图片描述
下面可以退出app了,打开电脑终端,输入备份命令,回车,会提示如下:

bogon:~ ShingRing$ adb backup -f back.ab -noapk com.demo.allowbackup
Now unlock your device and confirm the backup operation...

注意:back.ab是备份的文件名字,自取,不一定跟我一样,com.demo.allowbackup是我们要备份的app的包名。
adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <档案名称> [需要备份的应用包名]
1> [-system|-nosystem]
这个指令是告诉adb 在备份时是否要连同系统一起备份
若没有打的话 默认是-system 表示会一起备份系统
注意!若连系统一起备份 在还原的时候会复盖系统档案 对于已经升级后的手机是非常不好的
我不知道在没有ROOT的情况下 adb是否有权限去还原系统档案 但就算如此 还是不建议这样做
因此 -nosystem是建议一定要打上的指令
2> -all
这个指令除非只是要备份单一APP 不然是一定要打上去的
这个是问你是否要备份全部的APP 若有加上-nosystem的指令
那么他就只会备份你目前已经安装上去的APP 而不会连系统APP一起备份
3> [-apk|-noapk]
默认是-noapk 这个的意思是是否连安装的APK一起备份
若为-noapk 则只会备份APK的资料档(像是游戏存盘 设定 之类的)
4> [-shared|-noshared]
默认是-noshared 这个会问你是否连手机储存空间或是SD卡的档案一起备份

这时候手机屏幕会弹出如下界面提示备份:
在这里插入图片描述
输入密码:123456,点击备份我的数据按钮,等待几秒后,会提示备份已完成。

4.数据恢复
这时候我们可以在一台新设备(只有一台设备的同学也可以在同一台设备上把app卸载重装)上安装同一个apk文件,然后同样打开电脑终端,输入以下命令:

adb restore back.ab

手机屏幕会弹出以下界面:
在这里插入图片描述
输入密码:123456,点击恢复我的数据按钮,恢复完成后打开app,就可以看到
在这里插入图片描述
提示数据恢复成功,并且我们之前填写的数据都能够正确的读取出来,到这里,allowbackup=true的功能演示完成了。

5.应用场景和潜在风险
综合网上看的一些资料,allowbackup=true这个属性对社交类的app比较实用,但是也需要做多设备唯一标识识别处理,判断不是同一手机操作就应该先启动登录页面,避免用户隐私泄漏,我记得之前在pc上是有手机助手之类的客户端,里面有对微信/QQ聊天记录备份-迁移的功能,如果微信/QQ将该属性设为false,那么数据将无法进行备份,当然前提是账户安全工作得做好。
另外比如现在很多的app是有设备锁这个功能的,其实设备锁也是一个系统级的app,在启动的时候先打开解锁界面,密码正确后关闭掉显示应用的页面,如果类似这种设备锁的应用允许备份的话,用户完全可以通过备份,然后通过工具对备份文件进行分析,从而达到破解的目的,那么最后我们来介绍一个工具的使用。

6.abe工具的使用
使用android-backup-extractor(abe)工具来解析ab文件。
这个工具是开源的,用Java语言写的。源码位于:https://github.com/nelenkov/android-backup-extractor
快捷下载地址:https://download.csdn.net/download/woshizisezise/10891485
用法也很简单,将abe.jar拷贝到我们刚刚备份的back.ab目录下
在这里插入图片描述
然后输入命令java -jar abe.jar unpack back.ab back.zip
解压后就会得到back.zip压缩包,打开压缩包查看里面的资源:
在这里插入图片描述
这里可以看到我们刚才存储在sp中的数据:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="phone">110</string>
    <string name="name">张三</string>
    <string name="pwd">123456</string>
</map>

从而达到了获取用户隐私数据的目的。
当然以上这些只是对allowBackup=true的一个简单的讲解,希望大家能够明白这是什么东西,并且如何防范它带来的风险,3Q~

发布了87 篇原创文章 · 获赞 161 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/woshizisezise/article/details/85322529
今日推荐