Android系統的安全設計與架構

YukikoEsqui 8年前發布 | 32K 次閱讀 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.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所屬應用進行交互。

<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、其他服務:提供一些不一定是必需
的額外功能(取決于設備和服務)

33頁截圖

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>

 本文由用戶 YukikoEsqui 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!