存储安全(二)

二、存储方式分析

1、安卓APP权限简介

Andorid是基于Linux开发的,在用户管理方面继承了Linux的部分特性,但是也有很大的不同。在传统的Linux中,很多个应用可能都是由一个uid运行的。但是在Android中,每个APP都以独立的用户身份运行在独立的沙盒中。系统会为每个APP创建单独的uid和gid。APP在单独的进程中运行,并且只能够访问自己的资源。

如下图,APP数据目录只属于自己的用户和组,并且无权访问其他应用的数据。

通常APP会被分配10000 到99999范围内的uid和gid,并根据一定的规则映射为用户名和组名。

比如下图中,uid和gid都是10057,而用户名和组名就为u0_a57。

我们知道APP要使用特定的功能,一般需要申请相应的权限。比如要读写sd卡,就要申请sd卡读写权限。如上图系统就会在groups里面添加对应权限的gid。这样应用就具有了sdcard_rw组的权限了,即拥有了sd卡读写权限。

2、Shared Preferences

Shared Preferences 通常被用来保存少量的数据,其文件默认被存储在应用目录下的shared_prefs目录下。Shared Preferences 文件其实就是 xml 文件,里面的数据一般以键值对的形式存储。

在编程的时候一般使用

来获取 SharedPreferences 对象。这个方法有两个参数,第一个参数是指定 SharedPreferences 文件名,第二个参数是指定操作模式。其操作模式有以下几种:

MODE_PRIVATE:私有模式,也是默认的模式。此模式下文件只能被当前APP或者与当前APP具有相同 user ID 的APP读取。

MODE_WORLD_READABLE:允许所有应用读此文件。

MODE_WORLD_WRITEABLE:允许所有应用写此文件。

MODE_MULTI_PROCESS:用于处理本应用操作此文件时多线程的问题。

从上面的描述中可以发现,当存有敏感数据的 SharedPreferences 文件被赋予MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE时,是会存在安全问题的。

在漏洞示例 APP 中,代码如下:

我们查看一下对应的文件权限:

可以看到 account_dangerous.xml 的权限为-rw-rw-rw-,证实了所有应用对其具有读写权限。

3、内部文件存储

内部文件存储通常用来存储一些比较大的数据,比如说图片、视频之类的。通过内部文件存储,你可以存储任意类型的数据,与SharedPreferences 类似,其也有几种存储模式,如下:

当使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE模式存储敏感信息的时候,就会造成安全问题。

在漏洞示例 APP 中,代码如下:

查看一下对应的文件权限:

可以看到 account_dangerous.txt 的权限为-rw-rw-rw-,证实了所有应用对其具有读写权限。

4、外部文件存储

外部文件存储通常指 sd卡的存储,其可以被用来存储任意的文件。外部存储中的文件对应所有应用来说都是可读的,因此当在外部存储中存放敏感数据时会造成安全问题。

在漏洞示例APP中,代码如下:

查看一下对应的文件权限:

可以看到所有文件都属于 sdcard_r 组,因此只要应用申请了READ_EXTERNAL_STORAGE的权限就可以读其他应用的外部存储文件内容。

5、SQLite 数据库存储

安卓支持 SQLite 作为本地数据库存储。当使用 openOrCreateDatabase 来创建数据库的时候,也会有文件权限的问题。

其存储模式如下:

当使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE模式,并且有敏感数据存储的话,会造成安全问题。

在漏洞示例 APP 中,代码如下:

查看一下文件权限,来证实一下问题所在:

参考:

https://sushi2k.gitbooks.io/the-owasp-mobile-security-testing-guide/content/0x05d-Testing-Data-Storage.html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180722G0CS3K00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券