背景

我们经常会碰到手机丢失的情况。当攻击者可以物理接触设备时,他可以读取设备的个人信息和存储的数据。当你root之后会变得更糟。需要注意的是,如果本地存储实现做得不好,会导致严重的攻击。

安卓本地存储的技术

开发者可以使用多种方法存储数据在安卓应用之中,具体如下:

Shared Preferences

Shared Preferences是用key-value来存储私有的原始数据的一些xml文件。数据类型有布尔型,浮点型,整形,长整型和字符串。

SQLite数据库

SQLite数据库是轻量级基于文件的数据库。这些文件通常以db或者sqlite结尾。安卓默认提供了大量SQLite支持。由一个应用创建的数据只能由这个应用的类访问,其他应用没有权限。

内部存储

内部存储是我们存储文件的另一个方法。默认情况下,文件保存在内部存储中是私有的,其他应用无法访问,当用户卸载应用时,这些内部存储的文件也会被相应的删除。

外部存储

外部存储是一个你用于存储的地址。这个地址可以为一个可移除的存储媒介(例如SD卡)或者内存。SD卡可以被任意读取。

下一章节,我们来看看开发者怎么使用Shared Preferences来在设备上存储数据,并且从一个攻击者角度去读取这些数据。

环境:

l  安装安卓SDK的电脑

l  安装应用并Root过的手机

测试应用的功能

我开发了一个测试应用来展示这个漏洞。你可以下载这个应用。下载完之后在root后的手机上安装。

APP可以使用adb命令去安装:

adb install <apk名称>.apk

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

所有的应用都有存储在应用中数据的特性。当我启动这个应用的时候,我们可以看到下面的图片(Shared Preferences)

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

Shared preferences

让我们启动sharedpreferences应用并且插入一些用户名和密码。

Shared preferences由安卓的SharedPreferences类创建。下图是部分样本应用的代码。

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

我们可以看到上图中,我们创建了一个SharedPreferences实例,我们使用使用Ediotr对象把数据插入到xml文件。

接着我们看看数据存在哪个位置。

通常情况下存储的路径为:

/data/data/<package name>/shared_prefs/<filename.xml>

因此我们进入下面的路径来查看一下

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

上图中可以看到,有一个叫”shared_prefs”的目录。这个目录是使用sharedpreferences时创建的。我们可以进入到”shared_prefs”目录使用cat命令来查看应用的内容。我们可以下载xml文件到本地来查看。

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

上图中可以看到“userdetails.xml”文件被拷贝到了本地的机器,文件内容如下。

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

破解游戏修改分数

大部分手机游戏都不需要互联网,因此它的数据都是本地存储。在一个root之后的手机上我们可以浏览本地文件系统来查找存储游戏分数的文件,我们可以轻易修改游戏分数。

我们来破解一个流行的应用StickCricket。我们来看看怎么修改分数。

前提准备

l  Root过的设备

l  Droid Explorer用于文件浏览

l  ADB来访问设备

当我们加载StickCricket应用来玩的时候,它有一个activity来展示目前最高的分数。通常情况下很难在5轮拿到130以上的分数。

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

下面我们来破解这个程序

我们来浏览一下安卓的文件系统来看一下它存储数据的位置。如下图:

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

我们打开一个adb命令行并使用su命令提升权限。每一个应用安装到安卓设备上都会创建一个自己的目录在/data/data目录下。所以我们进入/data/data/com.sticksports.stickcricket/目录。

接下来我们执行ls来查看里面的目录结构。我们感兴趣的是“shared_prefs“目录。现在我们进入到“shared_prefs“来看下有没有感兴趣的文件。如下图,

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

目录中有3个XML文件,使用cat命令可以查看他们的内容,显然Cocos2dxPrefsFile.xml是用来存储分数的文件。接下来我们来替换来达到我们想要的目的。

我使用了windows下的一款工具叫做Droid Explorer。(http://de.codeplex.com/)

步骤如下

连接安卓设备到电脑

启动Droid Explorer浏览到目标目录
安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

把文件下载并用文本编辑器打开

在上图中,我们把分数从129改为180

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

 

接着使用Droid Explorer替换Cocos2dxPrefsFile.xml文件。

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

再次启动可以看到分数已变为180

安卓-9-不安全的本地存储:Shared Preferences-JE2Se ' Blog

结论

在这篇文章中,我们展示了shared preferences在安卓应用中的安全问题。建议使用密码学模块来加密应用数据。我们在之后的文章中会讲解如何使用加密模块。在下篇文章中,我们讲解其他数据存储的安全问题。