新聞中心
本文從Android系統(tǒng)架構(gòu)著手,分析Android的安全機(jī)制以SE Android,最后給出一些Android安全現(xiàn)狀和常見(jiàn)的安全解決方案。

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


咨詢
建站咨詢
