二、存储方式分析
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
领取专属 10元无门槛券
私享最新 技术干货