淺入淺出 Android 安全(五)Android應用層安全


作者:飛龍使者 看雪學院

雖然在這一節中我們描述了應用層的安全性,但是實際的安全實施通常出現在到目前為止描述的底層。 但是,在介紹應用層之後,我們更容易解釋 Android 的一些安全功能。

5.1 應用組件

Android 應用以 Android 軟體包(.apk ) 文件的形式分發。 一個包由 Dalvik 可執行文件,資源文件,清單文件和本地庫組成,並由應用的開發人員使用自簽名證書籤名。 每個 Android 應用由四個組件類型的幾個組件組成:活動(Activity) ,服務( Service) ,廣播接收器( Boardcast Reciver) 和內容供應器( Content Provider) 。將應用分離為組件有助於應用的一部分在應用之間重用。

Advertisements

活動。 活動是用戶界面的元素之一。 一般來說,一個活動通常代表一個界面。

服務。 服務是 Android 中的後台工作裝置。 服務可以無限期運行。 最知名的服務示例是在後台播放音樂的媒體播放器,即使用戶離開已啟動此服務的活動。

廣播接收器。 廣播接收器是應用的組件,它接收廣播消息並根據所獲得的消息啟動工作流。

內容供應器。 內容供應器是為應用提供存儲和檢索數據的能力的組件。 它還可以與另一應用共享一組數據。

因此,Android 應用由不同的組件組成,沒有中央入口點,不像 Java 程序和 main 方法那樣。 由於沒有入口點,所有組件( 廣播接收器除外,它也可以動態定義) 需要由應用的開發人員在 AndroidManifest.xml 文件中聲明。 分離成組件使得我們可以在其它應用中使用組件。例如,在清單 5.1 中,顯示了一個應用的 AndroidManifest.xml 文件的示例。 此應用包含第21 行中聲明的一個 Activity 。其他應用可能會調用此活動,將此組件的功能集成到其應用中。

Advertisements

代碼 5.1: AndroidManifest.xml 文件示例

Android 提供了各種方式來調用應用的組件。 我們可以通過使用方法 startActivity 和 startActivityForResult 啟動新的活動。 服務通過 startService 方法啟動。 在這種情況下,被調用的服務調用其方法 onStart 。 當開發人員要在組件和服務之間建立連接時,它調用 bindService 方法,並在被調用的服務中調用 onBind 方法。 當應用或系統組件使用 sendBroadcast , sendOrderedBroadcast 和 sendStickyBroadcast 方法發送特殊消息時,將啟動廣播接收器。

內容供應器由來自內容解析器的請求調用。所有其他組件類型通過 Intent ( 意圖) 激活。 意圖是 Android 中基於 Binder 框架的特殊通信手段。意圖被傳遞給執行組件調用的方法。被調用的組件可以被兩種不同類型的意圖調用。為了顯示這些類型的差異,讓我們考慮一個例子。例如,用戶想要在應用中選擇圖片。應用的開發人員可以使用顯式意圖或隱式意圖來調用選擇圖片的組件。對於第一種意圖類型,開發人員可以在他的應用的組件中實現挑選功能,並使用帶有組件名稱數據欄位的顯式意圖調用此組件。當然,開發人員可以調用其他應用的組件,但是在這種情況下,他必須確保該應用安裝在系統中。一般來說,從開發人員的角度來看,一個應用中的組件或不同應用的組件之間的交互不存在差異。對於第二種意圖類型,開發人員將選擇適當組件的權利轉移給操作系統。 intent 對象在其 Action , Data 和 Category 欄位中包含一些信息。根據這個信息,使用意圖過濾器,操作系統選擇可以處理意圖的適當組件。意圖過濾器定義了組件可以處理的意圖的「模板"。當然,相同的應用可以定義一個意圖過濾器,它將處理來自其他組件的意圖。

5.2 應用層的許可權

許可權不僅用於保護對系統資源的訪問。 第三方應用的開發人員還可以使用自定義許可權來保護對其應用的組件的訪問。 自定義許可權聲明的示例如清單 5.1 中第 11 行所示。自定義許可權的聲明類似於系統許可權之一。

為了說明自定義許可權的用法,請參考圖 5.1。由 3 個組件組成的應用 2 希望保護對其中兩個的訪問:C1 和 C2。為了實現這個目標,應用 2 的開發者必須聲明兩個許可權標籤 p1 , p2 ,並相應地將它們分配給受保護的組件。如果應用 1 的開發者想要訪問應用 2 的組件 C1 ,則他必須定義他的應用需要許可權 p1 。在這種情況下,應用 1 就可以使用應用 2 的組件 C1。如果應用沒有指定所需的許可權,則禁止訪問受此許可權保護的組件( 參見圖 5.1 中組件 C2 的情況) 。回頭看看我們在代碼 5.1 中的 AndroidManifest.xml 文件的例子,活動TestActivity 被許可權 com.testpackage.permission.mypermission 保護,它在同一個應用清單文件中聲明。如果另一個應用想要使用 TestActivity 提供的功能,它必須請求使用此許可權,類似於第 16 行中的操作。

圖 5.1:保護第三方應用組件的許可權實施

ActivityManagerService 負責調用應用的組件。 為了保證應用組件的安全性,在用於調用組件的框架方法( 例如,5.1 節中描述的 startActivity ) 中,放置特殊的鉤子。 這些鉤子檢查應用是否有權調用組件。 這些檢查以 PackageManagerServer 類的 CheckUidPermission 方法結束( 參見清單 4.6) 。 因此,發生在 Android 框架層的實際的許可權實施,可以看做 Android 操作系統的受信任部分。 因此,應用不能繞過檢查

Advertisements

你可能會喜歡