Android --- allowBackup 属性的含义和危险性实例讲解
一、前言
今天在開發的過程中遇到一個問題,就是關于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的時候也是需要注意的就是多留點心~~
文章出自:https://blog.csdn.net/qq_31387043/article/details/51452782
總結
以上是生活随笔為你收集整理的Android --- allowBackup 属性的含义和危险性实例讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android --- 无法预览xml布
- 下一篇: Android --- AndroidM