Android系統的安全設計與架構
原標題:Android系統的安全設計與架構
一、安全策略
1、Android
的總體架構由5個主要層次上的組件構成,這5層是:Android應用層、Android框架層、Dalvik虛擬機層、用戶空間原生代碼層和Linux內核層。
2、安全邊界,有時也會稱為信任邊界,是系統中分隔不同信任級別的特殊區域。
一個最直接的例子就是內核空間與用戶空間之間的邊界。內核空間中的代碼可以對硬體執行一些底層操作並訪問所有的虛擬和物理內存,而用戶空間中的代碼則由於CPU的安全邊界控制,無法訪問所有內存。
3、Android沙箱的核
心機制基於以下幾個概念:標準的Linux進程隔離、大多數進程擁有唯一的用戶ID(UID),以及嚴格限制文件系統許可權。
#define AID_SHELL 2000 / * adb shell 與 debug shell 用戶* /#define AID_CACHE 2001 / *緩存訪問* /#define AID_DIAG 2002 / *訪問診斷資源* /
4、某些情況下,許可權也可能以Linux權能的形式出現,例如,AID_INET_ADMIN用戶組中的成員授予CAP_NET_ADMIN權能,允許用戶配置網路介面和路由表。
1.2許可權
1、API許可權:用於控制訪問高層次的功能,這些功能存在於Android API、框架層,以及某種情況下的第三方框架中。一個使用API許可權的常見例子是READ_PHONE_STATE,
2、文件許可權:默認情況下,應用的唯一UID和GID都只能訪問文件系統上相應的數據存儲路徑。
root@android:/ # ls -l /data/datadrwxr-x--x u0_a3 u0_a3 ... com.android.browserdrwxr-x--x u0_a4 u0_a4 ... com.android.calculator2drwxr-x--x u0_a5 u0_a5 ... com.android.calendardrwxr-x--x u0_a24 u0_a24 ... com.android.camera
3、IPC許可權:IPC許可權直接涉及應用組件(以及一些系統的IPC設施)之間的通信,雖然與API許可權也有一些重疊。這些許可權的聲明和檢查實施可能發生在不同層次上,包括運行環境、庫函數,或直接在應用上。具體來說,這個許可權集合應用於一些在Android Binder IPC機制之上建立的主要Android應用組件。
二、層次2.1應用層
應用通常被分為兩類:預裝應用與用戶安裝的應用。
1、AndroidManifest.xml:Manifest文件中一個特別有趣的部分是sharedUserId屬性。簡單地說, 如果兩個應用由相同的密鑰簽名,它們就可以在各自的Manifest文件中指明同一個用戶標識符。在這種情況下,這兩個應用就會在相同的UID環境下運行,從而能使這些應用訪問相同的文件系統數據存儲以及潛在的其他資源。
2、Intent:Intent是一種消息對象,其中包含一個要執行操作的相關信息,將執行操作的目標組件信息(可選),以及其他一些(對接收方可能非常關鍵的)標誌位或支持性信息。幾乎所有常用的動作都涉及在系統中傳遞
Intent。<permission android:name="com.wiley.permission.INSTALL_WIDGET"android:protectionLevel="signature" />...<activity android:name=".InstallWidgetActivity"android:permission="com.wiley.permission.INSTALL_WIDGET"/>
3、Activity:是一種面向用戶的應用組件或用戶界面(UI)。
Activity基於Activity基類,包括一個窗口和相關的UI元素。Activity的底層管理是由被稱為Activity管理服務(Activity Manager)的組件來進行處理的,這一組件也處理應用之間或應用內部用於調用Activity的發送Intent。
4、Broadcast Receiver:通常會在應用希望接收一個匹配某種特定標準的隱式Intent時出現也可以使用。registerReceiver方法在運行時以編程方式註冊,這個方法可以被重載以對Receiver設置許可權。
<receiver android:name=".MySMSReceiver"><intent-filter android:priority:"999"><action android:name="android.provider.Telephony.SMS_RECEIVED" /></intent-filter></receiver>
5、Service是一類在後台運行而無需用戶界面的應用組件,用戶不用直接與Service所屬應用進行交互。
<serviceandroid:name="com.yougetitback.androidapplication.FindLocationService"><intent-filter><actionandroid:name="com.yougetitback.androidapplication.FindLocationService" /></intent-filter></service>
Service通常可以被停止、啟動或綁定,所有這些動作都通過Intent來觸發。
6、Content Provider是為各種通用、共享的數據存儲提供的結構化訪問介面。
<provider android:name="com.wiley.example.MyProvider"android:writePermission="com.wiley .example.permission.WRITE"android:authorities="com.wiley .example.data" />
Content URI採用
content://[authorityname]的格式,可以額外包含路徑和參數信息(如content://com.wiley.example.data/foo),而這些信息對Provider的底層實現可能非常關鍵。
2.2框架層
Android框架層為開發者提供了執行通用任務的部件——程序包及其類。這些任務可能包括管理UI元素、訪問共享數據存儲,以及在應用組件中傳遞消息等。也就是說,框架層中包含任何仍然在DalvikVM中執行的非應用特定代碼。
1、DalvikVM是基於寄存器而不是棧的。。class->.dex->.apk。DalvikVM使用Java Native Interface(JNI)與底層原生代碼進行交互。這一功能允許在Dalvik代碼和原生代碼之間相互調用。
2、Android設備啟動時,Zygote進程是最先運行的進程之一。接下來, Zygote負責啟動其他服務以及載入Android框架所使用的程序庫。然後, Zygote進程作為每個Dalvik進程的載入器,通過複製自身進程副本(也被稱為forking,分支)來創建進程。
Zygote的第二大功能是啟動system_server進程,這個進程容納了所有系統核心服務,並在system的AID用戶環境中以特權許可權運行。
2.3用戶空間原生代碼層
操作系統用戶空間內的原生代碼構成了Android系統的一大部分,這一層主要由兩大類組件構成:程序庫和核心系統服務。
1、Android框架層中的較高層次類所依賴的許多底層功能都是通過共享程序庫的方式來實現,並通過JNI進行訪問的。在這其中,許多程序庫都也是在其他類Unix系統中所使用的知名開源項目。比如,SQLite提供了本地數據存儲功能,Webkit提供了可嵌入的Web瀏覽器引擎,FreeType提供了點陣圖和矢量字體渲染功能。
並非所有的底層程序庫都是標準的,Bionic就是一個值得注意的特例。Bionic是BSD C運行時庫的一個變種,旨在提供更小的內存使用空間。這些庫是使用原生代碼開發的,因而很容易出現內存破壞漏洞
2、核心服務是指建立基本操作系統環境的服務與Android原生組件。這些服務包括初始化用戶空間的服務(如init)、提供關鍵調試功能的服務(如adbd和debugggerd)等。
3、其他服務:提供一些不一定是必需的額外功能(取決於設備和服務)
2.4內核
1、Android對Linux內核的主要修改(例舉2):
Binder:IPC機制,提供額外的一些特性,比如對調用者和被調用者的安全驗證。它已被大量的系統和框架服務所使用OOM修改:"Out Of Memory"-killer在內存空間低的時候殺掉進程,在Android分支中,OOM在內存即將用盡時,較傳統Linux內核能更快地殺掉進程
2、Binder:Binder作為一個架構,以客戶端—伺服器模型運行,允許一個進程同時調用多個「遠程」進程中的多個方法。Binder架構將底層細節進行了抽象,使得這些方法調用看起來就像是本地函數調用。
AIDL允許兩個應用使用「協商確定」或者標準化的介面,來發送和接收數據,使得介面獨立於具體的實現。AIDL類似於其他的介面定義語言文件,比如C/C++中的頭文件。
// IRemoteService.aidlpackage com.example.android;// Declare any non-default types here with import statements//在此聲明任何非默認類型導入聲明/*範例服務介面*/interface IRemoteService {/**請求這一服務的進程ID,做點「有趣」的事情**/int getPid();/**顯示一些用作AIDL參數和返回值的基本類型**/void basicTypes(int anInt, long aLong, boolean aBoolean,float aFloat,double aDouble, String aString);}
3、ashmem:匿名共享內存服務,它廣泛應用於大多數Android核心組件中,
包括Surface Flinger、Audio Flinger、系統伺服器和DalvikVM等。ashmem能夠自動收縮內存緩存,並在全局可用內存較低時回收內存區域,因而非常適用於低內存環境。
int fd = ashmem_create_region("SomeAshmem", size);if(fd == 0) {data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);...
2011年,ashmem被證明存在一個非常嚴重的安全缺陷,允許通過Android屬性進行特權提升
4、日誌記錄器:它根據信息的類型, 提供了4個獨立的日誌緩衝區:main(主緩衝區)、radio(無線電緩衝區)、 event(事件緩衝區)與system(系統緩衝區)。
$ adb -d logcat
寫在最後
在仔細觀察了Android的設計與架構之後,我們已經清楚地了解到,Android操
作系統是一種非常複雜的系統。設計者堅持了最低許可權原則,也就是說任何特定 組件都應該只能訪問它真正所需要訪問的東西。不過,這雖然有助於提高安全性, 卻也增加了複雜性。
轉自: Android開發中文站


TAG:ImaginationTech |