【工匠若水http://blog.csdn.net/yanbober轉(zhuǎn)載煩請(qǐng)注明出處衍锚,尊重勞動(dòng)成果】
1 背景
? ? ? ?其實(shí)這篇文章可能有些小題大作担平,但回過頭想想還是很有必要的,有點(diǎn)陰溝里翻船的感覺。相信大家都知道Android API Level 8開始提供了為應(yīng)用程序備份和恢復(fù)數(shù)據(jù)的功能,此功能的開關(guān)可以通過應(yīng)用程序中AndroidManifest.xml文件的allowBackup屬性值進(jìn)行配置,默認(rèn)是True沦零,所以用戶可以對(duì)我們應(yīng)用程序進(jìn)行數(shù)據(jù)備份。相信很多人都和我一樣一直當(dāng)作耳邊風(fēng)過了一下Android這個(gè)特性货岭,然后就一直沒再打理了路操。然而舊事重提的故事是下面這樣開始的:
前不久突然收到了一個(gè)Bug反饋,來自國(guó)內(nèi)著名的白帽子組織烏云平臺(tái)千贯,關(guān)于這個(gè)組織就不作介紹了屯仗,相信大家一定知道問題的嚴(yán)重性,關(guān)于修復(fù)這個(gè)Bug是很快的事情搔谴,但是修復(fù)完這個(gè)Bug以后不得不讓我進(jìn)入思考(就像之前處理SQL注入一樣)魁袜,所以寫出此文記錄。
? ? ? ?其實(shí)allowBackup的風(fēng)險(xiǎn)原理主要是允許通過adb backup對(duì)打開USB調(diào)試的設(shè)備進(jìn)行數(shù)據(jù)備份,一旦得到備份文件之后那就不好說了峰弹,譬如邪惡的人可以再通過adb restore將你的數(shù)據(jù)恢復(fù)到自己的設(shè)備上店量,然后就完全在自己的設(shè)備上以你的名義去玩弄App;或者通過代碼分析出備份文件中你登陸App的一些賬戶密碼等核心信息鞠呈∪谑Γ總之,Google當(dāng)初設(shè)計(jì)的核心肯定是為了方便備份數(shù)據(jù)考慮的蚁吝,但是大家自己開發(fā)的應(yīng)用似乎忽略了手機(jī)丟失或者被他人撿到的問題旱爆,譬如通訊錄或者名片、支付類等App如果一旦出現(xiàn)此類問題后果還是很嚴(yán)重的窘茁,所以有必要重視一下怀伦。
? ? ? ?為了驗(yàn)證該小問題可能帶來的重大敏感信息泄露問題,我們下面選幾個(gè)代表App進(jìn)行測(cè)試庙曙,這樣就可以直觀的讓你感受到泄露的一點(diǎn)危機(jī)。
特別聲明:本文實(shí)例中涉及的應(yīng)用只為驗(yàn)證浩淘,且本問題一般不會(huì)造成太大風(fēng)險(xiǎn)捌朴,故煩請(qǐng)大家保持學(xué)習(xí)心態(tài)而不要肆意污蔑應(yīng)用開發(fā)者;當(dāng)然我也已經(jīng)通過烏云漏洞平臺(tái)對(duì)下面涉及到的應(yīng)用進(jìn)行了漏洞提交张抄,相信這些應(yīng)用新的迭代版本中很快就會(huì)解決掉的砂蔽。
《簡(jiǎn)書》Android 1.9.7版本測(cè)試
結(jié)論:會(huì)存在帳號(hào)被盜取問題。
驗(yàn)證:設(shè)備A上登陸帳號(hào)密碼后如下:
然后在該設(shè)備上執(zhí)行如下命令將數(shù)據(jù)備份到電腦上:
XXX@ThinkPad:~/workspace/myself/temp$ adb backup -f back.ab -noapk com.jianshu.harukiNowunlock your deviceandconfirm the backup operation.
此時(shí)換一臺(tái)設(shè)備B安裝此應(yīng)用署惯,但是不登陸任何帳號(hào)密碼左驾,執(zhí)行如下命令:
XXX@ThinkPad:~/workspace/myself/temp$ adb restore back.abNowunlock your deviceandconfirm the restore operation.
可以看見,設(shè)備B沒有進(jìn)行帳號(hào)密碼登陸极谊,只是通過恢復(fù)A設(shè)備的備份數(shù)據(jù)就成功登陸了A設(shè)備的信息诡右。
按照上面的類似流程測(cè)試微薄發(fā)現(xiàn)在設(shè)備B上面恢復(fù)設(shè)備A的數(shù)據(jù)無效,設(shè)備B依舊顯示如下:
也就是說Sina微博考慮的很周全轻猖,已經(jīng)修復(fù)了此類潛在的泄露風(fēng)險(xiǎn)帆吻,備份數(shù)據(jù)恢復(fù)無效,依舊需要重新登陸才可以咙边,給一個(gè)贊猜煮。
這個(gè)應(yīng)用依據(jù)上面類似操作后你會(huì)發(fā)現(xiàn)完全可以在設(shè)備B上不用登陸帳號(hào),只用恢復(fù)別人的備份帳號(hào)信息即可進(jìn)入別人帳號(hào)界面败许,如下:
上面為設(shè)備B上截圖情況王带,直接可以在設(shè)備B上操作設(shè)備A的帳號(hào)。
看了上面兩部分的敘述以后你可能也會(huì)意識(shí)到這個(gè)問題潛在的嚴(yán)重性市殷,Google的初心是好的愕撰,但是一旦被別有用心的人瞄上了這個(gè)突破點(diǎn)問題就嚴(yán)重了。譬如再高端一點(diǎn),別有用心的人專門寫一段代碼去執(zhí)行數(shù)據(jù)備份上傳到自己的云端服務(wù)器盟戏,然后解析這些備份數(shù)據(jù)绪妹,小則個(gè)人信息泄露,大則哈哈柿究,你懂的邮旷。
既然這樣肯定你也會(huì)關(guān)心解決方案吧,具體解決比較容易蝇摸,如下:
直接在你的Android清單文件中設(shè)置android:allowBackup=”false”即可婶肩,如下:
? ? android:name=".application.wjgApplication"
? ? android:allowBackup="false"
? ? android:icon="@mipmap/ic_logo"
? ? android:label="@string/app_name"
? ? android:theme="@style/AppTheme">
不在你的Android清單文件中設(shè)置android:allowBackup=”false”,允許執(zhí)行備份貌夕,但是在你應(yīng)用啟動(dòng)頁進(jìn)行邏輯判斷是否進(jìn)行重新登陸等律歼,譬如查看設(shè)備唯一識(shí)別設(shè)備編號(hào)和備份前是否一致,不一致則直接跳轉(zhuǎn)登陸頁面的同時(shí)清空當(dāng)前應(yīng)用數(shù)據(jù)及緩存啡专。
好了险毁,個(gè)人愚見,不足說服力们童,只是因?yàn)轫?xiàng)目被烏云反饋而寫的一點(diǎn)總結(jié)而已畔况,目前我們采用了類似新浪微博的方案1做法。
【工匠若水http://blog.csdn.net/yanbober轉(zhuǎn)載煩請(qǐng)注明出處慧库,尊重勞動(dòng)成果】