Android应用开发allowBackup敏感信息泄露的一点反思

简介:

转载:http://blog.csdn.net/yanbober/article/details/46417531

其实这篇文章可能有些小题大作,但回过头想想还是很有必要的,有点阴沟里翻船的感觉。相信大家都知道Android API Level 8开始提供了为应用程序备份和恢复数据的功能,此功能的开关可以通过应用程序中AndroidManifest.xml文件的allowBackup属性值进行配置,默认是True,所以用户可以对我们应用程序进行数据备份。相信很多人都和我一样一直当作耳边风过了一下Android这个特性,然后就一直没再打理了。然而旧事重提的故事是下面这样开始的:

前不久突然收到了一个Bug反馈,来自国内著名的白帽子组织乌云平台,关于这个组织就不作介绍了,相信大家一定知道问题的严重性,关于修复这个Bug是很快的事情,但是修复完这个Bug以后不得不让我进入思考(就像之前处理SQL注入一样),所以写出此文记录。

其实allowBackup的风险原理主要是允许通过adb backup对打开USB调试的设备进行数据备份,一旦得到备份文件之后那就不好说了,譬如邪恶的人可以再通过adb restore将你的数据恢复到自己的设备上,然后就完全在自己的设备上以你的名义去玩弄App;或者通过代码分析出备份文件中你登陆App的一些账户密码等核心信息。总之,Google当初设计的核心肯定是为了方便备份数据考虑的,但是大家自己开发的应用似乎忽略了手机丢失或者被他人捡到的问题,譬如通讯录或者名片、支付类等App如果一旦出现此类问题后果还是很严重的,所以有必要重视一下。

2 实例还原

为了验证该小问题可能带来的重大敏感信息泄露问题,我们下面选几个代表App进行测试,这样就可以直观的让你感受到泄露的一点危机。

特别声明: 本文实例中涉及的应用只为验证,且本问题一般不会造成太大风险,故烦请大家保持学习心态而不要肆意污蔑应用开发者;当然我也已经通过乌云漏洞平台对下面涉及到的应用进行了漏洞提交,相信这些应用新的迭代版本中很快就会解决掉的。

《简书》Android 1.9.7版本测试

结论: 会存在帐号被盗取问题。

验证: 设备A上登陆帐号密码后如下:

这里写图片描述

然后在该设备上执行如下命令将数据备份到电脑上:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-constant" style="box-sizing: border-box;">XXX</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ThinkPad</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/workspace/myself/temp</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>adb backup -f back.ab -noapk com.jianshu.haruki
<span class="hljs-constant" style="box-sizing: border-box;">Now</span> unlock your device <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> confirm the backup operation.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

此时换一台设备B安装此应用,但是不登陆任何帐号密码,执行如下命令:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-constant" style="box-sizing: border-box;">XXX</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ThinkPad</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/workspace/myself/temp</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>adb restore back.ab
<span class="hljs-constant" style="box-sizing: border-box;">Now</span> unlock your device <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> confirm the restore operation.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

可以看见,设备B没有进行帐号密码登陆,只是通过恢复A设备的备份数据就成功登陆了A设备的信息。

《Sina微博》Android 5.1.0版本测试

按照上面的类似流程测试微薄发现在设备B上面恢复设备A的数据无效,设备B依旧显示如下:

这里写图片描述

也就是说Sina微博考虑的很周全,已经修复了此类潜在的泄露风险,备份数据恢复无效,依旧需要重新登陆才可以,给一个赞。

《薄荷》Android 5.4.5.1版本测试

这个应用依据上面类似操作后你会发现完全可以在设备B上不用登陆帐号,只用恢复别人的备份帐号信息即可进入别人帐号界面,如下:

这里写图片描述

上面为设备B上截图情况,直接可以在设备B上操作设备A的帐号。

3 反思与总结

【工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重劳动成果】

看了上面两部分的叙述以后你可能也会意识到这个问题潜在的严重性,Google的初心是好的,但是一旦被别有用心的人瞄上了这个突破点问题就严重了。譬如再高端一点,别有用心的人专门写一段代码去执行数据备份上传到自己的云端服务器,然后解析这些备份数据,小则个人信息泄露,大则哈哈,你懂的。

既然这样肯定你也会关心解决方案吧,具体解决比较容易,如下:

方案1:

直接在你的Android清单文件中设置android:allowBackup=”false”即可,如下:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-pi" style="color: rgb(0, 102, 102); box-sizing: border-box;"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">manifest</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">xmlns:android</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"http://schemas.android.com/apk/res/android"</span>
          <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">package</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"com.test.disallowbackup"</span>
          <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:versionCode</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"1"</span>
          <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:versionName</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"1.0"</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-sdk</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:minSdkVersion</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"10"</span>/></span>

    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">application
</span>            <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:allowBackup</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"false"</span>
            <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:label</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"@string/app_name"</span>></span>
        <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">activity</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"LoginActivity"</span>
                  <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:label</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"@string/app_name"</span>></span>
            <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">intent-filter</span>></span>
                <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">action</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.intent.action.MAIN"</span>/></span>
                <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">category</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.intent.category.LAUNCHER"</span>/></span>
            <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">intent-filter</span>></span>
        <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">activity</span>></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">application</span>></span>
