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

### 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操
作系統是一種非常復雜的系統。設計者堅持了最低權限原則,也就是說任何特定
組件都應該只能訪問它真正所需要訪問的東西。不過,這雖然有助于提高安全性,
卻也增加了復雜性。
- 前言
- 內存溢出的解決方案
- 安卓消息推送解決方案
- 語言識別和聊天機器人的實現
- 抽屜效果的實現(DrawerLayout和SlidingMenu的對比)
- 植物大戰僵尸經典開發步驟
- 屏幕適配全攻略
- 安卓圖像處理入門教程
- android開發常用工具箱
- java基礎知識總結
- 剖析軟件外包項目
- java基礎知識——網絡編程、IO流
- 安卓性能優化手冊
- 電商活動中刮刮卡的實現
- Android系統的安全設計與架構
- AsnycTask的內部的實現機制
- Android應用UI設計流程
- 數據結構與算法,每日一道
- html5全解析
- 深入解讀XML解析
- 新聞客戶端案例開發
- 細說Http協議
- win10+ubuntu雙系統安裝方案
- 隨機驗證碼實現案例
- 動態數組的實現案例
- 猜拳游戲案例
- 商業級項目——基金客戶端的架構設計與開發(上)