淺入淺出Android安全

Android安全概述

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 許可證下。

圖 1.1:Android 軟件棧

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]。

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

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 清單文件中聲明,通常會產生安全性異常。 在下面幾節中我們會講解權限實現機制的細節。

25选5玩法中奖