Android系統的安全設計與架構
來自: http://blog.csdn.net/sdksdk0/article/details/50561352
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 / 訪問診斷資源 /</pre>
4、某些情況下,權限也可能以Linux權能的形式出現,例如,AIDINET
ADMIN用戶組中的成員授予CAP_NET_ADMIN權能,允許用戶配置網絡接
口和路由表。</p>1.2權限
1、API權限:用于控制訪問高層次的功能,這些功能存在于Android API、框
架層,以及某種情況下的第三方框架中。一個使用API權限的常見例子是
READ_PHONE_STATE,
2、文件權限:默認情
況下,應用的唯一UID和GID都只能訪問文件系統上相應的數據存儲路徑。root@android:/ # ls -l /data/data drwxr-x--x u0_a3 u0_a3 ... com.android.browser drwxr-x--x u0_a4 u0_a4 ... com.android.calculator2 drwxr-x--x u0_a5 u0_a5 ... com.android.calendar drwxr-x--x u0_a24 u0_a24 ... com.android.camera3、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所屬應用進行交互。
<service android:name="com.yougetitback.androidapplication.FindLocationService"> <intent-filter> <action android: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.aidl package 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操
</div>
作系統是一種非常復雜的系統。設計者堅持了最低權限原則,也就是說任何特定
組件都應該只能訪問它真正所需要訪問的東西。不過,這雖然有助于提高安全性,
卻也增加了復雜性。