作者:飛龍使者 看雪學院

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

1.1 Android 技術棧

Android 是一個用於各種移動設備的軟體棧,以及由 Google 領導的相應開源項目。

Android 由四個層組成:Linux 內核本地用戶空間應用程序框架應用程序層。 有時本地用戶空間和應用程序框架層被合併到一個層中,稱為 Android 中間件層。


1.1 表示Android 軟體棧的層級。 粗略地說,在這個圖中,綠色塊對應在 C/C++ 中開發的組件,而藍色對應在 Java
中實現的組件。 Google 在 Apache 2.0 許可證下分發了大部分 Android 代碼。 此規則最值得注意的例外是 Linux
內核中的更改,這些更改在 GNU GPL V2 許可證下。

圖 1.1:Android 軟體棧

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

本地用戶空間層。通過本地用戶空間,我們可瞭解在
Dalvik 虛擬機之外運行的所有用戶空間組件,並且不屬於 Linux Kernel 層。這個層的第一個組件是硬體抽象層( HAL) ,它與
Linux內核和本地用戶空間層之間實際上是模糊的。在 Linux 中,硬體驅動程序嵌入到內核中或作為模塊動態載入。雖然 Android 是建立在
Linux 內核之上,它利用了一種非常不同的方法來支持新的硬體。相反,對於每種類型的硬體,Android 定義了一個
API,它由上層使用並用於與這種類型的硬體交互。硬體供應商必須提供一個軟體模塊,負責實現在 Android
中為這種特定類型的硬體定義的API。因此,此解決方案不再允許 Android
將所有可能的驅動程序嵌入內核,並禁用動態模塊載入內核機制。提供此功能的組件在 Android
中稱為硬體抽象層。此外,這樣的架構解決方案允許硬體供應商選擇許可證,在其下分發它們的驅動程序。

內核通過啟動一個名為
init 的用戶空間進程來完成其啟動。 此過程負責啟動 Android 中的所有其他進程和服務,以及在操作系統中執行一些操作。
例如,如果關鍵服務在 Android 中停止應答,init 進程可以重新啟動它。 該進程根據 init.rc 配置文件執行操作。
工具箱包括基本的二進位文件,在 Android 中提供 shell 工具的功能。

Android
還依賴於一些關鍵的守護進程。 它在系統啟動時啟動,並在系統工作時保持它們運行。 例如, rild (
無線介面層守護進程,負責基帶處理器和其他系統之間的通信) ,servicemanager ( 一個守護進程,它包含在 Android
中運行的所有 Binder 服務的索引) , adbd ( Android Debug Bridge
守護進程,作為主機和目標設備之間的連接管理器)等。

本地用戶空間中最後一個組件是本地庫。 有兩種類型的本地庫:來自外部項目的本地庫,以及在 Android 自身中開發的本地庫。 這些庫被動態載入並為 Android 進程提供各種功能。

應用程序框架層
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
中實現的進程隔離,在默認情況下,應用程序不能相互幹擾,並且對操作系統提供的設施具有有限的訪問。
因此,應用程序沙盒確保應用程序不能耗盡操作系統資源,並且不能與其他應用程序交互。

圖 1.2:Android 內核實施中的兩個層級

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

默認情況下,所有
Android 應用都在低特權應用程序沙箱中運行。 因此,應用程序只能訪問一組有限的系統功能。 Android
操作系統控制應用程序對系統資源的訪問,這可能會對用戶體驗造成不利影響。 該控制以不同的形式實現,其中一些在以下章節中詳細描述。
還有一部分受保護的系統功能( 例如,攝像頭,電話或 GPS 功能) ,其訪問許可權應該提供給第三方應用程序。 然而,這種訪問應以受控的方式提供。 在
Android 中,這種控制使用許可權來實現。 基本上,每個提供受保護系統資源的訪問的敏感 API 都被分配有一個許可權( Permission)
- 它是唯一的安全標籤。 此外,受保護特性還可能包括其他應用的組件。

為了使用受保護的功能,應用程序的開發者必須在文件
AndroidManifest.xml 中請求相應的許可權。 在安裝應用程序期間,Android
操作系統將解析此文件,並向用戶提供此文件中聲明的許可權列表。 應用程序的安裝根據「全有或全無"原則進行,這意味著僅當接受所有許可權時才安裝應用程序。
否則,將不會安裝應用程序。 許可權僅在安裝時授予,以後無法修改。 作為許可權的示例,我們考慮需要監控 SMS 傳入消息的應用程序。 在這種情況下,
AndroidManifest.xml 文件必須在 <uses-permission> 標籤中包含以下聲明:
android.permission.RECEIVE SMS 。

應用程序嘗試使用某個功能,並且該功能尚未在 Android 清單文件中聲明,通常會產生安全性異常。 在下面幾節中我們會講解許可權實現機制的細節。

本文由飛龍使者編譯來源:Yury Zhauniarovich | Publications
推薦閱讀:
相關文章