Android逆向之旅---Android中如何获取在非Root设备中获取应用隐私数据

本文转载自:http://blog.csdn.net/jiangwei0910410003/article/details/51437659

前言

今天在开发的过程中遇到一个问题,就是关于AndroidManifest.xml中的allowBackup属性,也算是自己之前对这个属性的不了解,加上IDE的自动生成代码,没太注意这个属性,但是没想到这个属性会直接导致隐私数据的丢失。下面就来看一下这个属性的影响到底有多大。他的作用是什么?

Android中的allowBackup属性

allowBackup安全风险描述

Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中AndroidManifest.xml文件中的allowBackup属性值[1] ,其属性值默认是true。当allowBackup标志为true时,用户即可通过adb backup和adb restore来进行对应用数据的备份和恢复,这可能会带来一定的安全风险。
Android属性allowBackup安全风险源于adb backup容许任何一个能够打开USB 调试开关的人从Android手机中复制应用数据到外设,一旦应用数据被备份之后,所有应用数据都可被用户读取;adb restore容许用户指定一个恢复的数据来源(即备份的应用数据)来恢复应用程序数据的创建。因此,当一个应用数据被备份之后,用户即可在其他Android手机或模拟器上安装同一个应用,以及通过恢复该备份的应用数据到该设备上,在该设备上打开该应用即可恢复到被备份的应用程序的状态。
尤其是通讯录应用,一旦应用程序支持备份和恢复功能,攻击者即可通过adb backup和adb restore进行恢复新安装的同一个应用来查看聊天记录等信息;对于支付金融类应用,攻击者可通过此来进行恶意支付、盗取存款等;因此为了安全起见,开发者务必将allowBackup标志值设置为false来关闭应用程序的备份和恢复功能,以免造成信息泄露和财产损失。

allowBackup安全影响范围

Android API Level 8以及以上系统

allowBackup安全风险详情

  1. allowBackup风险位置:AndroidMannifest.xml文件android:allowBackup属性
  2. allowBackup风险触发前提条件:未将AndroidMannifest.xml文件中的android:allowBackup属性值设为false
  3. allowBackup风险原理:当allowBackup标志值为true时,即可通过adb backup和adb restore来备份和恢复应用程序数据

如何在非root设备上获取隐私数据

好了,上面我们就了解了,原来allowBackup属性的风险很大。下面我们看看现在如果这个属性是false的话,我们怎么在没有root的设备去获取数据呢?
首先我们看这样一个场景,现在市场上有一些应用锁类的app,他们就是给每个应用打开的时候添加一个密码,在打开app的时候需要输入密码才能进入指定的应用,一般会把自己的银行app,通讯类的app加密。现在市场上这些应用锁的原理也很简单,一般是三种方式实现:

  1. 最古老的方式,启动一个Service然后隔一段时间去轮训,获取当前的topActivity,然后进行操作。
  2. 因为Android5.0以后,获取当前的topActivity需要授权,所以这里还需要做一个操作就是引导用户去开一些功能。
  3. 通过辅助功能,可以监听当前Window的变化,这种方式比上面的轮训方式高效的多了。

其实1和2两种方式差不多,唯一的区别就在于获取topActivity的方式,其实google意识到了,获取topActivity是很危险的一件事:
在之前的一篇文章中说到了:Android中通过应用锁盗取账号,恶意的软件,可以通过这个功能,使用一个类似于QQ或者支付宝这样的app,当用户启动QQ或者支付宝的时候,我们可以监听到,然后就启动我们自己的模拟QQ或者支付宝的登录页面然后就可以获取到用户名和密码了,完成盗取。
下面我们来看一个市场上比较火的一款应用锁app:智能应用锁
_pic1

我们下载apk,之后使用aapt查看他的AndroidManifest.xml内容:
aapt dump xmltree applock.apk AndroidManifest.xml > D:\demo.txt
注:我们在拿到一个apk的时候,如果想知道apk中的一些资源和配置信息,aapt命令是个不错的选择,同时,他能够删除apk中的一些资源,添加一些资源到apk中都是可以的。
_pic2

这里因为AndroidManifest.xml内容有点多,就重定向到一个txt文件中,我们看到allowBackup属性为true,因为非0的都是true。好吧,说明applock.apk这个应用咋们是可以使用adb backup命令进行隐私数据的备份的。下面咋们就来看一下如何进行备份:

