理解Android安全機(jī)制
本文從Android系統(tǒng)架構(gòu)著手,分析Android的安全機(jī)制以SE Android,最后給出一些Android安全現(xiàn)狀和常見的安全解決方案。
1、Android系統(tǒng)架構(gòu)
Android采用分層的系統(tǒng)架構(gòu),由下往上分別是linux內(nèi)核層、硬件抽象層、系統(tǒng)運(yùn)行時庫層、應(yīng)用程序框架層和應(yīng)用程序?qū)印?nbsp;
Android以Linux操作系統(tǒng)內(nèi)核為基礎(chǔ),實(shí)現(xiàn)硬件設(shè)備驅(qū)動、進(jìn)程和內(nèi)存管理、網(wǎng)絡(luò)協(xié)議棧、電源管理等核心系統(tǒng)功能。除此以外,Android還增加了一些面向移動設(shè)備的特有功能,如低內(nèi)存管理LMK(Low Memory Killer)、匿名共享內(nèi)存(Ashmem: Anonymous Shared Memory),以及進(jìn)程間通信Binder機(jī)制。這些功能的增強(qiáng)進(jìn)一步提升了Android在內(nèi)存管理、進(jìn)程間通信等方面的安全性。
Android之前的版本并不存在硬件抽象層。鑒于硬件廠商并不希望公開其設(shè)備驅(qū)動的源代碼,Google對此將Linux內(nèi)核驅(qū)動程序進(jìn)行封裝,屏蔽掉底層的實(shí)現(xiàn)細(xì)節(jié),向上提供統(tǒng)一的接口,這就是硬件抽象層。
HAL(Hardware Abstraction Layer)規(guī)定了一套應(yīng)用層對硬件層的讀寫和配置的統(tǒng)一接口,本質(zhì)上是將硬件的驅(qū)動分為用戶空間和內(nèi)核空間,其中內(nèi)核驅(qū)動程序運(yùn)行在內(nèi)核空間,HAL運(yùn)行在用戶空間。上圖中的Stub,以so庫的形式存在,可以理解為proxy。上層通過調(diào)用標(biāo)識獲得HAL的相關(guān)Stub,進(jìn)而取得相應(yīng)操作。
系統(tǒng)運(yùn)行時庫由系統(tǒng)類庫和Android運(yùn)行時構(gòu)成。系統(tǒng)類庫基本上用C/C++編寫,基本功能說明如下:
當(dāng)然,還有Android NDK(Native Development Kit),使得應(yīng)用程序可以不依賴Dalvik虛擬機(jī)進(jìn)行開發(fā)。Android運(yùn)行時核心庫提供android.os, android.net, android.media等核心API,而Dalvik虛擬機(jī)依賴Linux內(nèi)核,實(shí)現(xiàn)進(jìn)程隔離與線程調(diào)度管理、安全與異常管理、垃圾回收等功能,并被改進(jìn)以適應(yīng)低內(nèi)存、低處理器速度的移動設(shè)備環(huán)境。
再往上就是應(yīng)用程序框架層了。一系列的Android應(yīng)用程序所需的類庫,使得開發(fā)人員可以快速地進(jìn)行程序開發(fā),也可以通過繼承實(shí)現(xiàn)個性化的擴(kuò)展。如Activity Manager負(fù)責(zé)主線程ActivityThread的創(chuàng)建、Activity生命周期的維護(hù),并為窗口提供交互的接口。
應(yīng)用層就是與用戶直接交互的應(yīng)用程序,如SMS短信、圖片瀏覽器、地圖以及開發(fā)人員所開發(fā)的應(yīng)用程序。
2、Android安全機(jī)制
Android將安全設(shè)計貫穿系統(tǒng)架構(gòu)的各個層面,覆蓋系統(tǒng)內(nèi)核、虛擬機(jī)、應(yīng)用程序框架層以及應(yīng)用層各個環(huán)節(jié),力求在開放的同時,也恰當(dāng)保護(hù)用戶的數(shù)據(jù)、應(yīng)用程序和設(shè)備的安全。Android安全模型主要提供以下幾種安全機(jī)制:
- 進(jìn)程沙箱隔離機(jī)制
- 應(yīng)用程序簽名機(jī)制
- 權(quán)限聲明機(jī)制
- 訪問控制機(jī)制
- 進(jìn)程通信機(jī)制
- 內(nèi)存管理機(jī)制
進(jìn)程沙箱隔離機(jī)制,使得Android應(yīng)用程序在安裝時被賦予獨(dú)特的用戶標(biāo)識(UID),并永久保持。應(yīng)用程序及其運(yùn)行的Dalvik虛擬機(jī)運(yùn)行在獨(dú)立的Linux進(jìn)程空間,與其它應(yīng)用程序完全隔離。
在特殊情況下,進(jìn)程間還可以存在相互信任關(guān)系。如源自同一開發(fā)者或同一開發(fā)機(jī)構(gòu)的應(yīng)用程序,通過Android提供的共享UID(Shared UserId)機(jī)制,使得具備信任關(guān)系的應(yīng)用程序可以運(yùn)行在同一進(jìn)程空間。
應(yīng)用程序簽名機(jī)制,規(guī)定APK文件必須被開發(fā)者進(jìn)行數(shù)字簽名,以便標(biāo)識應(yīng)用程序作者和在應(yīng)用程序之間的信任關(guān)系。在安裝應(yīng)用程序APK時,系統(tǒng)安裝程序首先檢查APK是否被簽名,有簽名才能安裝。當(dāng)應(yīng)用程序升級時,需要檢查新版應(yīng)用的數(shù)字簽名與已安裝的應(yīng)用程序的簽名是否相同,否則,會被當(dāng)做一個新的應(yīng)用程序。Android開發(fā)者有可能把安裝包命名為相同的名字,通過不同的簽名可以把他們區(qū)分開來,也保證簽名不同的包不被替換,同時防止惡意軟件替換安裝的應(yīng)用。
權(quán)限聲明機(jī)制,要想獲得在對象上進(jìn)行操作,就需要把權(quán)限和此對象的操作進(jìn)行綁定。不同級別要求應(yīng)用程序行使權(quán)限的認(rèn)證方式也不一樣,Normal級申請就可以使用,Dangerous級需要安裝時由用戶確認(rèn),Signature和Signatureorsystem級則必須是系統(tǒng)用戶才可用。
訪問控制機(jī)制,確保系統(tǒng)文件和用戶數(shù)據(jù)不受非法訪問。
進(jìn)程通信機(jī)制,基于共享內(nèi)存的Binder實(shí)現(xiàn),提供輕量級的遠(yuǎn)程進(jìn)程調(diào)用(RPC)。通過接口描述語言(AIDL)定義接口與交換數(shù)據(jù)的類型,確保進(jìn)程間通信的數(shù)據(jù)不會溢出越界。
Linux進(jìn)程視角
應(yīng)用程序視角
內(nèi)存管理機(jī)制,基于Linux的低內(nèi)存管理機(jī)制,設(shè)計實(shí)現(xiàn)了獨(dú)特的LMK,將進(jìn)程重要性分級、分組,當(dāng)內(nèi)存不足時,自動清理級別進(jìn)程所占用的內(nèi)存空間。同時,引入的Ashmem內(nèi)存機(jī)制,使得Android具備清理不再使用共享內(nèi)存區(qū)域的能力。
正是因?yàn)锳ndroid采用多層架構(gòu),在保護(hù)信息安全的同時,也保證開放平臺的靈活性。
3、SE Android
Android是一個基于Linux內(nèi)核的系統(tǒng),像傳統(tǒng)的Linux系統(tǒng)一樣,Android也有用戶的概念。只不過這些用戶不需要登錄,也可以使用Android系統(tǒng)。Android系統(tǒng)將每一個安裝在系統(tǒng)的APK都映射為一個不同的Linux用戶。也就是每一個APK都有一個對應(yīng)的UID和GID,這些UID和GID在APK安裝的時候由系統(tǒng)安裝服務(wù)PackageManagerService分配。Android沙箱隔離機(jī)制就是建立在Linux的UID和GID基礎(chǔ)上。
這種基于Linux UID/GID的安全機(jī)制存在什么樣的問題呢?
Linux將文件的權(quán)限劃分為讀、寫和執(zhí)行三種,分別用字母r、w和x表示。每一個文件有三組讀、寫和執(zhí)行權(quán)限,分別針對文件的所有者、文件所有者所屬的組以及除了所有者以及在所有者所屬組的用戶之外所有其它用戶。這樣,如果一個用戶想要將一個自己創(chuàng)建的文件交給另外一個用戶訪問,那么只需要相應(yīng)地設(shè)置一下這個文件的其它用戶權(quán)限位就可以了。所以,在Linux系統(tǒng)中,文件的權(quán)限控制在所有者的手中。因此,這種權(quán)限控制方式就稱為自主式的,正式的英文名稱為Discretionary Access Control,簡稱為DAC。
在理想情況下,DAC機(jī)制是沒有問題的。然而,一個用戶可能會不小心將自己創(chuàng)建的文件的權(quán)限位錯誤地修改為允許其它用戶訪問。如果這個用戶是一個特權(quán)用戶,并且它錯誤操作的文件是一個敏感的文件,那么就會產(chǎn)生嚴(yán)重的安全問題。這種誤操作的產(chǎn)生方式有三種:
- 用戶執(zhí)行了錯誤的命令
- 負(fù)責(zé)執(zhí)行用戶命令的程序有Bug
- 負(fù)責(zé)執(zhí)行用戶命令的程序受到攻擊
后來,Linux內(nèi)核采用了必要的訪問控制機(jī)制:SE Linux(Security-Enhanced Linux),它采用了一種強(qiáng)制存取控制MAC(Mandatory Access Control)策略的實(shí)現(xiàn)方式,目的在于通過限制系統(tǒng)中的任何進(jìn)程以及用戶對資源的訪問,保護(hù)內(nèi)核安全。而SE Android(Security-Enhanced Android)是Android與SE Linux的結(jié)合,由美國NSA在2012年推出的Android操作系統(tǒng)安全強(qiáng)化套件,以支持在Android平臺上使用SE Linux。
目前SE Android系統(tǒng)中的策略機(jī)制主要有三種:
- 安裝時MAC(install-time MAC)
- 權(quán)限取消(permission revocation)
- 權(quán)限標(biāo)簽傳播(tag propagation)
安裝時MAC通過查找MAC策略配置來檢查應(yīng)用程序的權(quán)限。權(quán)限取消可以為已安裝的應(yīng)用取消權(quán)限,該機(jī)制在應(yīng)用程序運(yùn)行的權(quán)限檢查時通過查找權(quán)限取消列表來取消應(yīng)用的某些權(quán)限。權(quán)限標(biāo)簽傳播是一種污點(diǎn)跟蹤方式的應(yīng)用,Android系統(tǒng)的權(quán)限作為抽象的標(biāo)簽映射到MAC策略配置文件中。
SE Android安全機(jī)制所要保護(hù)的對象是系統(tǒng)中的資源,這些資源分布在各個子系統(tǒng)中。實(shí)際上,系統(tǒng)中需要保護(hù)的資源非常多,除了文件之外,還有進(jìn)程、socket和IPC等。SE Android是一個復(fù)雜的安全模型,本文就不進(jìn)一步分析了。想了解更多,請參考:SEAndroid安全機(jī)制框架分析(http://blog.csdn.net/luoshengyang/article/details/37613135)
4、Android應(yīng)用安全解決方案
Android應(yīng)用會遇到各種各樣的安全性問題,如何從宏觀上了解各種安全隱患,積極采取適當(dāng)?shù)姆烙胧┍阕兊糜葹橹匾?。那么,Android應(yīng)用面臨哪些安全問題呢?
- 病毒
- 關(guān)鍵信息泄露
- APP重打包
- 進(jìn)程被劫持
- 數(shù)據(jù)在傳輸過程遭劫持
- Webview漏洞
病毒不用多說了,都是一些惡意軟件。關(guān)鍵信息泄露,可能有些開發(fā)者并不十分留意。雖然Java代碼可以做混淆,但是Android的幾大組件的創(chuàng)建方式是依賴注入的方式,因此不能被混淆。而且目前常用的一些反編譯工具比如apktool等能夠毫不費(fèi)勁地還原Java里的明文信息,native里的庫信息也可以通過objdump或IDA獲取。因此一旦Java或native代碼里存在明文敏感信息,基本上就是毫無安全而言的。重打包即通過反編譯后重新加入惡意的代碼邏輯,重新打包一個APK文件。進(jìn)程被劫持一般通過進(jìn)程注入或者調(diào)試進(jìn)程的方式來hook進(jìn)程,改變程序運(yùn)行的邏輯和順序,從而獲取程序運(yùn)行的內(nèi)存信息。hook需要獲取root權(quán)限或者跟被hook進(jìn)程相同的權(quán)限。如果手機(jī)沒被root,被劫持的可能性還是較小。數(shù)據(jù)在傳輸過程遭劫持,一般來說是由于數(shù)據(jù)明文傳輸或沒使用HTTPS。Webview漏洞一般由于JS注入。
現(xiàn)實(shí)中,出現(xiàn)的問題可能比上面提及的還要多??偟膩碚f,應(yīng)該從以下幾個方面來應(yīng)對Android開發(fā)的常見安全問題:
- 應(yīng)用權(quán)限控制。通過控制應(yīng)用程序的權(quán)限防止惡意應(yīng)用對系統(tǒng)造成破壞,采取的措施包括合理使用系統(tǒng)內(nèi)置權(quán)限和應(yīng)用程序自定義權(quán)限。
- 應(yīng)用程序簽名。采用數(shù)字簽名為應(yīng)用程序簽名。
- 應(yīng)用加固。應(yīng)用加固包括病毒掃描、防注入、防調(diào)試、防篡改四個模塊,目前行業(yè)內(nèi)已經(jīng)出現(xiàn)了很多的應(yīng)用加固解決方案,如360應(yīng)用加固、騰訊云應(yīng)用加固、百度應(yīng)用加固等等。
- 靜態(tài)代碼分析。通過靜態(tài)代碼分析工具lint監(jiān)測安全隱患,對代碼進(jìn)行優(yōu)化。
- 防火墻。必要時為Android設(shè)備安裝防火墻,以防止遠(yuǎn)程網(wǎng)絡(luò)攻擊。
- 數(shù)據(jù)存儲加密。采用加密的方式保護(hù)應(yīng)用程序敏感數(shù)據(jù),如利用SQLCipher加密SQLite數(shù)據(jù)庫。
- 應(yīng)用程序組件開發(fā)的安全要點(diǎn)。Activity, Service, Content Provider, Broadcast Receiver等組件在代碼層面應(yīng)采取的安全措施。它們每一個都可以通過隱式的Intent方式打開,所以這些組件只要不是對外公開的必須在AndroidManifest里面注明exported為false,禁止其它程序訪問我們的組件。對于要和外部交互的組件,應(yīng)當(dāng)添加訪問權(quán)限的控制,還需要要對傳遞的數(shù)據(jù)進(jìn)行安全的校驗(yàn)。
參考:
- 《Android安全機(jī)制解析與應(yīng)用實(shí)踐》
- SEAndroid安全機(jī)制簡要介紹和學(xué)習(xí)計劃
http://blog.csdn.net/luoshengyang/article/details/35392905
- Android應(yīng)用安全現(xiàn)狀與解決方案(學(xué)習(xí)資料)
http://blog.csdn.net/yzzst/article/details/46471277