[轉]Android 常見安全漏洞修復理論與實踐

前言

前段時間公司對應用在愛加密上進行了安全掃描,本文將基于愛加密的漏洞分析報告,針對部分內容,介紹理論修復實踐

最小化特權準則概念介紹

最小化特權準則,即指組件只能供自身應用調用,盡可能禁止其他應用訪問及調用。

違反最小化特權的危害

若組件違反最小化特權準則,則會帶來如下危害:

  1. 攻擊者惡意調用應用的 Activity, 修改程序的狀態或關鍵數據。舉個例子,如果您的應用的應用需要人臉認證才可以登錄,一般需要保存一個人臉認證狀態,如果攻擊者修改了人臉狀態,改為已認證通過,則可以直接進入應用主頁。

  2. 通過調用 Activity 內部的方法,可獲取私密數據,甚至造成拒絕服務和應用崩潰。例如,如果您的登錄 Activity 違反了最小化特權準則,攻擊裝者可通過反射,來調用您的 Activity 有一個私有方法,用來獲取賬號和密碼。

解決方案

  1. 設置 Activity 組件 android:exported = false
  2. 必須 exported 的 Activity 組件必須僅限于授權用戶或者特定組件調用
  3. 謹慎使用 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 不同,則不能相互調用。若希望相互調用,可進行如下操作:

  1. 設置 android:sharedUserId 屬性,該屬性的作用是將一個或多個應用程序共享同一個 UID。具體代碼如下所示:
  2. 兩個應用需使用相同的簽名文件進行簽名
// 應用一<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 設備。

  1. 通過 adb backup 命令,將制定應用的數據拷貝到外設。一旦該應用數據被備份后,所有的用戶在這個應用的SharedPreferencesDB都可被攻擊者讀取。
  2. 通過 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 ,可得到對應應用的SharedPreferencesDB文件

解決方案

將 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" >...
這行代碼標識 Manifest 合并規則,意味著當合并 library 中的 Manifest 文件到主 App Manifest時,不考慮 library Manifest 中的 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博客文章一鍵轉載插件

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285158.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285158.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285158.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題158之從鍵盤輸入一些字符,逐個把它們送到磁盤上去,直到輸入一個#為止。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:從鍵盤輸入一些字符,逐個把…

html5--3.2 input元素(1)

html5--3.2 input元素(1) 學習要點 input元素及其屬性input元素 用來設置表單中的內容項&#xff0c;比如輸入內容的文本框&#xff0c;按鈕等不僅可以布置在表單中&#xff0c;也可以在表單之外的元素使用input元素的屬性 type屬性&#xff1a;指定輸入內容的類型&#xff0c;…

css3 3D

● css3 3D旋轉 ○ rotateX() 方法&#xff0c;元素圍繞其 X 軸以給定的度數進行旋轉 ○ rotateY() 方法&#xff0c;元素圍繞其 Y 軸以給定的度數進行旋轉 ○ rotateZ(angle)&#xff0c;定義沿 Z 軸的 3D 旋轉。 ● 3D景深 ○ perspective(n)&#xff0c;景深&#xff0c;離屏…

我是怎么自學 Git / GitHub 的?

大家好我是魚皮&#xff0c;Git 和 GitHub 是如今團隊協作開發必不可少的技能&#xff0c;且不說程序員&#xff0c;就連很多產品也在學習它們。今天分享一下我自學 Git 和 GitHub 的經驗&#xff0c;希望起到一個 導學 的作用&#xff0c;幫助大家抓住重點&#xff0c;節省時間…

[轉]Android 代碼混淆和加固 so庫 簡單教你一行代碼實現

混淆 因為開啟混淆會使編譯時間變長&#xff0c;所以debug模式下不開啟。我們需要做的是&#xff1a; 1.將release下minifyEnabled的值改為true&#xff0c;打開混淆&#xff1b; 2.buildConfigField 不顯示log日志 為什么要混淆&#xff1a; 優化java的字節碼減小apk文件的大…

【ArcGIS微課1000例】0004:值提取至點(Extract value to point)

文章目錄 問題描述值提取至點工具介紹案例實現過程注意事項問題描述 研究區分布有成千上萬個離散的矢量點(根據范圍創建隨機點),但是點上沒有高程值,研究區DEM是有的,那么怎樣在ArcGIS中提取每個點對應的高程值? 離散點分布情況: DEM數據(ArcGlobe中三維顯示):

C語言試題159之計算字符串中子串出現的次數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:兩個字符串連接程序 2 、溫馨…

