天天看點

淺入淺出 Android 安全:第一章 Android第一章 Android

第一章 Android

來源: Yury Zhauniarovich | Publications 譯者: 飛龍 協定: CC BY-NC-SA 4.0

Android 安全架構的了解不僅幫助我了解 Android 的工作原理,而且為我開啟了如何建構移動作業系統和 Linux 的眼界。 本章從安全角度講解 Android 架構的基礎知識。 在第 1.1 節中,我們會描述 Android 的主要層級,而第 1.2 節給出了在此作業系統中實作的安全機制的進階概述。

1.1 Android 技術棧

Android 是一個用于各種移動裝置的軟體棧,以及由 Google 上司的相應開源項目[9]。 Android 由四個層組成:Linux 核心,本地使用者空間,應用程式架構和應用程式層。 有時本地使用者空間和應用程式架構層被合并到一個層中,稱為 Android 中間件層。 圖 1.1 表示 Android 軟體棧的層級。 粗略地說,在這個圖中,綠色塊對應在 C/C++ 中開發的元件,而藍色對應在 Java 中實作的元件。 Google 在 Apache 2.0 許可證下分發了大部分 Android 代碼。 此規則最值得注意的例外是 Linux 核心中的更改,這些更改在 GNU GPL V2 許可證下。

Linux 核心層。在 2005 年被 Google 認識之前,Android 是 Android Inc. 公司的初創産品。創業公司的特點之一是,他們傾向于最大限度地重複利用已經存在的元件,以減少其産品的時間和成本。 Android 公司選擇 Linux 核心作為他們新平台的核心。在 Android 中,Linux 核心負責程序,記憶體,通信,檔案系統管理等。雖然 Android 主要依賴于“vanilla” Linux 核心功能,但是已經做出了系統操作所需的幾個自定義更改。其中 Binder(一個驅動程式,提供對 Android 中的自定義 RPC / IPC 機制的支援),Ashmem(替代标準的 Linux 共享記憶體功能),Wakelocks(一種防止系統進入睡眠的機制)是最值得注意的更改[19]。雖然這些變化被證明在移動作業系統中非常有用,但它們仍然在 Linux 核心的主要分支之外。

本地使用者空間層。通過本地使用者空間,我們可了解在 Dalvik 虛拟機之外運作的所有使用者空間元件,并且不屬于 Linux Kernel 層。這個層的第一個元件是硬體抽象層(HAL),它與 Linux 核心和本地使用者空間層之間實際上是模糊的。在 Linux 中,硬體驅動程式嵌入到核心中或作為子產品動态加載。雖然 Android 是建立在 Linux 核心之上,它利用了一種非常不同的方法來支援新的硬體。相反,對于每種類型的硬體,Android 定義了一個 API,它由上層使用并用于與這種類型的硬體互動。硬體供應商必須提供一個軟體子產品,負責實作在 Android 中為這種特定類型的硬體定義的API。是以,此解決方案不再允許 Android 将所有可能的驅動程式嵌入核心,并禁用動态子產品加載核心機制。提供此功能的元件在 Android 中稱為硬體抽象層。此外,這樣的架構解決方案允許硬體供應商選擇許可證,在其下分發它們的驅動程式[18,19]。

核心通過啟動一個名為 init 的使用者空間程序來完成其啟動。 此過程負責啟動 Android 中的所有其他程序和服務,以及在作業系統中執行一些操作。 例如,如果關鍵服務在 Android 中停止應答,init 程序可以重新啟動它。 該程序根據

init.rc

配置檔案執行操作。 工具箱包括基本的二進制檔案,在 Android [19]中提供

shell

工具的功能。

Android 還依賴于一些關鍵的守護程序。 它在系統啟動時啟動,并在系統工作時保持它們運作。 例如,

rild

(無線接口層守護程序,負責基帶處理器和其他系統之間的通信),

servicemanager

(一個守護程序,它包含在 Android 中運作的所有 Binder 服務的索引),

adbd

(Android Debug Bridge 守護程序,作為主機和目标裝置之間的連接配接管理器)等。

本地使用者空間中最後一個元件是本地庫。 有兩種類型的本地庫:來自外部項目的本地庫,以及在 Android 自身中開發的本地庫。 這些庫被動态加載并為 Android 程序提供各種功能[19]。

應用程式架構層。 Dalvik 是 Android 的基于寄存器的虛拟機。它允許作業系統執行使用 Java 語言編寫的 Android 應用程式。在建構過程中,Java 類被編譯成由 Dalvik VM 解釋的

.dex

