Android系統的安全設計與架構

來源:互聯網
上載者:User

標籤:

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都只能訪問檔案系統上相應的資料存放區路徑。

[email protected]:/ # 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系統的安全設計與架構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.