Android --- allowBackup 属性的含义和危险性实例讲解
一、前言
今天在開發(fā)的過程中遇到一個問題,就是關(guān)于AndroidManifest.xml中的allowBackup屬性,也算是自己之前對這個屬性的不了解,加上IDE的自動生成代碼,沒太注意這個屬性,但是沒想到這個屬性會直接導(dǎo)致隱私數(shù)據(jù)的丟失。下面就來看一下這個屬性的影響到底有多大。他的作用是什么?
二、Android中的allowBackup屬性
1、allowBackup安全風(fēng)險描述
Android API Level 8及其以上Android系統(tǒng)提供了為應(yīng)用程序數(shù)據(jù)的備份和恢復(fù)功能,此功能的開關(guān)決定于該應(yīng)用程序中AndroidManifest.xml文件中的allowBackup屬性值[1] ,其屬性值默認(rèn)是true。當(dāng)allowBackup標(biāo)志為true時,用戶即可通過adb?backup和adb restore來進(jìn)行對應(yīng)用數(shù)據(jù)的備份和恢復(fù),這可能會帶來一定的安全風(fēng)險。
Android屬性allowBackup安全風(fēng)險源于adb backup容許任何一個能夠打開USB 調(diào)試開關(guān)的人從Android手機(jī)中復(fù)制應(yīng)用數(shù)據(jù)到外設(shè),一旦應(yīng)用數(shù)據(jù)被備份之后,所有應(yīng)用數(shù)據(jù)都可被用戶讀取;adb restore容許用戶指定一個恢復(fù)的數(shù)據(jù)來源(即備份的應(yīng)用數(shù)據(jù))來恢復(fù)應(yīng)用程序數(shù)據(jù)的創(chuàng)建。因此,當(dāng)一個應(yīng)用數(shù)據(jù)被備份之后,用戶即可在其他Android手機(jī)或模擬器上安裝同一個應(yīng)用,以及通過恢復(fù)該備份的應(yīng)用數(shù)據(jù)到該設(shè)備上,在該設(shè)備上打開該應(yīng)用即可恢復(fù)到被備份的應(yīng)用程序的狀態(tài)。
尤其是通訊錄應(yīng)用,一旦應(yīng)用程序支持備份和恢復(fù)功能,攻擊者即可通過adb backup和adb restore進(jìn)行恢復(fù)新安裝的同一個應(yīng)用來查看聊天記錄等信息;對于支付金融類應(yīng)用,攻擊者可通過此來進(jìn)行惡意支付、盜取存款等;因此為了安全起見,開發(fā)者務(wù)必將allowBackup標(biāo)志值設(shè)置為false來關(guān)閉應(yīng)用程序的備份和恢復(fù)功能,以免造成信息泄露和財產(chǎn)損失。
2、allowBackup安全影響范圍
Android API Level 8以及以上系統(tǒng)
3、allowBackup安全風(fēng)險詳情
1) allowBackup風(fēng)險位置:
AndroidMannifest.xml文件android:allowBackup屬性
2) allowBackup風(fēng)險觸發(fā)前提條件:
未將AndroidMannifest.xml文件中的android:allowBackup屬性值設(shè)為false
3) allowBackup風(fēng)險原理:
當(dāng)allowBackup標(biāo)志值為true時,即可通過adb backup和adb restore來備份和恢復(fù)應(yīng)用程序數(shù)據(jù)
三、如何在非root設(shè)備上獲取隱私數(shù)據(jù)
好了,上面我們就了解了,原來allowBackup屬性的風(fēng)險很大。下面我們看看現(xiàn)在如果這個屬性是false的話,我們怎么在沒有root的設(shè)備去獲取數(shù)據(jù)呢?
首先我們看這樣一個場景,現(xiàn)在市場上有一些應(yīng)用鎖類的app,他們就是給每個應(yīng)用打開的時候添加一個密碼,在打開app的時候需要輸入密碼才能進(jìn)入指定的應(yīng)用,一般會把自己的銀行app,通訊類的app加密?,F(xiàn)在市場上這些應(yīng)用鎖的原理也很簡單,一般是三種方式實(shí)現(xiàn):
1、最古老的方式,啟動一個Service然后隔一段時間去輪訓(xùn),獲取當(dāng)前的topActivity,然后進(jìn)行操作。
2、因?yàn)锳ndroid5.0以后,獲取當(dāng)前的topActivity需要授權(quán),所以這里還需要做一個操作就是引導(dǎo)用戶去開一些功能。
3、通過輔助功能,可以監(jiān)聽當(dāng)前Window的變化,這種方式比上面的輪訓(xùn)方式高效的多了。
其實(shí)1和2兩種方式差不多,唯一的區(qū)別就在于獲取topActivity的方式,其實(shí)google意識到了,獲取topActivity是很危險的一件事:
在之前的一篇文章中說到了:Android中通過應(yīng)用鎖盜取賬號,惡意的軟件,可以通過這個功能,使用一個類似于QQ或者支付寶這樣的app,當(dāng)用戶啟動QQ或者支付寶的時候,我們可以監(jiān)聽到,然后就啟動我們自己的模擬QQ或者支付寶的登錄頁面然后就可以獲取到用戶名和密碼了,完成盜取。
下面我們來看一個市場上比較火的一款應(yīng)用鎖app:智能應(yīng)用鎖
我們下載apk,之后使用aapt查看他的AndroidManifest.xml內(nèi)容:
aapt dump xmltree applock.apk AndroidManifest.xml > D:\demo.txt
注:我們在拿到一個apk的時候,如果想知道apk中的一些資源和配置信息,aapt命令是個不錯的選擇,同時,他能夠刪除apk中的一些資源,添加一些資源到apk中都是可以的。
這里因?yàn)锳ndroidManifest.xml內(nèi)容有點(diǎn)多,就重定向到一個txt文件中,我們看到allowBackup屬性為true,因?yàn)榉?的都是true。好吧,說明applock.apk這個應(yīng)用咋們是可以使用adb backup命令進(jìn)行隱私數(shù)據(jù)的備份的。下面咋們就來看一下如何進(jìn)行備份:
1、第一步:使用adb backup -f applock.ab?com.thinkyeah.smartlockfree 進(jìn)行數(shù)據(jù)的備份
adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <檔案名稱> [需要備份的應(yīng)用包名]
1> [-system|-nosystem]
這個指令是告訴adb 在備份時是否要連同系統(tǒng)一起備份
若沒有打的話 默認(rèn)是-system 表示會一起備份系統(tǒng)
注意!若連系統(tǒng)一起備份 在還原的時候會復(fù)蓋系統(tǒng)檔案 對于已經(jīng)升級后的手機(jī)是非常不好的
我不知道在沒有ROOT的情況下 adb是否有權(quán)限去還原系統(tǒng)檔案 但就算如此 還是不建議這樣做
因此 -nosystem是建議一定要打上的指令
2> -all
這個指令除非只是要備份單一APP 不然是一定要打上去的
這個是問你是否要備份全部的APP 若有加上-nosystem的指令
那么他就只會備份你目前已經(jīng)安裝上去的APP 而不會連系統(tǒng)APP一起備份
3> [-apk|-noapk]
默認(rèn)是-noapk 這個的意思是是否連安裝的APK一起備份
若為-noapk 則只會備份APK的資料檔(像是游戲存盤 設(shè)定 之類的)
4> [-shared|-noshared]
默認(rèn)是-noshared 這個會問你是否連手機(jī)儲存空間或是SD卡的檔案一起備份
關(guān)于這個應(yīng)用的包名,我們可以直接從上面dump出來的AndroidManifest.xml中獲取即可:
獲取包名之后,我們就可以執(zhí)行命令,我們把導(dǎo)出來的文件保存到當(dāng)前目錄下:applock.ab,注意這里的格式是ab,這個也是Android中備份文件的格式要求。
當(dāng)我們執(zhí)行這個命令的時候,設(shè)備端會出現(xiàn)一個提示頁面:
這時候會提示我們輸入備份密碼,這里為了簡單,不輸入,直接點(diǎn)擊備份即可。
下面,我們還需要借助一個工具來解析這個ab文件。
第二步:使用android-backup-extractor(abe)工具來解析ab文件
這個工具是開源的,用Java語言寫的。源碼位于:https://github.com/nelenkov/android-backup-extractor
這里沒有直接下載源碼,然后編譯了,直接在網(wǎng)上下載了一個編譯好的
這里我就下載好了,可以從這里下載:http://download.csdn.net/detail/jiangwei0910410003/9523470
用法也很簡單:
看到我們使用unpack參數(shù)來將ab文件轉(zhuǎn)化成tar文件:
java -jar abe.jar unpack applock.ab applock.tar
我們在用解壓縮軟件查看內(nèi)容:
我們現(xiàn)在如果想知道他的密碼,那么可以直接查看SharePreferences文件即可,因?yàn)橐话愣紩衙艽a放到這里保存,不過這是一個非常危險的操作,如果你在不進(jìn)行加密的話,那更是危險了。
我們查看SmartLockConfig.xml內(nèi)容:
好吧,被我們猜中了,他盡然把手勢密碼以明文的方式保存在這里。這里他用的是手勢方式加密:03678,代表的應(yīng)該是一個L:
到這里我們就成功的破解了智能應(yīng)用鎖的加密app的功能,而且是在沒有root的情況下。下面來總結(jié)一下:
1、這個智能應(yīng)用鎖的app現(xiàn)在在市場的下載量還是蠻高的,已經(jīng)有100W的下載量了,但是我們看到他的一不留神allowBackup屬性設(shè)置成true,這樣就導(dǎo)致了數(shù)據(jù)可能被外泄,不過這個屬性google不知道怎么去對待他的,他的默認(rèn)值盡然是true,而且更為有趣的是,在使用各大IDE工具,默認(rèn)新建的工程之后,這個屬性的值也是true
? ? ?
上面就是現(xiàn)在比較常用的兩個IDE工具:Eclipse和AndroidStudio,看到當(dāng)我們新建一個工程的時候,他默認(rèn)都是把這個屬性設(shè)置成true的,那么當(dāng)你不設(shè)置設(shè)置個屬性的時候,也是可以進(jìn)行備份的,因?yàn)槟J(rèn)值也是true的,所以按照google的想法,應(yīng)該是為了防止數(shù)據(jù)的丟失,就留了這一個功能。便于用戶備份數(shù)據(jù)。但是這里會隱含一些安全問題,所以我們在開發(fā)的時候,如果不去注意這個屬性的話,就會吃虧的,所以在開發(fā)的過程中一定要記得把這個屬性設(shè)置成false,特別是非常重要的需要賬號登錄的app。
2、上面分析了智能應(yīng)用鎖的app,并非只是一個案例,其實(shí)現(xiàn)在很多app都有這個問題,我們看看豌豆莢app:
他也是沒有手動的改變這個屬性為false的,所以他的數(shù)據(jù)也是可以導(dǎo)出來的。
再看看優(yōu)酷視頻app:
也是一樣,不過像這些app,他們的賬號登錄密碼啥的信息肯定不是放在本地的,而是放到服務(wù)端進(jìn)行驗(yàn)證的,不像應(yīng)用鎖這樣的,他不需要聯(lián)網(wǎng)也是可以進(jìn)行操作的,所以密碼必須放到本地。但是只要有這個屬性allowBackup為true的話,就會被查看到沙盒數(shù)據(jù),就是不安全的。最后我們再來看看微信5.0版本也有這個問題,不過他在6.0之后已經(jīng)把a(bǔ)llowBackup設(shè)置成false了:
這里我們看到他沒有設(shè)置allowBackup屬性,但是剛剛說了,默認(rèn)值就是true,所以還是可以導(dǎo)出來的,下面我們可以使用上面的導(dǎo)出步驟進(jìn)行操作:
這里,其實(shí)微信他把通訊錄和聊天記錄,都是保存到db中,但是這個db是進(jìn)行加密的,然后保存到一個目錄下面的,關(guān)于這個db加密,其實(shí)是需要反編譯微信,然后動態(tài)調(diào)試跟蹤代碼來破解了,這個后面會寫一篇文章詳細(xì)介紹的,因?yàn)槲覀冎?#xff0c;通訊錄和聊天內(nèi)容是沒有網(wǎng)絡(luò)就可以查看的,那么加解密肯定是放在本地做的,只要是放在本地做的,那么就可以進(jìn)行破解。
不過這里看到微信在后續(xù)的版本已經(jīng)修復(fù)了這個問題,6.0版本之后就不能導(dǎo)出來數(shù)據(jù)了,那么5.0的用戶其實(shí)還是會受影響的。
3、還是回到這個應(yīng)用鎖app中來,其實(shí)在這里還是想吐槽一番的,作為下載量蠻高的app,盡然把密碼用明文保存到xml中,這種做法其實(shí)是對用戶的不負(fù)責(zé),首先這里完全可以使用MD5來做密碼驗(yàn)證就可以了,為何要暴露明文,其次是為何把這么重要的數(shù)據(jù)保存到xml中,稍微加點(diǎn)難度破解的放到so中也是可以的呀~~
4、破解場景:之前我看到好幾個同事都下載了這個app,去加密相冊app,QQ和微信啥的呀,其實(shí)現(xiàn)在看來并沒有什么用,當(dāng)我拿到手機(jī)的那一刻,什么都是可以做的,而且不需要root,只需要一個命令就可以了,完全的悄無聲息,沒法察覺的就看到密碼了。
5、所以在開發(fā)的過程中,我們在最后一步發(fā)包的過程中一定要檢查一下這個屬性是否為false,因?yàn)樗麪可娴侥愕奶嚯[私信息了
補(bǔ)充:
1、我們可以使用adb backup命令來做一下操作,就是我們在開發(fā)過程中,如果遇到手機(jī)沒有root的,但是又想查看沙盒數(shù)據(jù),那么這個也是一種方式,當(dāng)然我們可以使用run-as命令來操作,不了解run-as的同學(xué)可以看這篇文章:Android中的run-as命令使用?但是這個也是一種方式,雖然看上去有點(diǎn)繁瑣。
2、與上面的adb backup命令相對應(yīng)的還有一個就是adb restore命令,他是用來恢復(fù)數(shù)據(jù)的,具體用法:
adb restore applock.ab
這時候也會在客戶端出現(xiàn)確認(rèn)頁面:
點(diǎn)擊恢復(fù)數(shù)據(jù)即可。
那么這里又有一個問題了,現(xiàn)在如果我想改了這個應(yīng)用鎖的密碼,其實(shí)很簡單:
然后在保存成ab文件,然后還原。密碼就被修改了。那么比如有些應(yīng)用它把一些隱私的鏈接url這樣的信息保存到xml中,那就蛋疼了,我們可以導(dǎo)出來數(shù)據(jù),然后修改url為我們自己的url,然后在還原,我擦,如果是一些上報,或者是登錄的url,我們就可以在這里做手腳,達(dá)到我們想要的目的了。
四、技術(shù)概要
1、分析了現(xiàn)階段應(yīng)用鎖的原理以及如何使用應(yīng)用鎖來進(jìn)行賬號盜取
2、使用aapt命令查看apk包中信息
3、使用adb backup/restore進(jìn)行應(yīng)用數(shù)據(jù)的備份和還原
4、使用abe工具查看備份文件
5、我們在備份完數(shù)據(jù)之后,可以嘗試查看一些應(yīng)用的隱私數(shù)據(jù),同時還可以篡改信息,在還原。都是可以的。
6、在開發(fā)過程中對于沒有root的設(shè)備,adb backup也是可以用來查看開發(fā)應(yīng)用的沙盒數(shù)據(jù)的,只是過程有點(diǎn)復(fù)雜。
五、總結(jié)
從這篇文章我們可以可以看到,一個屬性的不留意,會帶來多大的風(fēng)險,當(dāng)然這個屬性也是很蛋疼的,就是他默認(rèn)值是true,所以在你不管他的情況下還是有問題的,必須手動的去設(shè)置成false才可以,所以這個也是導(dǎo)致現(xiàn)在市場上很多app都存在這樣的風(fēng)險。其次這里我們主要分析了一個智能應(yīng)用鎖的信息,發(fā)現(xiàn)他犯了一個最大的錯誤就是把密碼用明文的方式保存在xml中,破解難度為0,如果有一些你的朋友或者你的老婆,想看你的微信和QQ,同時又發(fā)現(xiàn)了你用了這個app去加密,那么你就慘了,你老婆只要會adb命令,或者看到這篇文章之后,就兩步,然后看到你不想讓她看到的數(shù)據(jù),好吧,然后就沒然后了~~,所以我們開發(fā)者在開發(fā)一個app的時候,不僅要的是用戶體驗(yàn),更重要的時候?qū)τ脩舻碾[私負(fù)責(zé)。我們用戶在下載和安裝一些app的時候也是需要注意的就是多留點(diǎn)心~~
文章出自:https://blog.csdn.net/qq_31387043/article/details/51452782
總結(jié)
以上是生活随笔為你收集整理的Android --- allowBackup 属性的含义和危险性实例讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android --- 无法预览xml布
- 下一篇: Android --- AndroidM