檔案。 Dalvik VM 特别設計為在受限環境中運作。此外,Dalvik VM 提供了與系統其餘部分互動的功能,包括本地二進制和庫。為了加速程序初始化過程,Android 利用了一個名為 Zygote 的特定元件。這是一個将所有核心庫連結起來的特殊“預熱”過程。當新應用程式即将運作時,Android 會從 Zygote 配置設定一個新程序,并根據已啟動的應用程式的規範設定該程序的參數。該解決方案允許作業系統不将連結庫複制到新程序中,進而加快應用程式啟動操作。在 Android 中使用的 Java 核心庫,是從 Apache Harmony 項目借用的。

系統服務是 Android 的最重要的部分之一。 Android 提供了許多系統服務,它們提供了基本的移動作業系統功能,供 Android 應用開發人員在其應用中使用。 例如,

PackageManagerService

負責管理(安裝,更新,删除等)作業系統中的 Android 包。 使用 JNI 接口系統服務可以與本地使用者空間層的守護程序,工具箱二進制檔案和本地庫進行互動。 公共 API 到系統服務都是通過 Android 架構庫提供的。 應用程式開發人員使用此 API 與系統服務進行互動。

Android 應用程式層。 Android 應用程式是在 Android 上運作的軟體應用程式,并為使用者提供大多數功能。 Stock Android 作業系統附帶了一些稱為系統應用程式的内置應用程式。 這些是作為 AOSP 建構過程的一部分編譯的應用程式。 此外,使用者可以從許多應用市場安裝使用者應用,來擴充基本功能并向作業系統引入新的功能。

1.2 Android 一般安全說明

Android 的核心安全原則是,對手應用程式不應該損害作業系統資源,使用者和其他應用程式。 為了促使這個原則的執行,Android 是一個分層作業系統,利用了所有級别提供的安全機制。 專注于安全性,Android 結合了兩個層級的元件[?,?]:Linux 核心層和應用程式架構層(參見圖 1.2)。

在 Linux 核心層級,每個應用程式都在特殊的應用程式沙箱中運作。 核心通過使用标準 Linux 設施(程序分離,以及通過網絡套接字和檔案系統的任意通路控制)來強制隔離應用程式和作業系統元件。 這種隔離的實作是,為每個應用程式配置設定單獨的 Unix 使用者(UID)群組(GID)辨別符。 這種架構決策強制在單獨的 Linux 程序中運作每個應用程式。 是以,由于在 Linux 中實作的程序隔離,在預設情況下,應用程式不能互相幹擾,并且對作業系統提供的設施具有有限的通路。 是以,應用程式沙盒確定應用程式不能耗盡作業系統資源,并且不能與其他應用程式互動[3]。

Linux 核心層提供的強制機制,有效地使用沙箱,将應用程式與其他應用程式和系統元件隔離。 同時,需要有效的通信協定來允許開發人員重用應用元件并與作業系統單元互動。 該協定稱為程序間通信(IPC),因為它能夠促進不同程序之間的互動。 在 Android 中,此協定在 Android 中間件層實作(在 Linux 核心層上釋出的特殊驅動程式)。 此層級的安全性由 IPC 引用監控器提供。 引用監控器調解程序之間的所有通信,并控制應用程式如何通路系統的元件和其他應用程式。 在 Android 中,IPC 引用監控器遵循強制通路控制(MAC)通路控制類型。

預設情況下,所有 Android 應用都在低特權應用程式沙箱中運作。 是以,應用程式隻能通路一組有限的系統功能。 Android 作業系統控制應用程式對系統資源的通路,這可能會對使用者體驗造成不利影響[3]。 該控制以不同的形式實作,其中一些在以下章節中較長的描述。 還有一部分受保護的系統功能(例如,攝像頭,電話或 GPS 功能),其通路權限應該提供給第三方應用程式。 然而,這種通路應以受控的方式提供。 在 Android 中,這種控制使用權限來實作。 基本上,每個提供受保護系統資源的通路的敏感 API 都被配置設定有一個權限(Permission)- 它是唯一的安全标簽。 此外,受保護特性還可能包括其他應用的元件。

為了使用受保護的功能,應用程式的開發者必須在檔案

AndroidManifest.xml

中請求相應的權限。 在安裝應用程式期間,Android 作業系統将解析此檔案,并向使用者提供此檔案中聲明的權限清單。 應用程式的安裝根據“全有或全無”原則進行,這意味着僅當接受所有權限時才安裝應用程式。 否則,将不會安裝應用程式。 權限僅在安裝時授予,以後無法修改。 作為權限的示例,我們考慮需要監控 SMS 傳入消息的應用程式。 在這種情況下,

AndroidManifest.xml

檔案必須在

<uses-permission>

标簽中包含以下聲明:

android.permission.RECEIVE SMS

應用程式嘗試使用某個功能,并且該功能尚未在 Android 清單檔案中聲明,通常會産生安全性異常。 在下面幾節中我們會講解權限實作機制的細節。