第一步:使用adb backup -f applock.ab com.thinkyeah.smartlockfree 进行数据的备份

adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <档案名称> [需要备份的应用包名]

[-system|-nosystem]

这个指令是告诉adb 在备份时是否要连同系统一起备份

若没有打的话 默认是-system 表示会一起备份系统

注意!若连系统一起备份 在还原的时候会复盖系统档案 对于已经升级后的手机是非常不好的

我不知道在没有ROOT的情况下 adb是否有权限去还原系统档案 但就算如此 还是不建议这样做

因此 -nosystem是建议一定要打上的指令

-all

这个指令除非只是要备份单一APP 不然是一定要打上去的

这个是问你是否要备份全部的APP 若有加上-nosystem的指令

那么他就只会备份你目前已经安装上去的APP 而不会连系统APP一起备份

[-apk|-noapk]

默认是-noapk 这个的意思是是否连安装的APK一起备份

若为-noapk 则只会备份APK的资料档(像是游戏存盘 设定 之类的)

[-shared|-noshared]

默认是-noshared 这个会问你是否连手机储存空间或是SD卡的档案一起备份

关于这个应用的包名,我们可以直接从上面dump出来的AndroidManifest.xml中获取即可:
_pic3

获取包名之后,我们就可以执行命令,我们把导出来的文件保存到当前目录下:applock.ab,注意这里的格式是ab,这个也是Android中备份文件的格式要求。
_pic4

当我们执行这个命令的时候,设备端会出现一个提示页面:
_pic5

这时候会提示我们输入备份密码,这里为了简单,不输入,直接点击备份即可。
_pic6

下面,我们还需要借助一个工具来解析这个ab文件。

第二步:使用android-backup-extractor(abe)工具来解析ab文件

这个工具是开源的,用Java语言写的。源码位于:https://github.com/nelenkov/android-backup-extractor
这里没有直接下载源码,然后编译了,直接在网上下载了一个编译好的
这里我就下载好了,可以从这里下载:http://download.csdn.net/detail/jiangwei0910410003/9523470
_pic7

用法也很简单:
_pic8

看到我们使用unpack参数来将ab文件转化成tar文件:
java -jar abe.jar unpack applock.ab applock.tar
_pic9
我们在用解压缩软件查看内容:
_pic10

我们现在如果想知道他的密码,那么可以直接查看SharePreferences文件即可,因为一般都会把密码放到这里保存,不过这是一个非常危险的操作,如果你在不进行加密的话,那更是危险了。
_pic11

我们查看SmartLockConfig.xml内容:
_pic12

好吧,被我们猜中了,他尽然把手势密码以明文的方式保存在这里。这里他用的是手势方式加密:03678,代表的应该是一个L:
_pic13

到这里我们就成功的破解了智能应用锁的加密app的功能,而且是在没有root的情况下。下面来总结一下:

1、这个智能应用锁的app现在在市场的下载量还是蛮高的,已经有100W的下载量了,但是我们看到他的一不留神allowBackup属性设置成true,这样就导致了数据可能被外泄,不过这个属性google不知道怎么去对待他的,他的默认值尽然是true,而且更为有趣的是,在使用各大IDE工具,默认新建的工程之后,这个属性的值也是true
_pic14 _pic15

上面就是现在比较常用的两个IDE工具:Eclipse和AndroidStudio,看到当我们新建一个工程的时候,他默认都是把这个属性设置成true的,那么当你不设置设置个属性的时候,也是可以进行备份的,因为默认值也是true的,所以按照google的想法,应该是为了防止数据的丢失,就留了这一个功能。便于用户备份数据。但是这里会隐含一些安全问题,所以我们在开发的时候,如果不去注意这个属性的话,就会吃亏的,所以在开发的过程中一定要记得把这个属性设置成false,特别是非常重要的需要账号登录的app。
2、上面分析了智能应用锁的app,并非只是一个案例,其实现在很多app都有这个问题,我们看看豌豆荚app
_pic16

他也是没有手动的改变这个属性为false的,所以他的数据也是可以导出来的。
再看看优酷视频app
_pic17

也是一样,不过像这些app,他们的账号登录密码啥的信息肯定不是放在本地的,而是放到服务端进行验证的,不像应用锁这样的,他不需要联网也是可以进行操作的,所以密码必须放到本地。但是只要有这个属性allowBackup为true的话,就会被查看到沙盒数据,就是不安全的。最后我们再来看看微信5.0版本也有这个问题,不过他在6.0之后已经把allowBackup设置成false了:
_pic18

