Android逆向之旅---Android中如何獲取在非Root裝置中獲取應用隱私資料
一、前言
今天在開發的過程中遇到一個問題,就是關於AndroidManifest.xml中的allowBackup屬性,也算是自己之前對這個屬性的不瞭解,加上IDE的自動生成程式碼,沒太注意這個屬性,但是沒想到這個屬性會直接導致隱私資料的丟失。下面就來看一下這個屬性的影響到底有多大。他的作用是什麼?
二、Android中的allowBackup屬性
1、allowBackup安全風險描述
Android API Level 8及其以上Android系統提供了為應用程式資料的備份和恢復功能,此功能的開關決定於該應用程式中AndroidManifest.xml檔案中的allowBackup屬性值[1] ,其屬性值預設是true。當allowBackup標誌為true時,使用者即可通過adb backup和adb restore來進行對應用資料的備份和恢復,這可能會帶來一定的安全風險。
Android屬性allowBackup安全風險源於adb backup容許任何一個能夠開啟USB 除錯開關的人從Android手機中複製應用資料到外設,一旦應用資料被備份之後,所有應用資料都可被使用者讀取;adb restore容許使用者指定一個恢復的資料來源(即備份的應用資料)來恢復應用程式資料的建立。因此,當一個應用資料被備份之後,使用者即可在其他Android手機或模擬器上安裝同一個應用,以及通過恢復該備份的應用資料到該裝置上,在該裝置上開啟該應用即可恢復到被備份的應用程式的狀態。
尤其是通訊錄應用,一旦應用程式支援備份和恢復功能,攻擊者即可通過adb backup和adb restore進行恢復新安裝的同一個應用來檢視聊天記錄等資訊;對於支付金融類應用,攻擊者可通過此來進行惡意支付、盜取存款等;因此為了安全起見,開發者務必將allowBackup標誌值設定為false來關閉應用程式的備份和恢復功能,以免造成資訊洩露和財產損失。
2、allowBackup安全影響範圍
Android API Level 8以及以上系統
3、allowBackup安全風險詳情
1) allowBackup風險位置:
AndroidMannifest.xml檔案android:allowBackup屬性
2) allowBackup風險觸發前提條件:
未將AndroidMannifest.xml檔案中的android:allowBackup屬性值設為false
3) allowBackup風險原理:
當allowBackup標誌值為true時,即可通過adb backup和adb restore來備份和恢復應用程式資料
三、如何在非root裝置上獲取隱私資料
好了,上面我們就瞭解了,原來allowBackup屬性的風險很大。下面我們看看現在如果這個屬性是false的話,我們怎麼在沒有root的裝置去獲取資料呢?
首先我們看這樣一個場景,現在市場上有一些應用鎖類的app,他們就是給每個應用開啟的時候新增一個密碼,在開啟app的時候需要輸入密碼才能進入指定的應用,一般會把自己的銀行app,通訊類的app加密。現在市場上這些應用鎖的原理也很簡單,一般是三種方式實現:
1、最古老的方式,啟動一個Service然後隔一段時間去輪訓,獲取當前的topActivity,然後進行操作。
2、因為Android5.0以後,獲取當前的topActivity需要授權,所以這裡還需要做一個操作就是引導使用者去開一些功能。
3、通過輔助功能,可以監聽當前Window的變化,這種方式比上面的輪訓方式高效的多了。
其實1和2兩種方式差不多,唯一的區別就在於獲取topActivity的方式,其實google意識到了,獲取topActivity是很危險的一件事:
在之前的一篇文章中說到了:Android中通過應用鎖盜取賬號,惡意的軟體,可以通過這個功能,使用一個類似於QQ或者支付寶這樣的app,當使用者啟動QQ或者支付寶的時候,我們可以監聽到,然後就啟動我們自己的模擬QQ或者支付寶的登入頁面然後就可以獲取到使用者名稱和密碼了,完成盜取。
下面我們來看一個市場上比較火的一款應用鎖app:智慧應用鎖
我們下載apk,之後使用aapt檢視他的AndroidManifest.xml內容:
aapt dump xmltree applock.apk AndroidManifest.xml > D:\demo.txt
注:我們在拿到一個apk的時候,如果想知道apk中的一些資源和配置資訊,aapt命令是個不錯的選擇,同時,他能夠刪除apk中的一些資源,新增一些資源到apk中都是可以的。
這裡因為AndroidManifest.xml內容有點多,就重定向到一個txt檔案中,我們看到allowBackup屬性為true,因為非0的都是true。好吧,說明applock.apk這個應用咋們是可以使用adb backup命令進行隱私資料的備份的。下面咋們就來看一下如何進行備份:
1、第一步:使用adb backup -f applock.ab com.thinkyeah.smartlockfree 進行資料的備份
adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <檔案名稱> [需要備份的應用包名]
1> [-system|-nosystem]
這個指令是告訴adb 在備份時是否要連同系統一起備份
若沒有打的話 預設是-system 表示會一起備份系統
注意!若連繫統一起備份 在還原的時候會覆蓋系統檔案 對於已經升級後的手機是非常不好的
我不知道在沒有ROOT的情況下 adb是否有許可權去還原系統檔案 但就算如此 還是不建議這樣做
因此 -nosystem是建議一定要打上的指令
2> -all
這個指令除非只是要備份單一APP 不然是一定要打上去的
這個是問你是否要備份全部的APP 若有加上-nosystem的指令
那麼他就只會備份你目前已經安裝上去的APP 而不會連繫統APP一起備份
3> [-apk|-noapk]
預設是-noapk 這個的意思是是否連安裝的APK一起備份
若為-noapk 則只會備份APK的資料檔(像是遊戲存檔 設定 之類的)
4> [-shared|-noshared]
預設是-noshared 這個會問你是否連手機儲存空間或是SD卡的檔案一起備份
關於這個應用的包名,我們可以直接從上面dump出來的AndroidManifest.xml中獲取即可:
獲取包名之後,我們就可以執行命令,我們把匯出來的檔案儲存到當前目錄下:applock.ab,注意這裡的格式是ab,這個也是Android中備份檔案的格式要求。
當我們執行這個命令的時候,裝置端會出現一個提示頁面:
這時候會提示我們輸入備份密碼,這裡為了簡單,不輸入,直接點選備份即可。
下面,我們還需要藉助一個工具來解析這個ab檔案。
第二步:使用android-backup-extractor(abe)工具來解析ab檔案
這個工具是開源的,用Java語言寫的。原始碼位於:https://github.com/nelenkov/android-backup-extractor
這裡沒有直接下載原始碼,然後編譯了,直接在網上下載了一個編譯好的
這裡我就下載好了,可以從這裡下載:http://download.csdn.net/detail/jiangwei0910410003/9523470
用法也很簡單:
看到我們使用unpack引數來將ab檔案轉化成tar檔案:
java -jar abe.jar unpack applock.ab applock.tar
我們在用解壓縮軟體檢視內容:
我們現在如果想知道他的密碼,那麼可以直接檢視SharePreferences檔案即可,因為一般都會把密碼放到這裡儲存,不過這是一個非常危險的操作,如果你在不進行加密的話,那更是危險了。
我們檢視SmartLockConfig.xml內容:
好吧,被我們猜中了,他盡然把手勢密碼以明文的方式儲存在這裡。這裡他用的是手勢方式加密:03678,代表的應該是一個L:
到這裡我們就成功的破解了智慧應用鎖的加密app的功能,而且是在沒有root的情況下。下面來總結一下:
1、這個智慧應用鎖的app現在在市場的下載量還是蠻高的,已經有100W的下載量了,但是我們看到他的一不留神allowBackup屬性設定成true,這樣就導致了資料可能被外洩,不過這個屬性google不知道怎麼去對待他的,他的預設值盡然是true,而且更為有趣的是,在使用各大IDE工具,預設新建的工程之後,這個屬性的值也是true
上面就是現在比較常用的兩個IDE工具:Eclipse和AndroidStudio,看到當我們新建一個工程的時候,他預設都是把這個屬性設定成true的,那麼當你不設定設定個屬性的時候,也是可以進行備份的,因為預設值也是true的,所以按照google的想法,應該是為了防止資料的丟失,就留了這一個功能。便於使用者備份資料。但是這裡會隱含一些安全問題,所以我們在開發的時候,如果不去注意這個屬性的話,就會吃虧的,所以在開發的過程中一定要記得把這個屬性設定成false,特別是非常重要的需要賬號登入的app。
2、上面分析了智慧應用鎖的app,並非只是一個案例,其實現在很多app都有這個問題,我們看看豌豆莢app:
他也是沒有手動的改變這個屬性為false的,所以他的資料也是可以匯出來的。
再看看優酷視訊app:
也是一樣,不過像這些app,他們的賬號登入密碼啥的資訊肯定不是放在本地的,而是放到服務端進行驗證的,不像應用鎖這樣的,他不需要聯網也是可以進行操作的,所以密碼必須放到本地。但是隻要有這個屬性allowBackup為true的話,就會被檢視到沙盒資料,就是不安全的。最後我們再來看看微信5.0版本也有這個問題,不過他在6.0之後已經把allowBackup設定成false了:
這裡我們看到他沒有設定allowBackup屬性,但是剛剛說了,預設值就是true,所以還是可以匯出來的,下面我們可以使用上面的匯出步驟進行操作:
這裡,其實微信他把通訊錄和聊天記錄,都是儲存到db中,但是這個db是進行加密的,然後儲存到一個目錄下面的,關於這個db加密,其實是需要反編譯微信,然後動態除錯跟蹤程式碼來破解了,這個後面會寫一篇文章詳細介紹的,因為我們知道,通訊錄和聊天內容是沒有網路就可以檢視的,那麼加解密肯定是放在本地做的,只要是放在本地做的,那麼就可以進行破解。
不過這裡看到微信在後續的版本已經修復了這個問題,6.0版本之後就不能匯出來資料了,那麼5.0的使用者其實還是會受影響的。
3、還是回到這個應用鎖app中來,其實在這裡還是想吐槽一番的,作為下載量蠻高的app,盡然把密碼用明文儲存到xml中,這種做法其實是對使用者的不負責,首先這裡完全可以使用MD5來做密碼驗證就可以了,為何要暴露明文,其次是為何把這麼重要的資料儲存到xml中,稍微加點難度破解的放到so中也是可以的呀~~
4、破解場景:之前我看到好幾個同事都下載了這個app,去加密相簿app,QQ和微信啥的呀,其實現在看來並沒有什麼用,當我拿到手機的那一刻,什麼都是可以做的,而且不需要root,只需要一個命令就可以了,完全的悄無聲息,沒法察覺的就看到密碼了。
5、所以在開發的過程中,我們在最後一步發包的過程中一定要檢查一下這個屬性是否為false,因為他牽涉到你的太多隱私資訊了
補充:
1、我們可以使用adb backup命令來做一下操作,就是我們在開發過程中,如果遇到手機沒有root的,但是又想檢視沙盒資料,那麼這個也是一種方式,當然我們可以使用run-as命令來操作,不瞭解run-as的同學可以看這篇文章:Android中的run-as命令使用 但是這個也是一種方式,雖然看上去有點繁瑣。
2、與上面的adb backup命令相對應的還有一個就是adb restore命令,他是用來恢復資料的,具體用法:
adb restore applock.ab
這時候也會在客戶端出現確認頁面:
點選恢復資料即可。
那麼這裡又有一個問題了,現在如果我想改了這個應用鎖的密碼,其實很簡單:
然後在儲存成ab檔案,然後還原。密碼就被修改了。那麼比如有些應用它把一些隱私的連結url這樣的資訊儲存到xml中,那就蛋疼了,我們可以匯出來資料,然後修改url為我們自己的url,然後在還原,我擦,如果是一些上報,或者是登入的url,我們就可以在這裡做手腳,達到我們想要的目的了。
四、技術概要
1、分析了現階段應用鎖的原理以及如何使用應用鎖來進行賬號盜取
2、使用aapt命令檢視apk包中資訊
3、使用adb backup/restore進行應用資料的備份和還原
4、使用abe工具檢視備份檔案
5、我們在備份完資料之後,可以嘗試檢視一些應用的隱私資料,同時還可以篡改資訊,在還原。都是可以的。
6、在開發過程中對於沒有root的裝置,adb backup也是可以用來檢視開發應用的沙盒資料的,只是過程有點複雜。
五、總結
從這篇文章我們可以可以看到,一個屬性的不留意,會帶來多大的風險,當然這個屬性也是很蛋疼的,就是他預設值是true,所以在你不管他的情況下還是有問題的,必須手動的去設定成false才可以,所以這個也是導致現在市場上很多app都存在這樣的風險。其次這裡我們主要分析了一個智慧應用鎖的資訊,發現他犯了一個最大的錯誤就是把密碼用明文的方式儲存在xml中,破解難度為0,如果有一些你的朋友或者你的老婆,想看你的微信和QQ,同時又發現了你用了這個app去加密,那麼你就慘了,你老婆只要會adb命令,或者看到這篇文章之後,就兩步,然後看到你不想讓她看到的資料,好吧,然後就沒然後了~~,所以我們開發者在開發一個app的時候,不僅要的是使用者體驗,更重要的時候對使用者的隱私負責。我們使用者在下載和安裝一些app的時候也是需要注意的就是多留點心~~
相關文章
- 在Java中獲取Android端登陸的裝置資訊JavaAndroid
- android如何獲取listview中的任意行資料AndroidView
- 在ActionForm中如何獲取session中的資料?ORMSession
- Android獲取硬體裝置資訊Android
- Android探索之旅 | 用ADB獲取應用APK名AndroidAPK
- API介面在電商商品資料獲取中的應用API
- android 獲取裝置IP和Mac地址AndroidMac
- Android獲取應用基本資訊Android
- Android ListView中獲取選中行資料的方法AndroidView
- android listview獲取選中項AndroidView
- 在RFT中如何獲取JTable中的所有資料?
- Android12以上獲取裝置網路訊號資料Android
- Android中WebView跨域漏洞分析和應用克隆問題情景還原(免Root獲取應用沙盒資料)...AndroidWebView跨域
- 獲取Android裝置唯一標識碼Android
- Android ListView中獲取修改選中行資料的方法AndroidView
- Android APP如何獲取裝置網線插拔的狀態AndroidAPP
- Android中獲取當前位置資訊Android
- Android手機獲取Root許可權Android
- Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)AndroidPackage
- Android中獲取應用程式(包)的大小-----PackageManager的使用(二)AndroidPackage
- Android中WebView的跨域漏洞分析和應用被克隆問題情景還原(免Root獲取應用沙盒資料)AndroidWebView跨域
- 獲取Android裝置DeviceId與反Xposed HookAndroiddevHook
- Android在ListView的onTouch事件中獲取選中項的值AndroidView事件
- 如何獲取android程式LOGAndroid
- 從session中獲取資料Session
- 【譯】如何在React Hooks中獲取資料?ReactHook
- Arcgis For Android 中MapView 截圖獲取BitmapAndroidView
- modbustcp封裝使用獲取裝置資料示例TCP封裝
- Android應用鎖之獲取棧頂ActivityAndroid
- 法國計算與自由委員會:研究顯示手機應用獲取超量隱私資料
- 相容iOS 10:配置獲取隱私資料許可權宣告iOS
- Android下如何獲取Mac地址?AndroidMac
- Android中ListView控制元件onItemClick事件中獲取listView傳遞的資料AndroidView控制元件事件
- Flutter 中的資料的獲取Flutter
- android開發中如何動態獲取listview中的item的值AndroidView
- android 獲取string.xml中的valueAndroidXML
- 如何獲取iOS裝置的UDIDiOS
- 在 JDBC 中獲取插入 IDJDBC