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