这里我们看到他没有设置allowBackup属性,但是刚刚说了,默认值就是true,所以还是可以导出来的,下面我们可以使用上面的导出步骤进行操作:
_pic19

这里,其实微信他把通讯录和聊天记录,都是保存到db中,但是这个db是进行加密的,然后保存到一个目录下面的,关于这个db加密,其实是需要反编译微信,然后动态调试跟踪代码来破解了,这个后面会写一篇文章详细介绍的,因为我们知道,通讯录和聊天内容是没有网络就可以查看的,那么加解密肯定是放在本地做的,只要是放在本地做的,那么就可以进行破解。
不过这里看到微信在后续的版本已经修复了这个问题,6.0版本之后就不能导出来数据了,那么5.0的用户其实还是会受影响的。
3、还是回到这个应用锁app中来,其实在这里还是想吐槽一番的,作为下载量蛮高的app,尽然把密码用明文保存到xml中,这种做法其实是对用户的不负责,首先这里完全可以使用MD5来做密码验证就可以了,为何要暴露明文,其次是为何把这么重要的数据保存到xml中,稍微加点难度破解的放到so中也是可以的呀~~
4、破解场景:之前我看到好几个同事都下载了这个app,去加密相册app,QQ和微信啥的呀,其实现在看来并没有什么用,当我拿到手机的那一刻,什么都是可以做的,而且不需要root,只需要一个命令就可以了,完全的悄无声息,没法察觉的就看到密码了。
5、所以在开发的过程中,我们在最后一步发包的过程中一定要检查一下这个属性是否为false,因为他牵涉到你的太多隐私信息了

补充:

  1. 我们可以使用adb backup命令来做一下操作,就是我们在开发过程中,如果遇到手机没有root的,但是又想查看沙盒数据,那么这个也是一种方式,当然我们可以使用run-as命令来操作,不了解run-as的同学可以看这篇文章:Android中的run-as命令使用 但是这个也是一种方式,虽然看上去有点繁琐。
  2. 与上面的adb backup命令相对应的还有一个就是adb restore命令,他是用来恢复数据的,具体用法:

adb restore applock.ab
_pic20

这时候也会在客户端出现确认页面:
_pic21

点击恢复数据即可。
那么这里又有一个问题了,现在如果我想改了这个应用锁的密码,其实很简单:
_pic22

然后在保存成ab文件,然后还原。密码就被修改了。那么比如有些应用它把一些隐私的链接url这样的信息保存到xml中,那就蛋疼了,我们可以导出来数据,然后修改url为我们自己的url,然后在还原,我擦,如果是一些上报,或者是登录的url,我们就可以在这里做手脚,达到我们想要的目的了。

技术概要

  1. 分析了现阶段应用锁的原理以及如何使用应用锁来进行账号盗取
  2. 使用aapt命令查看apk包中信息
  3. 使用adb backup/restore进行应用数据的备份和还原
  4. 使用abe工具查看备份文件
  5. 我们在备份完数据之后,可以尝试查看一些应用的隐私数据,同时还可以篡改信息,在还原。都是可以的。
  6. 在开发过程中对于没有root的设备,adb backup也是可以用来查看开发应用的沙盒数据的,只是过程有点复杂。

总结

从这篇文章我们可以可以看到,一个属性的不留意,会带来多大的风险,当然这个属性也是很蛋疼的,就是他默认值是true,所以在你不管他的情况下还是有问题的,必须手动的去设置成false才可以,所以这个也是导致现在市场上很多app都存在这样的风险。其次这里我们主要分析了一个智能应用锁的信息,发现他犯了一个最大的错误就是把密码用明文的方式保存在xml中,破解难度为0,如果有一些你的朋友或者你的老婆,想看你的微信和QQ,同时又发现了你用了这个app去加密,那么你就惨了,你老婆只要会adb命令,或者看到这篇文章之后,就两步,然后看到你不想让她看到的数据,好吧,然后就没然后了,所以我们开发者在开发一个app的时候,不仅要的是用户体验,更重要的时候对用户的隐私负责。我们用户在下载和安装一些app的时候也是需要注意的就是多留点心