前言
前段時間公司對應用在愛加密上進行了安全掃描,本文將基于愛加密的漏洞分析報告,針對部分內容,介紹理論修復實踐
最小化特權準則概念介紹
最小化特權準則,即指組件只能供自身應用調用,盡可能禁止其他應用訪問及調用。
違反最小化特權的危害
若組件違反最小化特權準則,則會帶來如下危害:
-
攻擊者惡意調用應用的 Activity, 修改程序的狀態或關鍵數據。舉個例子,如果您的應用的應用需要人臉認證才可以登錄,一般需要保存一個人臉認證狀態,如果攻擊者修改了人臉狀態,改為已認證通過,則可以直接進入應用主頁。
-
通過調用 Activity 內部的方法,可獲取私密數據,甚至造成拒絕服務和應用崩潰。例如,如果您的登錄 Activity 違反了最小化特權準則,攻擊裝者可通過反射,來調用您的
Activity
有一個私有方法,用來獲取賬號和密碼。
解決方案
- 設置 Activity 組件
android:exported = false
- 必須 exported 的 Activity 組件必須僅限于授權用戶或者特定組件調用
- 謹慎使用 intent-filter 屬性,若必須使用,則需強制設置
android:exported = false
這里涉及幾個概念,簡要介紹一下:
1. android:exported
適用于 Android 四大組件,其作用是控制其他應用程序是否可以與當前組件交互。其中 true 為可以與之交互。若設置為 false ,意味著對于 Service
組件,只有相同應用程序的組件或相同用戶 ID 的程序才能啟動或綁定該服務。值得注意的是,如果該組件在 AndroidManifest
中聲明了 intent-filter
, 該組件的 exported 屬性將自動設置為 true。若沒有聲明,則默認為 false.
2. 用戶 ID (UID)
對于 Android 應用,每個應用程序都有一個 UID, 默認情況下,Android 系統會為每一個分配一個互不相同
的 UID. 如果兩個應用的 UID 不同,則不能相互調用。若希望相互調用,可進行如下操作:
- 設置
android:sharedUserId
屬性,該屬性的作用是將一個或多個應用程序共享同一個 UID。具體代碼如下所示: - 兩個應用需使用相同的簽名文件進行簽名
// 應用一<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="test.anna.hello"android:sharedUserId="anna.uid">
// 應用二<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="test.anna.hello2"android:sharedUserId="anna.uid">
?
3. 自定義安全權限
該標簽用于在 AndroidManifest 中聲明一個安全權限,可用于此應用程序的特定組件或功能的訪問。例如一個發送廣播的業務,APK1 用于接收廣播,APK2 用于發送廣播,APK1 此時僅想接收聲明了對應權限的應用發送的廣播。此時需要在 APK1 通過 定義安全權限, 在 APK2 通過 申請 APK1 定義的安全權限即可。 定義格式如下:
<permissionandroid:description="string resource"android:icon="drawable resource"android:label="string resource"android:name="string"android:permissionGroup="string"android:protectionLevel=["normal" | "dangerous" |"signature" | "signatureOrSystem"] />?
?
- android:description 用于描述該權限所針對的操作及用戶授予這個權限的后果
- android:label 用于描述該權限
- android:name 用于唯一標識權限
- android:permissionGroup 用于標識該權限所屬權限組的名稱
- android:protectionLevel 用于標識該權限的等級,可控制權限的授予方式,
normal
表示聲明后自動獲取,signature
表示定義權限的 APK 和聲明權限的 APK 必須使用同一簽名文件,才可獲取權限。
Activity 最小化特權漏洞修復
案例詳解 1
在本例中,IncomingDialog
為會議振鈴和外呼界面。由于 IncomingDialog
設置了 標簽 導致了android:exported = true
, 因此,強制設置 exported 為 false 即可 修改前:
?
<activityandroid:name="cn.redcdn.incoming.IncomingDialog"android:process=":JMeetingService"android:screenOrientation="portrait"android:configChanges="orientation|screenSize|keyboardHidden"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><intent-filter><action android:name="cn.redcdn.jmeetingsdk.start.incomingactivity" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
修改后:
<activityandroid:name="cn.redcdn.incoming.IncomingDialog"android:process=":JMeetingService"android:screenOrientation="portrait"android:exported="false"android:configChanges="orientation|screenSize|keyboardHidden"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><intent-filter><action android:name="cn.redcdn.jmeetingsdk.start.incomingactivity" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>
這里簡要介紹一下 android:enabled
屬性,該屬性適用于四大組件,控制該組件是否可以被系統初始化,默認為 true, 如果設置為 false, 對應控件無法初始化,例如無法啟動服務。值得注意的是, 標簽中也會可以聲明該屬性,而且該 enabled 與 組件聲明都為 true 的情況下組件才可被初始化。修改點同樣是將 exported 改為 false
數據越權備份風險
概念
應用數據備份
Android 2.1 系統可為 APP 提供數據的備份與恢復功能,可在 AndroidManifest
標簽下聲明 android:allowBackup
, 屬性決定是否禁用該功能,其中 false 標識禁用。值得注意的是該屬性默認為 true
違反數據越權備份的危害
攻擊者可利用此漏洞攻擊任何可以打開 USB 調試的應用非 root 設備。
- 通過
adb backup
命令,將制定應用的數據拷貝到外設。一旦該應用數據被備份后,所有的用戶在這個應用的SharedPreferences
和DB
都可被攻擊者讀取。 - 通過
adb restore
命令,可指定某個備份數據,恢復應用的數據
雖然可以對備份后的文件(.ab)進行加密,但是仍有許多工具工具可對其解密,例如: android-backup-extractor, 下面將簡單介紹一下 adb backup 的用法
adb backup
adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <檔案名稱> [需要備份的應用包名]
例如想備份包名為emergency.cicdi.com
的數據,可以輸入如下代碼:
adb backup -nosystem -noapk -f emergency.ab emergency.cicdi.com
該命令會在當前目錄下生成名為 emergency.ab 的備份文件。通過 android-backup-extractor ,可得到對應應用的SharedPreferences
和 DB
文件
解決方案
將 app module 下的 AndroidManifest.xml
中設置 android:allowBackup="false"
即可,但是這么處理是不夠的,會遇到一個問題,由于我們的項目集成了多個依賴,比如掃碼二維碼的庫,和 IM Library, 依賴中 AndroidManifest 都默認設置 android:allowBackup="true"
,會導致編譯時不同 module 合并 AndroidManifest 文件會產生沖突。需要解決沖突,即統一該屬性的取值。但是有些 library 是遠程依賴,本地項目并不可以編輯代碼,而且一個一個修改未免效率較低,因此需要在 app module 下的 AndroidManifest.xml
中聲明
<application...tools:replace=" android:icon,theme,allowBackup" >...
allowBackup
取值,以 app 中的 Manifest 為準進行合并。
最后
如果你看到了這里,覺得文章寫得不錯就給個贊唄?如果你覺得那里值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。
最后針對Android程序員,除了上面的知識體系,我這邊給大家整理了一些資料,其中分享內容包括不限于高級UI、性能優化、移動架構師、NDK、混合式開發(ReactNative+Weex)微信小程序、Flutter等全方面的Android進階實踐技術;希望能幫助到大家,也節省大家在網上搜索資料的時間來學習,也可以分享動態給身邊好友一起學習!關注我的主頁個人說明有驚喜哦~
---------------------
作者:whale_kyle
來源:CSDN
原文:https://blog.csdn.net/whale_kyle/article/details/92428743
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件
?