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

前言

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

最小化特權準則概念介紹

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

違反最小化特權的危害

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

  1. 攻擊者惡意調用應用的 Activity, 修改程序的狀態(tài)或關鍵數(shù)據(jù)兽愤。舉個例子彼念,如果您的應用的應用需要人臉認證才可以登錄,一般需要保存一個人臉認證狀態(tài)浅萧,如果攻擊者修改了人臉狀態(tài)逐沙,改為已認證通過,則可以直接進入應用主頁洼畅。

  2. 通過調用 Activity 內部的方法吩案,可獲取私密數(shù)據(jù),甚至造成拒絕服務和應用崩潰帝簇。例如徘郭,如果您的登錄 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 系統(tǒng)會為每一個分配一個互不相同的 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. 自定義安全權限 <permission>

該標簽用于在 AndroidManifest 中聲明一個安全權限魂爪,可用于此應用程序的特定組件或功能的訪問先舷。例如一個發(fā)送廣播的業(yè)務,APK1 用于接收廣播滓侍,APK2 用于發(fā)送廣播蒋川,APK1 此時僅想接收聲明了對應權限的應用發(fā)送的廣播。此時需要在 APK1 通過 <permission> 定義安全權限, 在 APK2 通過 <uses-permission> 申請 APK1 定義的安全權限即可撩笆。<permission> 定義格式如下:

<permission 
    android: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 設置了 <intent-filter> 標簽 導致了android:exported = true, 因此,強制設置 exported 為 false 即可
修改前:

        <activity
            android: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>

修改后:

 <activity
            android: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 屬性醉冤,該屬性適用于四大組件秩霍,控制該組件是否可以被系統(tǒng)初始化,默認為 true, 如果設置為 false, 對應控件無法初始化蚁阳,例如無法啟動服務铃绒。值得注意的是,<application> 標簽中也會可以聲明該屬性螺捐,而且該 enabled 與 組件聲明都為 true 的情況下組件才可被初始化颠悬。修改點同樣是將 exported 改為 false

數(shù)據(jù)越權備份風險

概念

應用數(shù)據(jù)備份

Android 2.1 系統(tǒng)可為 APP 提供數(shù)據(jù)的備份與恢復功能矮燎,可在 AndroidManifest 標簽下聲明 android:allowBackup, 屬性決定是否禁用該功能,其中 false 標識禁用赔癌。值得注意的是該屬性默認為 true

違反數(shù)據(jù)越權備份的危害

攻擊者可利用此漏洞攻擊任何可以打開 USB 調試的應用非 root 設備诞外。

  1. 通過 adb backup 命令,將制定應用的數(shù)據(jù)拷貝到外設灾票。一旦該應用數(shù)據(jù)被備份后峡谊,所有的用戶在這個應用的SharedPreferencesDB都可被攻擊者讀取。
  2. 通過 adb restore 命令刊苍,可指定某個備份數(shù)據(jù)既们,恢復應用的數(shù)據(jù)

雖然可以對備份后的文件(.ab)進行加密,但是仍有許多工具工具可對其解密正什,例如: android-backup-extractor, 下面將簡單介紹一下 adb backup 的用法

adb backup

adb backup [-system|-nosystem] -all [-apk|-noapk] [-shared|-noshared] -f <檔案名稱> [需要備份的應用包名]

例如想備份包名為emergency.cicdi.com的數(shù)據(jù)啥纸,可以輸入如下代碼:

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 文件會產(chǎn)生沖突。需要解決沖突蜈块,即統(tǒng)一該屬性的取值鉴腻。但是有些 library 是遠程依賴,本地項目并不可以編輯代碼百揭,而且一個一個修改未免效率較低爽哎,因此需要在 app module 下的 AndroidManifest.xml 中聲明

    <application
        ...
        tools:replace=" android:icon,theme,allowBackup" >
        ...

這行代碼標識 Manifest 合并規(guī)則,意味著當合并 library 中的 Manifest 文件到主 App Manifest時器一,不考慮 library Manifest 中的 allowBackup 取值课锌,以 app 中的 Manifest 為準進行合并。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末祈秕,一起剝皮案震驚了整個濱河市渺贤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌请毛,老刑警劉巖志鞍,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異方仿,居然都是意外死亡固棚,警方通過查閱死者的電腦和手機统翩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來此洲,“玉大人厂汗,你說我怎么就攤上這事∥厥Γ” “怎么了面徽?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匣掸。 經(jīng)常有香客問我趟紊,道長,這世上最難降的妖魔是什么碰酝? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任霎匈,我火速辦了婚禮,結果婚禮上送爸,老公的妹妹穿的比我還像新娘铛嘱。我一直安慰自己,他們只是感情好袭厂,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布墨吓。 她就那樣靜靜地躺著,像睡著了一般纹磺。 火紅的嫁衣襯著肌膚如雪帖烘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天橄杨,我揣著相機與錄音秘症,去河邊找鬼。 笑死式矫,一個胖子當著我的面吹牛乡摹,可吹牛的內容都是我干的。 我是一名探鬼主播采转,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼聪廉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了故慈?” 一聲冷哼從身側響起板熊,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惯悠,沒想到半個月后邻邮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡克婶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年筒严,在試婚紗的時候發(fā)現(xiàn)自己被綠了丹泉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鸭蛙,死狀恐怖摹恨,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情娶视,我是刑警寧澤晒哄,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站肪获,受9級特大地震影響寝凌,放射性物質發(fā)生泄漏。R本人自食惡果不足惜孝赫,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一较木、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧青柄,春花似錦伐债、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至双戳,卻和暖如春虹蒋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拣技。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工千诬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留耍目,地道東北人膏斤。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像邪驮,于是被迫代替她去往敵國和親莫辨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容

  • Application 標簽 android:allowTaskReparenting android:allow...
    Shawn_Dut閱讀 7,772評論 2 61
  • 0×01 五大在線檢測平臺 騰訊的金剛審計系統(tǒng) http://service.security.tencent.c...
    CQ_TYL閱讀 6,855評論 0 2
  • <manifest> 首先毅访,我們的根標簽就是 manifest沮榜,有開始標簽就有結束標簽,所以每個標簽都是成對出現(xiàn)的...
    IT_xiao小巫閱讀 809評論 0 2
  • 2005年5月15日(農(nóng)歷四月初八)喻粹,辦公室一行人應邀到惠安村小要家趕會蟆融。吃飯前,先去爬了附近的大佛山守呜,歸來仿古風...
    聽風閣主人閱讀 294評論 0 0
  • 優(yōu)雅型酥,是一種歲月山憨,它是歷經(jīng)生命種種而呈現(xiàn)出的一種淡若不驚,褪去了少時的稚嫩弥喉,而呈現(xiàn)出的一種成熟的韻味郁竟。一個優(yōu)雅的人...
    雨天的那棵樹閱讀 470評論 0 4