<span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">manifest</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

方案2:

不在你的Android清单文件中设置android:allowBackup=”false”,允许执行备份,但是在你应用启动页进行逻辑判断是否进行重新登陆等,譬如查看设备唯一识别设备编号和备份前是否一致,不一致则直接跳转登陆页面的同时清空当前应用数据及缓存。

好了,个人愚见,不足说服力,只是因为项目被乌云反馈而写的一点总结而已,目前我们采用了类似新浪微博的方案1做法。


相关文章
|
8天前
|
Java 调度 Android开发
深入解析Android应用开发中的响应式编程与RxJava应用
在现代Android应用开发中,响应式编程及其核心框架RxJava正逐渐成为开发者的首选。本文将深入探讨响应式编程的基本概念、RxJava的核心特性以及如何在Android应用中利用RxJava提升代码的可读性和性能。 【7月更文挑战第7天】
|
22天前
|
移动开发 Java Android开发
探索iOS与安卓应用开发的核心差异
【6月更文挑战第22天】在移动开发的广阔天地中,iOS和安卓这两大平台以其独特的特性和用户基础塑造了不同的开发生态。本文将深入探讨这两个平台在开发环境、编程语言、用户界面设计、性能优化以及发布流程方面的关键差异,为开发者提供实用的比较视角,并指出各自平台的特有优势和面临的挑战。了解这些差异有助于开发者更精准地定位自己的应用开发策略,实现跨平台的成功。
|
24天前
|
编解码 Android开发 iOS开发
探索iOS与安卓应用开发的差异性与交互设计哲学
在移动应用开发的广阔天地中,iOS和安卓这两大操作系统不仅塑造了市场的双雄争霸格局,更在开发者社区内激发了关于“最佳实践”的热烈讨论。本文将深入探讨这两个平台在技术架构、用户界面设计以及市场策略上的根本差异,揭示它们如何影响应用的性能、用户体验和商业成功。通过比较分析,我们将展现每个平台的独特优势,并为开发者提供战略性建议,以便在不同生态系统中实现最大化的产品潜力和用户满意度。
|
18天前
|
传感器 安全 Android开发
探索iOS与安卓应用开发的性能差异
在移动操作系统领域,iOS和安卓的较量从未停歇。本文将深入探讨两大平台在应用开发中的性能表现,揭示它们各自的优势与局限。通过对比分析,我们将理解开发者如何在这两个不同的生态系统中做出权衡,以及这些选择如何影响最终用户的体验。
9 0
|
7天前
|
安全 Java Android开发
探索安卓应用开发中的Kotlin语言优势
【7月更文挑战第8天】 在安卓开发的广阔天地中,Kotlin以其优雅的语法、现代化的特性和高效的性能成为了开发者的新宠。本文将深入探讨Kotlin在安卓应用开发中所展现的独特魅力,从语言特性到实际应用案例,揭示其如何简化代码编写、提升开发效率,并增强应用性能。通过对比分析,我们将一同见证Kotlin如何在众多编程语言中脱颖而出,成为安卓开发领域的一股清新之风。
192 11
|
2天前
|
搜索推荐 5G Android开发
探索安卓应用开发的未来趋势
【7月更文挑战第13天】随着技术的不断进步和用户需求的日益多样化,安卓应用开发领域正迎来前所未有的变革。本文将深入探讨安卓应用开发的最新技术动态、未来发展趋势以及面临的挑战,旨在为开发者提供指导和灵感。
|
7天前
|
Java Android开发 开发者
探索安卓应用开发的未来:Kotlin语言的崛起与挑战
【7月更文挑战第8天】随着移动设备在人们日常生活中扮演着越来越重要的角色,安卓应用开发的技术趋势和编程语言选择对开发者来说变得至关重要。本文将深入探讨Kotlin语言如何成为安卓开发的首选,分析其带来的优势及面临的挑战,并预测其未来的发展方向。
|
5天前
|
开发工具 Android开发 iOS开发
探索iOS与安卓应用开发的差异及未来趋势
在移动操作系统的竞争中,iOS和安卓一直是两大巨头。本文深入探讨了这两个平台在开发环境、用户体验和市场趋势方面的不同点,并预测了未来可能的发展方向。通过比较分析,旨在为开发者提供有价值的参考,帮助他们根据项目需求和目标受众选择最适合的开发平台。
|
8天前
|
人工智能 物联网 Android开发
探索安卓应用开发的未来趋势
【7月更文挑战第7天】随着技术的不断进步,安卓应用开发领域正经历着前所未有的变革。从Kotlin的崛起到Flutter的跨平台能力,再到人工智能和机器学习的集成,开发者们面临着既激动人心又充满挑战的未来。本文将深入探讨这些趋势如何塑造未来的安卓应用开发,并讨论它们对开发者社区的意义。
|
11天前
|
存储 安全 Android开发
安卓应用开发的安全之道
【7月更文挑战第4天】在数字时代,移动应用的安全性至关重要。本文将深入探讨在安卓平台上开发安全应用的最佳实践,包括代码混淆、数据存储加密、网络通信安全、权限管理以及定期的安全审计和更新策略。通过这些措施,开发者可以显著提高他们的应用抵御恶意攻击的能力,保护用户数据免受侵害。