Android應用開發allowBackup敏感資訊洩露的一點反思
轉載:http://blog.csdn.net/yanbober/article/details/46417531
其實這篇文章可能有些小題大作,但回過頭想想還是很有必要的,有點陰溝裡翻船的感覺。相信大家都知道Android API Level 8開始提供了為應用程式備份和恢復資料的功能,此功能的開關可以通過應用程式中AndroidManifest.xml檔案的allowBackup屬性值進行配置,預設是True,所以使用者可以對我們應用程式進行資料備份。相信很多人都和我一樣一直當作耳邊風過了一下Android這個特性,然後就一直沒再打理了。然而舊事重提的故事是下面這樣開始的:
前不久突然收到了一個Bug反饋,來自國內著名的白帽子組織烏雲平臺,關於這個組織就不作介紹了,相信大家一定知道問題的嚴重性,關於修復這個Bug是很快的事情,但是修復完這個Bug以後不得不讓我進入思考(就像之前處理SQL隱碼攻擊一樣),所以寫出此文記錄。
其實allowBackup的風險原理主要是允許通過adb backup對開啟USB除錯的裝置進行資料備份,一旦得到備份檔案之後那就不好說了,譬如邪惡的人可以再通過adb restore將你的資料恢復到自己的裝置上,然後就完全在自己的裝置上以你的名義去玩弄App;或者通過程式碼分析出備份檔案中你登陸App的一些賬戶密碼等核心資訊。總之,Google當初設計的核心肯定是為了方便備份資料考慮的,但是大家自己開發的應用似乎忽略了手機丟失或者被他人撿到的問題,譬如通訊錄或者名片、支付類等App如果一旦出現此類問題後果還是很嚴重的,所以有必要重視一下。
2 例項還原
為了驗證該小問題可能帶來的重大敏感資訊洩露問題,我們下面選幾個代表App進行測試,這樣就可以直觀的讓你感受到洩露的一點危機。
特別宣告: 本文例項中涉及的應用只為驗證,且本問題一般不會造成太大風險,故煩請大家保持學習心態而不要肆意汙衊應用開發者;當然我也已經通過烏雲漏洞平臺對下面涉及到的應用進行了漏洞提交,相信這些應用新的迭代版本中很快就會解決掉的。
《簡書》Android 1.9.7版本測試
結論: 會存在帳號被盜取問題。
驗證: 裝置A上登陸帳號密碼後如下:
然後在該裝置上執行如下命令將資料備份到電腦上:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-constant" style="box-sizing: border-box;">XXX</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ThinkPad</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/workspace/myself/temp</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>adb backup -f back.ab -noapk com.jianshu.haruki <span class="hljs-constant" style="box-sizing: border-box;">Now</span> unlock your device <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> confirm the backup operation.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
此時換一臺裝置B安裝此應用,但是不登陸任何帳號密碼,執行如下命令:
<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-constant" style="box-sizing: border-box;">XXX</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">@ThinkPad</span><span class="hljs-symbol" style="color: rgb(0, 102, 102); box-sizing: border-box;">:~/workspace/myself/temp</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$ </span>adb restore back.ab <span class="hljs-constant" style="box-sizing: border-box;">Now</span> unlock your device <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">and</span> confirm the restore operation.</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>
可以看見,裝置B沒有進行帳號密碼登陸,只是通過恢復A裝置的備份資料就成功登陸了A裝置的資訊。
《Sina微博》Android 5.1.0版本測試
按照上面的類似流程測試微薄發現在裝置B上面恢復裝置A的資料無效,裝置B依舊顯示如下:
也就是說Sina微博考慮的很周全,已經修復了此類潛在的洩露風險,備份資料恢復無效,依舊需要重新登陸才可以,給一個贊。
《薄荷》Android 5.4.5.1版本測試
這個應用依據上面類似操作後你會發現完全可以在裝置B上不用登陸帳號,只用恢復別人的備份帳號資訊即可進入別人帳號介面,如下:
上面為裝置B上截圖情況,直接可以在裝置B上操作裝置A的帳號。
3 反思與總結
【工匠若水 http://blog.csdn.net/yanbober 轉載煩請註明出處,尊重勞動成果】
看了上面兩部分的敘述以後你可能也會意識到這個問題潛在的嚴重性,Google的初心是好的,但是一旦被別有用心的人瞄上了這個突破點問題就嚴重了。譬如再高階一點,別有用心的人專門寫一段程式碼去執行資料備份上傳到自己的雲端伺服器,然後解析這些備份資料,小則個人資訊洩露,大則哈哈,你懂的。
既然這樣肯定你也會關心解決方案吧,具體解決比較容易,如下:
方案1:
直接在你的Android清單檔案中設定android:allowBackup=”false”即可,如下:
<code class="hljs xml has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-pi" style="color: rgb(0, 102, 102); box-sizing: border-box;"><?xml version="1.0" encoding="utf-8"?></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">manifest</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">xmlns:android</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"http://schemas.android.com/apk/res/android"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">package</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"com.test.disallowbackup"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:versionCode</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"1"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:versionName</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"1.0"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-sdk</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:minSdkVersion</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"10"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">application </span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:allowBackup</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"false"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:label</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"@string/app_name"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">activity</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"LoginActivity"</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:label</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"@string/app_name"</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">intent-filter</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">action</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.intent.action.MAIN"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">category</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.intent.category.LAUNCHER"</span>/></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">intent-filter</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">activity</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">application</span>></span> <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"></<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">manifest</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>
方案2:
不在你的Android清單檔案中設定android:allowBackup=”false”,允許執行備份,但是在你應用啟動頁進行邏輯判斷是否進行重新登陸等,譬如檢視裝置唯一識別裝置編號和備份前是否一致,不一致則直接跳轉登陸頁面的同時清空當前應用資料及快取。
好了,個人愚見,不足說服力,只是因為專案被烏雲反饋而寫的一點總結而已,目前我們採用了類似新浪微博的方案1做法。
相關文章
- 【轉】Android應用開發allowBackup敏感資訊洩露的一點反思Android
- JS敏感資訊洩露:不容忽視的WEB漏洞JSWeb
- 每日安全資訊:搜 Wi-Fi 熱點 Android 應用資料洩露Android
- 後端開發都應該瞭解的資訊洩露風險後端
- SaaS應用程式存安全隱患或洩露敏感資料
- 快訊 | 數以萬計 Django 應用程式因配置錯誤洩露密碼等敏感資訊Django密碼
- 中移鐵通禹路由 ExportSettings 敏感資訊洩露漏洞路由Export
- 1500項iOS應用存在漏洞 高度敏感資訊洩漏iOS
- 美國法警局遭遇重大安全事件,洩露執法敏感資訊事件
- 資訊洩露之web原始碼洩露Web原始碼
- 你玩的遊戲安全嗎?AMT Games百萬使用者敏感資訊被洩露遊戲GAM
- 敏感資料洩露-基於Pikachu的學習
- 資訊洩露事件頻發,下一個會是誰?事件
- 深圳一AI公司人臉資料洩露,超256萬使用者敏感資訊在“裸奔”!AI
- Appthority:研究顯示iOS應用洩露使用者資訊遠比Android嚴重APPiOSAndroid
- 遊戲巨頭動視暴雪疑似員工敏感資訊及遊戲資料洩露遊戲
- 應用敏感資訊的 6 個配置原則
- 漏洞利用之資訊洩露
- 松下承認嚴重資料洩露,涉技術檔案和客戶敏感資訊
- 構建資料防洩露體系,防範敏感資料外洩
- DNS域傳送資訊洩露DNS
- Facebook指控比基尼照片應用開發商洩露其機密檔案
- 華爾街日報:iPhone Android應用程式洩露使用者隱私iPhoneAndroid
- Android應用開發-學生資訊管理系統Android
- 搜Wi-Fi熱點 Android 應用資料洩露:涉200多萬WiFi密碼AndroidWiFi密碼
- 淺談Android開發中記憶體洩露與優化Android記憶體洩露優化
- [重磅] Cloudflare 洩露使用者敏感資訊長達數月,涉及 Uber, 1Password, Fitbit 等...Cloud
- 記一次尷尬的Java應用記憶體洩露排查Java記憶體洩露
- Android應用開發—知識點彙總Android
- Android應用開發筆記(一)Android筆記
- 資訊洩露事件頻發,拷問AI時代的資料安全事件AI
- Dasient:8% Android應用都會洩露使用者隱私資料Android
- GBASE觀察 | 資料洩露頻發 資訊系統安全應如何守護
- Camera 360應用隱私資料洩露的分析
- 火爆的音訊聊天應用Clubhouse音訊恐洩露音訊
- Spring Boot: 加密應用配置檔案敏感資訊Spring Boot加密
- Web 前端開發日誌(三):HTML 節點的記憶體洩露問題Web前端HTML記憶體洩露
- APISIX 是怎麼保護使用者的敏感資料不被洩露的?API