Android安全機制
Android的安全機制包括以下幾個方面:
- 進程沙箱隔離機制
- 應用程序簽名機制
- 權限聲明機制
- 訪問控制機制
- 進程通信機制
- 內存管理機制
- SELinux
進程沙箱隔離機制
Linux是一個多用戶的操作系統,一個UID標識一個用戶。用戶之間是相互隔離的(這種隔離是建立在訪問控制的基礎上實現),用戶有各自獨立的所屬資源和權限范圍。當多用戶登錄Linux系統時,每個用戶的活動都在各自獨立的環境中進行,互不干擾。
Android將Linux系統的用戶隔離機制移植為應用程序隔離,應用程序在安裝時被賦予獨特的用戶標識(UID),並永久保持;應用程序及其運行的Dalvik虛擬機運行於獨立的Linux進程空間,與UID不同的應用程序完全隔離。
應用程序簽名機制
應用程序包(.apk文件)必須被開發者數字簽名;
同一開發者可指定不同的應用程序共享UID,進而運行於同一進程空間,共享資源。
簽名的過程:
• 生成私有、公共密鑰和公共密鑰證書
• 對應用進行簽名
• 優化應用程序
簽名的作用:
• 識別代碼的作者。
• 檢測應用程序是否發生了改變。
• 在應用程序之間建立信任,以便於應用程序可以安全地共享代碼和數據。
權限聲明機制
Android程序默認無法訪問系統和資源,應用程序需要顯式聲明權限、名稱、權限組與保護級別。不同的級別要求應用程序行使此權限時的認證方式不同:
Normal級申請即可用;
Dangerous級需在安裝時由用戶確認才可用;
Signature與Signatureorsystem則必須是系統用戶才可用。
• 通過manifest文件中聲明以下屬性
<uses-permissionandroid:name="string" />
請求android:name對應的權限。
• 通過以下屬性添加自定義權限
<permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="com.test.android.ACCESS_FRIENDS_LIST" android:description="@string/permission_description" android:label="@string/permission_label" android:protectionLevel="normal" />
• 系統組件權限,如activity組件
<activity android:permission="com.test.android.ACCESS_FRIENDS_LIST">
訪問控制機制
Linux系統默認采用ACM(訪問控制機制為DAC(自主訪問控制)。
Android直接繼承了Linux的訪問控制機制傳統的Linux訪問控制機制確保系統文件與用戶數據不受非法訪問。
Linux用戶與權限
• 超級用戶(root):具有最高的系統權限,UID為0。
• 系統偽用戶:Linux操作系統出於系統管理的需要,但又不願賦予超級用戶的權限,需要將某些關鍵系統應用,文件所有權賦予某些系統偽用戶,其UID范圍為1~ 499,系統的偽用戶不能登錄系統。
• 普通用戶:只具備有限的訪問權限,UID 為 500 ~ 6000,可以登錄系統獲得 shell
在Linux權限模型下,每個文件屬於一個用戶和一個組,由UID與GID標識其所有權。針對於文件的具體訪問權限
定義為可讀(r)、可寫(w)與可執行(x),並由三組讀、寫、執行組成的權限三元組來描述相關權限。
第一組定義文件所有者(用戶)的權限,第二組定義同組用戶(GID相同但UID不同的用戶)的權限,第三組定義其他用戶的權限(GID與UID都不同的用戶)。
進程通信機制
Binder進程通信機制提供基於共享內存的高效進程通信;
Binder基於Client-Server模式,提供類似COM與CORBA的輕量級遠程進程調用(RPC);
通過接口描述語言(AIDL)定義接口與交換數據的類型,確保進程間通信的數據不會溢出越界,污染進程空間。
內存管理機制
Android內存管理機制基於標准Linux的低內存管理機制OOM(out of memory killer),設計實現了獨特的低內存清理(LMK)機制,將進程按重要性分級、分組,當內存不足時,自動清理最低級別進程所占用的內存空間;
同時,引入不同於傳統Linux共享內存機制的Android獨有共享內存機制Ashmem,具備清理不再使用共享內存區域的能力。
SELinux
SELinux 擁有三個基本的操作模式:
• Disabled:禁用SELinux策略
• Permissive:在Permissive模式下,SELinux會被啟用但不會實施安全性策略,而只會發出警告及記錄行動。Permissive模式在排除SELinux的問題時很有用
• Enforcing:這個缺省模式會在系統上啟用並實施SELinux的安全性策略,拒絕訪問及記錄行動
SELinux 擁有三種訪問控制方法:
• 強制類型(TE):TE是針對型策略所采用的主要訪問控制機制
• 基於角色的訪問控制(RBAC):它以SELinux用戶(未必等同Linux用戶)為基礎,但缺省的針對型策略並未采用它
• 多層保障(MLS):未被采用,而且經常隱藏在缺省的針對型策略內。
Android攻擊面
攻擊面進行分類:
遠程攻擊面
攻擊者無需在物理位置接近目標,而可以直接通過計算機網絡發動攻擊,具有極大的危害性。
網絡協議棧
安全漏洞研究的聖杯,不需要與目標交互就能實施,而且能夠獲得系統的完全訪問控制權,在Android系統中,包含了對IP,TCP,UDP,ICMP等協議的實現。如果在IP包的處理過程中出現可以用的緩沖區溢出漏洞,將成為最為嚴重的安全漏洞,可以遠程執行內核中的任意代碼。
暴露的網絡服務
無需目標交互的聯網服務是第二位具有吸引力的攻擊面。這些服務通常的用戶空間執行,但是仍有一些潛在的網絡服務,如果成功利用,仍然可以獲得root權限,當然這類網絡服務極少,可以通過nmap等端口掃描器獲得,也可以通過netstat獲得,當啟動wifi,會有額外的網絡服務。
移動技術
移動設備通過移動通信暴露了其他遠程攻擊面,包括通過短信服務(SMS)和多媒體消息服務(MMS),同時使用SMS和MMS消息作為攻擊向量還可以達到其它攻擊面。MMS消息中可以包含一些多媒體內容。而其它一些協議也實現在SMS之上。
客戶端攻擊面:
由於網絡的一般配置屏蔽了許多傳統的遠程的攻擊面,而且客戶端對與它通信的服務器非常信任。所以,攻擊者很大程度上將關注點轉移到客戶端軟件攻擊面中存在的安全漏洞。
瀏覽器攻擊面
現代Web瀏覽器作為功能最為強大的客戶端應用代表,支持HTML,Javascript和豐富的web應用。除了渲染和執行應用邏輯之外還支持一些底層協議。如FTP,HTTP。這些都是有數量驚人的后台代碼實現的。而其中的每個組件都帶有一個攻擊面。可以通過誘導點擊,“水坑”等方法進行攻擊
web驅動的移動應用程序
每個web驅動的移動應用暴露的攻擊面都是不同的。
廣告網絡
廣告網絡由於嵌入嵌入式瀏覽器引擎(WebView),瀏覽器攻擊對於這些應用都是存在的,但一般只能通過中間人攻擊人向量。而且與傳統瀏覽器攻擊不同,這種組件還會暴露額外的攻擊面,可以利用Java類型的反射攻擊進行遠程攻破。而且,廣告框架可能會對隱私構成顯著威脅。
媒體和文檔處理
常見的文件格式漏洞
電子郵件
相對較少
物理相鄰
無線通信
Android設備都支持多種基於射頻的無線技術,幾乎都支持藍牙和wifi和GPS,較新的還支持NFC(近場通信),每種無線技術都具有特有的頻率,且極易受到大量的攻擊,包括主動攻擊和被動攻擊。其中,主動攻擊包括阻塞,欺騙,中間人(MitM)等形式。由於wifi和蜂窩網絡是用於訪問整個互聯網,因此可以達到非常豐富的攻擊面。
1.GPS:通常指代Android中的位置信息,可以讓設備確定自身在地球的位置。它通過衛星獲取信號確定自身位置。
2.基帶:蜂窩調解器可以提供給基帶處理器和移動網絡通信的功能。它是Android電話棧的軟件組件,由於對它的攻擊終端用戶難以察覺,而且能夠訪問手機通話記錄及傳輸數據,對它的攻擊具有非常的吸引力。盡管屬於遠程攻擊,但依舊需要在一定的范圍內,近年來的“偽基站”攻擊
3.藍牙:藍牙具有30多種協議,每種藍牙都定義了藍牙設備的一項特殊功能。如FTP(文件傳輸協議),HFP(免提協議),HSP(Handest Profile),HID(人機接口設備協議),DUN(撥號網絡協議)。藍牙協議功能首先需要配對。但一些設備使用硬編碼的數字碼,非常容易攻擊。配對后,有可能劫持會話並進行濫用,可能的攻擊方法包括BlueJacking,BlueSnarfing和BlueBugging。除了可以與一些免提設備配對,android設備之間還能互相配對,用於傳輸聯系人列表,文件等。藍牙設計時功能非常多樣化,也提供了攻擊者希望的幾乎所有的功能訪問
4.Wi-Fi:Wi-Fi主要用於連接局域網,由局域網提供對互聯網的訪問。詳情見於《黑客大曝光:無線網絡安全》
5.NFC:NFC是建立與射頻標示之上(RFID)的無線通信技術,NFC在所有的無線技術中,作用范圍最短,通常不超過20cm。Android設備上的NFC有三種典型場景。第一,標簽被呈現給設備,設備讀取標簽的數據並進行處理。第二,兩位用戶將他們的Anddorid設備貼在一起傳輸數據。第三,用於非接觸式的支付。最流行的消息格式是NFC數據交換格式(NDEF),解析時會導致執行一些動作。在某些情況下,無需用戶交互。
其他技術
除了無線通信外,還有其它兩個技術也與Android設備的整體攻擊面相關。具體來說為QR碼(快速響應矩陣碼)和語音指令
本地攻擊面
當獲得對一個設備的任意代碼執行后,邏輯上的下一步就是權限提升。終極目標是獲得享有特權的代碼執行,包括在內存空間執行。或者以root執行。然而只是獲得少量權限,也可以暴露更多受限的攻擊面。由於權限隔離,為了實現終極目標,需要結合使用多個小的提升目標。
探究文件系統
Android的UNIX系統意味着許多攻擊面都是通過文件系統條目暴露的
其它的本地攻擊面
除了文件系統,其它的本地攻擊面是有linux'內核暴露的,包括系統調用和套接字實現
1.系統調用:系統調用處理代表一個值得關注的攻擊面
2.套接字:Android上運行的軟件使用不同類型的套接字進行ipc
3.Binder:Binder驅動以及它依賴的軟件代表Android特有的一個攻擊面。Binder驅動是Intent的基礎,而Intent是用於在應用層Android組件進行通信。Binder驅動本身在內核空間實現,並通過。/dev/binder字符設備暴露一個攻擊面。
4.共享內存:一種定制的內存共享機制
5.基帶接口:Android智能手機上包含第二個操作系統,就是基帶
6.攻擊硬件支持的服務:包括GPS接收器,光環境傳感器,陀螺儀
物理攻擊面
需要物理接觸設備的攻擊被稱為依賴於物理攻擊面,物理面攻擊與物理相鄰不同的是物理相鄰不需要實際接觸目標。
拆解設備
對目標設備進行拆解,就能夠對目標設備中的硬件發起攻擊。打開一個硬件設備通常會發現
1.暴露的串口,允許接收調試消息
2.暴露的JTAG調試端口,允許對設備的固件進行調試,重刷或訪問
USB
USB是Android設備與其它設備進行交互的標准化有線接口
其它物理攻擊面
包括手機SIM卡,SD卡,HDMI卡,暴露的測試點和對接連接器
第三方修改
參與生產Android設備的實體會修改操作系統的不同組成部分,一般需要手工進行分析。