Android API Level 8 及其以上 Android 系統提供了爲應用程序數據的備份和恢復功能,此功能的開關決定於該應用程序中 AndroidManifest.xml
文件中的 allowBackup 屬性值,其屬性值默認是 True。當 allowBackup 標誌爲 true 時,用戶便可經過 adb backup 和 adb restore 來進行對應用數據的備份和恢復,這可能會帶來必定的安全風險。android
Android 屬性 allowBackup 安全風險源於 adb backup 允許任何一個可以打開 USB 調試開關的人從Android 手機中複製應用數據到外設,一旦應用數據被備份以後,全部應用數據均可被用戶讀取;adb restore 允許用戶指定一個恢復的數據來源(即備份的應用數據)來恢復應用程序數據的建立。所以,當一個應用數據被備份以後,用戶便可在其餘 Android 手機或模擬器上安裝同一個應用,以及經過恢復該備份的應用數據到該設備上,在該設備上打開該應用便可恢復到被備份的應用程序的狀態。安全
尤爲是通信錄應用,一旦應用程序支持備份和恢復功能,攻擊者便可經過 adb backup 和 adb restore 進行恢復新安裝的同一個應用來查看聊天記錄等信息;對於支付金融類應用,攻擊者可經過此來進行惡意支付、盜取存款等;所以爲了安全起見,開發者務必將 allowBackup 標誌值設置爲 false 來關閉應用程序的備份和恢復功能,以避免形成信息泄露和財產損失。app
Android API Level 8 以及以上系統。spa
AndroidMannifest.xml
文件 android:allowBackup
屬性AndroidMannifest.xml
文件中的 android:allowBackup
屬性值設爲 false
不在 AndroidManifest.xml
文件設置 allowBackup 屬性值,其默認值爲 true
,則應用可經過 adb 命令進行備份整個應用的數據3d
AndroidManifest.xml 文件內容:調試
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.alibaba.jaq.allowbackuppoc" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application android:label="@string/app_name"> <activity android:name="LoginActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".HomeActivity"/> </application> </manifest>
該POC應用啓動後以下左圖所示與登陸以後以下右圖所示:rest
經過adb命令備份該應用登陸以後的應用數據:code
經過做者 Nikolay Elenkov 寫的解密程序 Android Backup Extractor 解密出備份的文件 allowBackup.ab
,可得知該 POC 應用的數據(登陸用戶名和密碼)以下圖所示:xml
在另一臺 Android 手機上,安裝該 POC 應用,而後經過恢復上面備份的數據,可使得新安裝的應用達到登陸狀態:htm
恢復數據以前:
點擊「恢復個人數據」,恢復數據以後,在沒有輸入用戶名和密碼的狀況下,經過恢復數據,點擊應用圖標,直接進入登陸狀態:
在 AndroidManifest.xml
文件顯示設置 allowBackup 屬性值爲 false
,即 android:allowBackup="false"
,則 Android 應用不可經過 adb 命令進行備份和恢復整個應用的數據
AndroidManifest.xml文件內容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.alibaba.jaq.allowbackuppoc" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="10"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <application android:allowBackup="false" android:label="@string/app_name"> <activity android:name="LoginActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".HomeActivity"/> </application> </manifest>
該POC應用啓動後以下左圖所示與登陸以後以下右圖所示:
經過adb命令備份該應用登陸以後的應用數據:
經過解密出備份的文件」allowBackup.ab」,經過以下圖所示可得知該POC應用的備份的數據爲空,所以備份不成功:
在另一臺Android手機上,安裝該POC應用,而後經過恢復上面備份的數據,可使得新安裝的應用達到登陸狀態:
恢復數據以前:
恢復數據以後,從新打開應用,發現沒有直接進入登陸狀態:
出於安全考慮,阿里聚安全建議關閉應用備份功能:在 AndroidMenifest.xml 文件中,將相應組件的 「android:allowBackup」
屬性設置爲 「false」
,以下示例:
<application android:allowBackup="false" android:label="@string/app_name"> <activity android:name="LoginActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> <activity android:name=".HomeActivity"/> </application>