安卓应用安全指南 4.4.3 创建/使用服务高级话题
安卓應(yīng)用安全指南 4.4.3 創(chuàng)建/使用服務(wù)高級話題
原書:Android Application Secure Design/Secure Coding Guidebook
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
4.4.3.1 導(dǎo)出屬性和意圖過濾器設(shè)置的組合(在服務(wù)情況下)
我們已經(jīng)本指南中解釋了如何在實現(xiàn)四種服務(wù)類型:私有服務(wù),公共服務(wù),伙伴服務(wù)和內(nèi)部服務(wù)。 下表中定義了每種導(dǎo)出屬性類型的許可設(shè)置,以及intent-filter元素的各種組合,它們AndroidManifest.xml文件中定義。 請驗證導(dǎo)出屬性和intent-filter元素與你嘗試創(chuàng)建的服務(wù)的兼容性。
表 4.4-3
| True | False | |
| 意圖過濾器已定義 | 公共 | (不使用) |
| 意圖過濾器未定義 | 公共,伙伴,內(nèi)部 | 私有 |
如果服務(wù)中的導(dǎo)出屬性是未指定的,服務(wù)是否公開由是否定義了意圖過濾器決定 [9];但是,在本指南中,禁止將服務(wù)的導(dǎo)出屬性設(shè)置為未指定。 通常,如前所述,最好避免依賴任何給定 API 的默認(rèn)行為的實現(xiàn); 此外,如果存在顯式方法來配置重要的安全相關(guān)設(shè)置,例如導(dǎo)出屬性,那么使用這些方法總是一個好主意。
[9] 如果定義了任何意圖過濾器,服務(wù)是公開的,否則是私有的。更多信息請見 https://developer.android.com/guide/topics/manifest/service-element.html#exported。
不應(yīng)該使用未定義的意圖過濾器和導(dǎo)出屬性false的原因是,Android 的行為存在漏洞,并且由于意圖過濾器的工作原理,可能會意外調(diào)用其他應(yīng)用的服務(wù)。
具體而言,Android 的行為如下,因此在設(shè)計應(yīng)用時需要仔細(xì)考慮。
- 當(dāng)多個服務(wù)定義了相同的意圖過濾器內(nèi)容時,更早安裝的應(yīng)用中的服務(wù)是優(yōu)先的。
- 如果使用顯式意圖,則優(yōu)先的服務(wù)將被自動選擇并由 OS 調(diào)用。
以下三張圖描述了一個系統(tǒng),由于 Android 行為而發(fā)生意外調(diào)用的。 圖 4.4-4 是一個正常行為的例子,私有服務(wù)(應(yīng)用 A)只能由同一個應(yīng)用通過隱式意圖調(diào)用。 因為只有應(yīng)用 A 定義了意圖過濾器(圖中的action ="X"),所以它的行為正常。 這是正常的行為。
圖 4.4-5 和圖 4.4-6 展示了一個情景,其中應(yīng)用 B 和應(yīng)用 A 中定義了相同的意圖過濾器(action ="X")。
圖 4.4-5 展示了應(yīng)用按A -> B的順序安裝。在這種情況下,當(dāng)應(yīng)用 C 發(fā)送隱式意圖時,私有服務(wù)(A-1)調(diào)用失敗。 另一方面,由于應(yīng)用 A 可以通過隱式意圖,按照預(yù)期成功調(diào)用應(yīng)用內(nèi)的私有服務(wù),因此在安全性(惡意軟件的對策)方面不會有任何問題。
圖 4.4-6 展示了一個場景,應(yīng)用以B->A的順序安裝。 就安全性而言,這里存在一個問題,應(yīng)用 A 嘗試通過發(fā)送隱式意圖來,調(diào)用應(yīng)用中的私有服務(wù),但實際上調(diào)用了之前安裝的應(yīng)用 B 中的公共活動(B-1)。 由于這個漏洞,敏感信息可能會從應(yīng)用 A 發(fā)送到應(yīng)用 B。 如果應(yīng)用 B 是惡意軟件,它會導(dǎo)致敏感信息的泄漏。
如上所示,使用意圖過濾器向私有服務(wù)發(fā)送隱式意圖,可能會導(dǎo)致意外行為,因此最好避免此設(shè)置。
4.4.3.2 如何實現(xiàn)服務(wù)
由于實現(xiàn)服務(wù)的方法是多種多樣的,應(yīng)該按安全類型進(jìn)行選擇,它由示例代碼分類,本文對各個特性進(jìn)行了簡要說明。 它大致分為使用startService和使用bindService的情況。 還可以創(chuàng)建在startService和bindService中都可以使用的服務(wù)。 應(yīng)該調(diào)查以下項目來確定服務(wù)的實現(xiàn)方法。
- 是否將服務(wù)公開給其他應(yīng)用(服務(wù)的公開)
- 是否在運行中交換數(shù)據(jù)(相互發(fā)送/接收數(shù)據(jù))
- 是否控制服務(wù)(啟動或完成)
- 是否作為另一個進(jìn)程執(zhí)行(進(jìn)程間通信)
- 是否并行執(zhí)行多個進(jìn)程(并行進(jìn)程)
表 4.4-3 顯示了每個條目的實現(xiàn)方法類別和可行性。 “NG”代表不可能的情況,或者需要另一個框架的情況,它與所提供的函數(shù)不同。
表 4.4-4 服務(wù)的實現(xiàn)方法分類
| startService類型 | OK | NG | OK | OK | NG |
| IntentService類型 | OK | NG | NG | OK | NG |
| 本地綁定類型 | NG | OK | OK | NG | NG |
| Messenger綁定類型 | OK | OK | OK | OK | NG |
| AIDL 綁定類型 | OK | OK | OK | OK | OK |
startService類型
這是最基本的服務(wù)。 它繼承了Service類,并通過onStartCommand執(zhí)行過程。
在用戶方,服務(wù)由意圖指定,并通過startService調(diào)用。 由于結(jié)果等數(shù)據(jù)無法直接返回給源意圖,因此應(yīng)與其他方法(如廣播)結(jié)合使用。 具體示例請參考“4.4.1.1 創(chuàng)建/使用私有服務(wù)”。
安全性檢查應(yīng)該由onStartCommand完成,但不能用于伙伴服務(wù),因為無法獲取來源的軟件包名稱。
IntentService類型
IntentService是通過繼承Service創(chuàng)建的類。 調(diào)用方法與startService類型相同。 以下是與標(biāo)準(zhǔn)服務(wù)(startService類型)相比較的特征。
- 意圖的處理由onHandleIntent完成(不使用onStartCommand)。
- 由另一個線程執(zhí)行。
- 過程將排隊。
由于過程是由另一個線程執(zhí)行的,因此調(diào)用會立即返回,并且面向意圖的過程由隊列系統(tǒng)順序執(zhí)行。 每個意圖并不是并行處理的,但根據(jù)產(chǎn)品的要求,它也可以作為選項來選擇,來簡化實現(xiàn)。由于結(jié)果等數(shù)據(jù)不能返回給源意圖,因此應(yīng)該與其他方法(如廣播)結(jié)合使用。 具體實例請參考“4.4.1.2 創(chuàng)建/使用公共服務(wù)”。
安全性檢查應(yīng)該由onHandleIntent來完成,但不能用于伙伴服務(wù),因為無法獲取來源的包名稱。
本地綁定類型
這是一種實現(xiàn)本地服務(wù)的方法,它僅工作在與應(yīng)用相同的過程中。 將類定義為從Binder類派生的類,并準(zhǔn)備將Service中實現(xiàn)的特性(方法)提供給調(diào)用方。
在用戶方,服務(wù)由意圖指定并使用bindService調(diào)用。 這是綁定服務(wù)的所有方法中最簡單的實現(xiàn),但它的用途有限,因為它不能被其他進(jìn)程啟動,并且服務(wù)也不能公開。 具體實現(xiàn)示例,請參閱示例代碼中包含的項目“PrivateServiceLocalBind服務(wù)”。
從安全角度來看,只能實現(xiàn)私有服務(wù)。
Messenger綁定類型
這是一種方法,通過使用Messenger系統(tǒng)來實現(xiàn)與服務(wù)的鏈接。
由于Messenger可以提供為來自服務(wù)用戶方的Message目標(biāo),因此可以相對容易地實現(xiàn)數(shù)據(jù)交換。 另外,由于過程要進(jìn)行排隊,因此它具有“線程安全”的特性。每個過程不可能并行,但根據(jù)產(chǎn)品的要求,它也可以作為選項來選擇,來簡化實現(xiàn)。 在用戶端,服務(wù)由意圖指定,通過bindService調(diào)用,具體實現(xiàn)示例請參見“4.4.1.4 創(chuàng)建/使用內(nèi)部服務(wù)”。
安全檢查需要在onBind或Message Handler中進(jìn)行,但不能 用于伙伴服務(wù),因為無法獲取來源的包名稱。
AIDL 綁定類型
這是一種方法,通過使用 AIDL 系統(tǒng)實現(xiàn)與服務(wù)的鏈接。 接口通過 AIDL 定義,并將服務(wù)擁有的特性提供為方法。 另外,回調(diào)也可以通過在用戶端實現(xiàn)由 AIDL 定義的接口來實現(xiàn),多線程調(diào)用是可能的,但有必要在服務(wù)端明確實現(xiàn)互斥。
用戶端可以通過指定意圖并使用bindService來調(diào)用服務(wù)。 具體實現(xiàn)示例請參考“4.4.1.3 創(chuàng)建/使用伙伴服務(wù)”。
安全性檢查必須在onBind中為內(nèi)部服務(wù)執(zhí)行,以及由 AIDL 為伙伴服務(wù)定義的接口的每種方法執(zhí)行。
這可以用于本指南中描述的所有安全類型的服務(wù)。
總結(jié)
以上是生活随笔為你收集整理的安卓应用安全指南 4.4.3 创建/使用服务高级话题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker 基础
- 下一篇: 在CentOS6.8下安装Docker