關于Android studio找不到sqlite數據庫的解決方法

打開Android Device Monitor,剩下的與Eclipse相同。轉載于:https://blog.51cto.com/10237758/1761397

linux ubuntu deepin apache2 rewrite

2019獨角獸企業重金招聘Python工程師標準>>> apache php 環境裝好了&#xff0c;下載了TP5的項目&#xff0c;然后部署上去之后&#xff0c;端口81&#xff0c;&#xff0c;但是 訪問 127.0.0.1:81 正常 127.0.0.1:81/admin&#xff0c;報錯 404 Not Found 原因是,…

論DATASNAP遠程方法支持自定義對象作參數

論DATASNAP遠程方法支持自定義對象作參數 DATASNAP遠程方法已經可以支持自定義對象作參數&#xff0c;這是非常方便的功能。 1&#xff09;自定義對象 type TMyInfo class(TObject) public AccountNo: string; SQL: string; Params: string; end; 2&#xff09;遠程方法定義 f…

[轉]Android-Proguard(代碼混淆)

一&#xff1a;混淆是什么&#xff0c;該怎么做&#xff1f; 如果我們的app正常發布就必須要經歷混淆這一步&#xff0c;混淆可以使我們的app不那么容易被別人用反編譯工具破解&#xff0c;就算被破解&#xff0c;想要讀懂我們的源碼也是非常費勁的&#xff0c;因為混淆過的源碼…

學妹,你要的C語言版AOE網絡數據結構來了,就這么簡單!

文章目錄AOE關鍵路徑編程AOE完整求解程序AOE關鍵路徑編程 不難發現AOE圖最大特點是沒有回路&#xff0c;并且有向圖方向始終是從源點走向匯點&#xff0c;且源點匯點都是一個。 把圖1寫成鄰接矩陣文件&#xff0c;見文件P200G736.TXT&#xff0c;并在此復制G0.C到AOE.C&#x…

C語言試題160之某個公司采用公用電話傳遞數據,數據是四位的整數,在傳遞過程中是加密的,加密規則如下: 每位數字都加上 5,然后用和除以 10 的余數代替該數字,再將第一位和第四位交換,第二位和第三位

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:某個公司采用公用電話傳遞數…

C# 關于狀態機的實現(案例版)

大部分的狀態機都是有限狀態機&#xff0c;某些業務環境&#xff0c;或者其他環境中&#xff0c;如果有狀態機其實還是很方便的。比如&#xff0c;我是用在了單個客戶的Socket通信上&#xff0c;未連接狀態&#xff0c;我就等連接。已連接狀態&#xff0c;就等待下一步指令狀態…

測試并發應用 (一)監控Lock接口

聲明&#xff1a;本文是《 Java 7 Concurrency Cookbook 》的第八章&#xff0c; 作者&#xff1a; Javier Fernndez Gonzlez 譯者&#xff1a;鄭玉婷 校對&#xff1a;方騰飛 監控Lock接口 Lock 接口是Java 并發 API提供的最基本的機制來同步代碼塊。它允許定義臨界區。臨界…

[There will be more story......]

This blog will keep on updating.轉載于:https://www.cnblogs.com/SinGuLaRiTy2001/p/7965776.html

根據生日得到星座

--得到星座 function DataCenter_Setting:GetConstellation(month, day)local dataInfo {121, 220, 321, 421, 522, 622, 723, 824, 924, 1024, 1123, 1222}local Constellations {"水瓶", "雙魚", "白羊", "金牛", "雙子"…

[轉]Android 項目的代碼混淆,Android proguard 使用說明

簡介 Java代碼是非常容易反編譯的。為了很好的保護Java源代碼&#xff0c;我們往往會對編譯好的class文件進行混淆處理。 ProGuard是一個混淆代碼的開源項目。它的主要作用就是混淆&#xff0c;當然它還能對字節碼進行縮減體積、優化等&#xff0c;但那些對于我們來說都算是次要…

數據結構與算法:終于可以用三種語言(C,C#,JavaScript)把圖的廣度優先遍歷講清楚了(推薦收藏)

文章目錄鄰接矩陣存儲圖的廣度優先遍歷過程分析C語言實現隊列編程程序中加入圖的處理函數結果的再次分析C#語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹JavaScript語言實現圖的廣度優先遍歷、并顯示廣度優先遍歷生成樹鄰接矩陣存儲圖的廣度優先遍歷過程分析 對圖1這樣…

C語言試題161之求100000以內的自守數

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款刷算法、筆試、面經、拿大公司offer神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:自守數是…