一纷跛、縱觀Android生態(tài)圈
1.了解Android的根源
2.了解Android的利益相關(guān)者
3.理解生態(tài)圈的復(fù)雜性
碎片化問(wèn)題、兼容性惋戏、更新問(wèn)題领追、安全性與開(kāi)放性、公開(kāi)披露
chrome的漏洞往往也存在于Android中
跟蹤Android安全問(wèn)題的唯一方法是閱讀AOSP的修改日志响逢,跟蹤Gerrit的修改記錄绒窑,或者從Android問(wèn)題跟蹤服務(wù)器上大海撈針。
高通公司通過(guò)Code Aurora論壇公開(kāi)披露漏洞舔亭。
4.小結(jié)
在本章中些膨,你看到了Android操作系統(tǒng)是如何經(jīng)過(guò)多年的發(fā)展,由零開(kāi)始逐漸征服移動(dòng)操作系統(tǒng)設(shè)計(jì)市場(chǎng)的钦铺。本意介紹了Android生態(tài)圈的主要利益相關(guān)者订雾,解釋了他們各自的角色及參與動(dòng)機(jī)。本章詳細(xì)介紹了困擾Android生態(tài)圈的各種復(fù)雜性問(wèn)題矛洞,以及它們是如何影響Android安全性的洼哎。有了對(duì)Android生態(tài)圈復(fù)雜性的深刻理解,你就可以很容易地找出關(guān)鍵問(wèn)題領(lǐng)域缚甩,進(jìn)而更有效地致力于解決Android安全性問(wèn)題谱净。
二、Android的安全設(shè)計(jì)與架構(gòu)
1.理解Android系統(tǒng)架構(gòu)
Android總體架構(gòu)由5個(gè)主要層次上的組件構(gòu)成:Android應(yīng)用層擅威、Android框架層壕探、Dalvik虛擬機(jī)層、用戶空間原生代碼層郊丛、Linux內(nèi)核層李请。
2.理解安全邊界和安全策略執(zhí)行
Android操作系統(tǒng)應(yīng)用了兩套獨(dú)立但又相互配合的權(quán)限模型瞧筛。在底層,Linux內(nèi)核使用用戶和用戶組來(lái)實(shí)施權(quán)限控制导盅,這套權(quán)限是從Linux繼承過(guò)來(lái)的较幌,用于對(duì)文件系統(tǒng)實(shí)體進(jìn)行訪問(wèn)控制,也可以對(duì)其他Android特定資源進(jìn)行控制白翻,稱為Android沙箱乍炉;以DalvikVM和Android框架形式存在的Android運(yùn)行時(shí)實(shí)施了第二套權(quán)限模型,這套模型在用戶安裝應(yīng)用時(shí)是向用戶公開(kāi)的滤馍,定義了應(yīng)用擁有的權(quán)限岛琼,從而限制Android應(yīng)用的能力。第二套權(quán)限模型中的某些權(quán)限直接映射到底層操作系統(tǒng)上的特定用戶巢株、用戶組和權(quán)能(Capability)槐瑞。
Android從其根基Linux繼承了已經(jīng)深入人心的類Unix進(jìn)程隔離機(jī)制與最小權(quán)限原則。具體而言阁苞,進(jìn)程以隔離的用戶環(huán)境運(yùn)行困檩,不能相互干擾,比如發(fā)送信號(hào)或者訪問(wèn)其他進(jìn)程的內(nèi)存空間那槽。因此Android沙箱的核心機(jī)制基于以下幾個(gè)概念:標(biāo)準(zhǔn)的Linux進(jìn)程隔離悼沿、大多數(shù)進(jìn)程擁有唯一的用戶ID,以及嚴(yán)格限制文件系統(tǒng)權(quán)限骚灸。
Android的權(quán)限模型是多方面的显沈,有API權(quán)限、文件系統(tǒng)權(quán)限和IPC權(quán)限逢唤。在很多情況下拉讯,這些權(quán)限都會(huì)交織在一起。
3.深入理解各個(gè)層次
Android應(yīng)用層:Android在與應(yīng)用相關(guān)的多種用途中使用公共密鑰加密算法鳖藕。首先魔慷,Android使用一個(gè)特殊的平臺(tái)密鑰來(lái)簽署預(yù)安裝的應(yīng)用包。使用這個(gè)密鑰簽署的應(yīng)用的特殊之處它們擁有system用戶權(quán)限著恩。其次院尔,第三方應(yīng)用是由個(gè)人開(kāi)發(fā)者生成的密鑰簽名的。對(duì)于預(yù)安裝應(yīng)用和用戶安裝應(yīng)用喉誊,Android都使用簽名機(jī)制來(lái)阻止未經(jīng)授權(quán)的應(yīng)用更新邀摆。
Android框架層:作為應(yīng)用和運(yùn)行時(shí)之間的連接紐帶,Android框架層為開(kāi)發(fā)者提供了執(zhí)行通用任務(wù)的部件——程序包及其類伍茄。這些任務(wù)可能包括管理UI元素栋盹、訪問(wèn)共享數(shù)據(jù)存儲(chǔ),以及在用就組件中傳遞消息等敷矫。也就是說(shuō)例获,框架層中包含任何仍然在DalvikVM中執(zhí)行的非應(yīng)用特定代碼汉额。
DalvikVM:DalvikVM是基于寄存器而不是棧的。DalvikVM擁有大約64000個(gè)寄存器榨汤。不過(guò)通常只會(huì)用到最前16個(gè)蠕搜,偶爾會(huì)用到前256個(gè)。這些寄存器被指定為虛擬機(jī)內(nèi)存的存儲(chǔ)位置收壕,用于模擬微處理器的寄存器功能妓灌。就像實(shí)際的微處理器一樣,DalvikVM在執(zhí)行字節(jié)碼時(shí)蜜宪,使用這些寄存器來(lái)保存運(yùn)行狀態(tài)旬渠,并跟蹤一些值。DalvikVM使用JNI與底層原生代碼進(jìn)行交互端壳。
Android設(shè)備啟動(dòng)時(shí),Zygote進(jìn)程是最先運(yùn)行的進(jìn)程之一枪蘑。接下來(lái)损谦,Zygote負(fù)責(zé)啟動(dòng)其他服務(wù)以及加載Android框架所使用的程序庫(kù)。然后岳颇,Zygote進(jìn)程作為每個(gè)Dalvik進(jìn)程的加載器照捡,通過(guò)復(fù)制自身進(jìn)程副本來(lái)創(chuàng)建進(jìn)程。Zygote的第二大功能是啟動(dòng)system_server進(jìn)程话侧,這個(gè)進(jìn)程容納了所有系統(tǒng)核心服務(wù)栗精,并在system的AID用戶環(huán)境中以特權(quán)權(quán)限運(yùn)行。
用戶空間原生代碼層:程序庫(kù)和核心服務(wù)瞻鹏。
程序庫(kù)是使用原生代碼開(kāi)發(fā)的悲立,因而很容易出現(xiàn)內(nèi)存破壞漏洞。
核心服務(wù)是指建立基本操作系統(tǒng)環(huán)境的服務(wù)與Android原生組件新博。包括初始化用戶空間的服務(wù)(init)薪夕、提供關(guān)鍵調(diào)用功能的服務(wù)(adbd和debuggerd)等。
內(nèi)核:Android分支赫悄、Binder原献、ashmem、peme埂淮、日志記錄器姑隅、Paranoid Networking
4.復(fù)雜的安全性,復(fù)雜的漏洞利用
Android設(shè)計(jì)者堅(jiān)持了最低權(quán)限原則倔撞。進(jìn)程隔離和減少特權(quán)往往是安全系統(tǒng)設(shè)計(jì)中的基石
5.小結(jié)
本章概述了Android安全設(shè)計(jì)和架構(gòu)讲仰。我們引入了Android沙箱及Android使用的權(quán)限模型,包括Android對(duì)Unix系統(tǒng)UID/GID映射關(guān)系的特殊實(shí)現(xiàn)AID叮盘,以及在整個(gè)系統(tǒng)中實(shí)施的限制和權(quán)能秩贰。
我們也深入介紹了Android的邏輯層次,包括應(yīng)用層柔吼、Android框架層毒费、DalvikVM、用戶空間原生代碼和Linux內(nèi)核愈魏。對(duì)于每個(gè)層次觅玻,我們都討論了主要組件,特別是那些與安全相關(guān)的組件培漏。我們強(qiáng)調(diào)了Android開(kāi)發(fā)者對(duì)Linux內(nèi)核所作出的重要添加與修改溪厘。
三、root Android設(shè)備
1.理解分區(qū)布局
分區(qū)是在設(shè)備持久性存儲(chǔ)內(nèi)存中劃分的邏輯存儲(chǔ)單元或分塊牌柄,而布局是指對(duì)分區(qū)制定次序畸悬、偏移和尺寸。最常見(jiàn)的是引導(dǎo)區(qū)珊佣、系統(tǒng)區(qū)蹋宦、數(shù)據(jù)區(qū)、恢復(fù)區(qū)和緩存區(qū)
2.理解引導(dǎo)過(guò)程
引導(dǎo)加載程序通常是在硬件開(kāi)機(jī)之后最早運(yùn)行的代碼咒锻。在大多數(shù)設(shè)備上冷冗,引導(dǎo)加載程序是廠商的私有代碼,負(fù)責(zé)對(duì)一些底層的硬件進(jìn)行初始化惑艇,并為加載恢復(fù)映像或者將手機(jī)設(shè)置成下載模式提供支持蒿辙。
當(dāng)引導(dǎo)加載程序完成硬件初始化之后,它從引導(dǎo)分區(qū)中將Android內(nèi)核和initrd裝載到RAM中滨巴,最后思灌,它將跳進(jìn)內(nèi)核,讓內(nèi)核繼續(xù)啟動(dòng)的過(guò)程恭取。
Android內(nèi)核負(fù)責(zé)處理讓Android系統(tǒng)在設(shè)備上正常運(yùn)行所需的所有任務(wù)习瑰。例如,它會(huì)初始化內(nèi)存秽荤、I/O區(qū)域甜奄、內(nèi)存保護(hù)、中斷處理程序窃款、CPU調(diào)度器和設(shè)備驅(qū)動(dòng)等课兄。最后,它將掛載rot文件系統(tǒng)晨继,并啟動(dòng)最初的用戶空間進(jìn)程:init烟阐。
3.引導(dǎo)加載程序的鎖定與解鎖
一般而言,通過(guò)在引導(dǎo)加載程序?qū)哟紊蠈?shí)現(xiàn)一些限制,對(duì)引導(dǎo)加載程序進(jìn)行鎖定蜒茄,可以防止終端用戶修改設(shè)備固件唉擂。然而對(duì)引導(dǎo)加載程序進(jìn)行解鎖會(huì)帶來(lái)嚴(yán)重的安全隱患。
Android的恢復(fù)系統(tǒng)是以軟件更新包替換設(shè)備預(yù)裝系統(tǒng)軟件的一套Android標(biāo)準(zhǔn)機(jī)制檀葛,這個(gè)過(guò)程不會(huì)擦除用戶數(shù)據(jù)玩祟。
4.對(duì)未加鎖引導(dǎo)加載程序的設(shè)備進(jìn)行root
第一步是解鎖引導(dǎo)加載程序。之后用戶就可以自由地對(duì)設(shè)備進(jìn)行定制修改屿聋】赵可以通過(guò)修改出廠鏡像來(lái)創(chuàng)建定制系統(tǒng)鏡像,或通過(guò)源碼編譯自己的鏡像润讥,然后刷入系統(tǒng)分區(qū)中來(lái)使它第一次转锈。最直接的方法是啟動(dòng)一個(gè)定制的恢復(fù)鏡像。
5.對(duì)鎖定引導(dǎo)加載程序的設(shè)備進(jìn)行root
首先楚殿,確定哪種類型的引導(dǎo)加載程序鎖撮慨。然后啟動(dòng)一個(gè)未能通過(guò)簽名驗(yàn)證的分區(qū)。
如果不允許啟動(dòng)未能通過(guò)簽名難的分區(qū)脆粥,可以通過(guò)以下方法:通過(guò)安全漏洞獲得一個(gè)root shell砌溺;利用以root權(quán)限運(yùn)行進(jìn)程中的安全漏洞;利用adbd來(lái)獲取root權(quán)限冠绢。
對(duì)開(kāi)啟NAND鎖的設(shè)備進(jìn)行永久性root,必須完成以下兩件事中的一件常潮,一是禁用基帶上的安全標(biāo)志位弟胀;二是將設(shè)備刷上一個(gè)不會(huì)實(shí)施NAND鎖的打補(bǔ)丁的HBOOT或工程HBOOT。
對(duì)軟root持久化:在沒(méi)有開(kāi)啟NAND鎖的手機(jī)上喊式,只需對(duì)系統(tǒng)分區(qū)的寫權(quán)限孵户。如果手機(jī)有NAND鎖,那么首先移除掉它岔留,然后以讀寫模式重新掛載系統(tǒng)分區(qū)夏哭,旋轉(zhuǎn)一個(gè)設(shè)置set-uid root權(quán)限的su二進(jìn)制程序,然后再次以只讀模式掛載献联。另一種方法是將定制恢復(fù)鏡像寫入恢復(fù)分區(qū)中竖配。
6.歷史上的一些已知攻擊
內(nèi)核:Wunderbar/asroot、恢復(fù):Volez里逆、udev:Exploid进胯、adbd:RageAgainstTheCage、Zygote:Zimperlich和Zysploit原押、ashmem:KilingInTheNameOf和psneuter胁镐、vold:GingerBreak、PowerVR:levitator、libsysutils:zergRush盯漂、內(nèi)核:mempodroid颇玷、文件權(quán)限和符號(hào)鏈接相關(guān)的攻擊、adb恢復(fù)過(guò)程競(jìng)爭(zhēng)條件漏洞就缆、Exynos4:exynos-abuse帖渠、Diag:lit/diaggetroot
7.小結(jié)
對(duì)Android設(shè)備進(jìn)行root,可以讓你獲得Android設(shè)備的完全控制违崇。然而阿弃,如果你不采取任何預(yù)防措施來(lái)修補(bǔ)獲得root高總權(quán)限的開(kāi)放通道,那么系統(tǒng)安全可以輕易地被攻擊者損害羞延。
本意介紹了理解root過(guò)程的關(guān)鍵要信渣淳,包括通過(guò)合法的引導(dǎo)加載程序解鎖的方法,如在那些引導(dǎo)加載程序未加鎖設(shè)備上的方法伴箩,以及允許在一個(gè)引導(dǎo)加載程序已加鎖設(shè)備上獲取和持久化root訪問(wèn)的其他方法入愧。最后,你看到了在過(guò)去幾年里用來(lái)root許多Android設(shè)備的知名root提權(quán)利用程序嗤谚。
四棺蛛、應(yīng)用安全性評(píng)估
1.普遍性安全問(wèn)題
應(yīng)用權(quán)限問(wèn)題、敏感數(shù)據(jù)的不安全傳輸巩步、不安全的數(shù)據(jù)存儲(chǔ)旁赊、通過(guò)日志的信息泄露、不安全的IPC端點(diǎn)
2.案例分析:移動(dòng)安全應(yīng)用
初步剖析:收集目標(biāo)應(yīng)用的一些粗略信息椅野。首先终畅,對(duì)這個(gè)應(yīng)用的目標(biāo)、開(kāi)發(fā)者、開(kāi)發(fā)歷史或評(píng)論進(jìn)行大致的了解,基于應(yīng)用的描述和所列出的申請(qǐng)權(quán)限嘁傀,可以得出一些結(jié)論帽揪。
名勝古跡分析:在不直接運(yùn)行應(yīng)用的情況下,分析應(yīng)用及其支持組件中的代碼和數(shù)據(jù)。首先可以識(shí)別應(yīng)用中的一些有趣字符串,如硬編碼URI、認(rèn)證你生氣或密鑰絮识。接著可以演講進(jìn)行其他一些分析以構(gòu)建調(diào)用圖、確定應(yīng)用邏輯和程序流程嗽上,以及發(fā)現(xiàn)潛在的安全問(wèn)題笋除。
動(dòng)態(tài)分析:在插樁或最接近的方式下運(yùn)行應(yīng)用,以獲取關(guān)于應(yīng)用行為更具體的信息
攻擊
3.案例分析:SIP客戶端
了解Drozer
發(fā)現(xiàn)漏洞
snarfing
注入
4.小結(jié)
本章概述了影響Android應(yīng)用的一般安全問(wèn)題炸裆。對(duì)于每類安全問(wèn)題垃它,本章都展示了一個(gè)公開(kāi)安全來(lái)幫助聚集所帶來(lái)的潛在影響。你也隨著我們對(duì)兩個(gè)公開(kāi)Android應(yīng)用進(jìn)行了案例分析,每個(gè)案例分析都非常詳細(xì)地說(shuō)明了如何使用通過(guò)工具來(lái)評(píng)估應(yīng)用国拇,挖掘安全漏洞洛史,并利用這些漏洞。
第一個(gè)案例分析使用Androguard來(lái)對(duì)目標(biāo)應(yīng)用執(zhí)行靜態(tài)分析酱吝、反匯編和反編譯也殖。在完成這些之后,你識(shí)別出了可以攻擊的安全相關(guān)組件务热,具體而言忆嗜,你找到一個(gè)使用短信進(jìn)行授權(quán)的設(shè)備加鎖/解鎖功能。接下來(lái)崎岂,你使用了動(dòng)態(tài)分析技術(shù)(如對(duì)應(yīng)用進(jìn)行調(diào)試)來(lái)擴(kuò)大和確認(rèn)靜態(tài)分析的發(fā)現(xiàn)捆毫。最后,你編寫了一些要信難攻擊代碼來(lái)偽造一條短信冲甘,并攻破應(yīng)用的設(shè)備解鎖功能绩卤。
第二個(gè)案例分析演示了使用Drozer在應(yīng)用中找出與Content Provider相關(guān)數(shù)據(jù)暴露問(wèn)題的快捷簡(jiǎn)單的方法。首先江醇,你發(fā)現(xiàn)了應(yīng)用暴露出一些用戶Activity和第三消息日志濒憋,然后,你看到了對(duì)存儲(chǔ)數(shù)據(jù)的篡改是多么簡(jiǎn)單陶夜。最后凛驮,案例分析討論了利用SQL注入安全漏洞從應(yīng)用數(shù)據(jù)庫(kù)中獲取其他第三數(shù)據(jù)的細(xì)節(jié)。
五条辟、理解Android的攻擊面
1.攻擊基礎(chǔ)術(shù)語(yǔ)
攻擊向量通常指的是攻擊者實(shí)施先去的方式黔夭,描述了用來(lái)執(zhí)行攻擊的方法。
攻擊面普遍被理解為目標(biāo)的“軟肋”捂贿,也就是使得目標(biāo)易受攻擊的功能特性纠修。簡(jiǎn)單來(lái)講胳嘲,它描述了代碼中可能存在著尚待挖掘的安全漏洞的位置厂僧。
2.對(duì)攻擊面進(jìn)行分類
攻擊面屬性:攻擊向量、獲取的權(quán)限了牛、內(nèi)存安全性颜屠、復(fù)雜性。
分類決策鹰祸。
3.遠(yuǎn)程攻擊面
網(wǎng)絡(luò)概念甫窟、網(wǎng)絡(luò)協(xié)議棧、暴露的網(wǎng)絡(luò)服務(wù)蛙婴、移動(dòng)技術(shù)粗井、客戶端攻擊面、谷歌的基礎(chǔ)設(shè)施
4.物理相鄰
無(wú)線通信、其他技術(shù)
5.本地攻擊面
探索文件系統(tǒng)浇衬、找到其他的本地攻擊面(系統(tǒng)調(diào)用懒构、套接字、Binder耘擂、共享內(nèi)存胆剧、基帶接口、攻擊硬件支持的服務(wù))
6.物理攻擊面
拆解設(shè)備醉冤、USB秩霍、其他物理攻擊面
7.第三方修改
8.小結(jié)
本章探索了Android設(shè)備可能被攻擊的所有不同途徑,討論了如何根據(jù)可應(yīng)用的攻擊向量和攻擊面的不同屬性對(duì)研究工作進(jìn)行優(yōu)先級(jí)排序蚁阳。
通過(guò)根據(jù)訪問(wèn)復(fù)雜性將Android的攻擊面分成4個(gè)高層分類铃绒,本章分別深入到每種攻擊面的底層細(xì)節(jié)中,涉及了不同類型的相鄰條件對(duì)可用攻擊方法的影響韵吨。
本章也討論了一些已知的攻擊方法匿垄,并介紹了一些可用來(lái)進(jìn)一步探索Android攻擊面的工具和技術(shù)。特別是归粉,你學(xué)到了如何識(shí)別Android設(shè)備上暴露的端點(diǎn)椿疗,如網(wǎng)絡(luò)服務(wù)、本地IPC功能和USB接口等糠悼。
由于Android代碼規(guī)模龐大届榄,本章不可能詳盡地分析Android的整個(gè)攻擊面,因此我們鼓勵(lì)你應(yīng)用并擴(kuò)展本章展示的技術(shù)方法進(jìn)一些探索倔喂。
六铝条、使用模糊測(cè)試來(lái)挖掘漏洞
模糊測(cè)試(fuzz testing),或稱fuzzing席噩,是一種通過(guò)構(gòu)造畸形輸入班缰,來(lái)測(cè)試軟件輸入驗(yàn)證方法。
1.模糊測(cè)試的背景
選定目標(biāo)
構(gòu)造畸形輸入:非智能模糊測(cè)試(dumb-fuzzing)悼枢、智能模糊測(cè)試(smart-fuzzing)
處理輸入:將輸入交給目標(biāo)軟件去處理
監(jiān)控結(jié)果
2.Android上的模糊測(cè)試
3.對(duì)Broadcast Receiver進(jìn)行模糊測(cè)試
選定目標(biāo):首先埠忘,找到某款應(yīng)用或整個(gè)系統(tǒng)中哪些Broadcast Receiver已經(jīng)被注冊(cè)
生成輸入:構(gòu)造一個(gè)不包含其他任何屬性(extras、flag馒索、和URI等)的顯式Intent對(duì)象莹妒。
傳遞輸入:調(diào)用sendBroadcast方法并傳入Intent對(duì)象
監(jiān)控測(cè)試:使用logcat來(lái)判斷應(yīng)用是否崩潰。
4.對(duì)Android上的Chrome進(jìn)行模糊測(cè)試
選擇一種技術(shù)作為目標(biāo):H5的類型數(shù)組
生成輸入:首先绰上,將最短的觸發(fā)代碼拆分成兩個(gè)獨(dú)立數(shù)組的創(chuàng)建語(yǔ)句旨怠;然后,根據(jù)規(guī)范構(gòu)造一個(gè)類型數(shù)組類型列表蜈块。
處理輸入:BrowserFuzz使用HTTP協(xié)議來(lái)傳遞輸入鉴腻,用Twisted這個(gè)Python框架構(gòu)造一個(gè)初級(jí)的HTTP服務(wù)器來(lái)傳遞輸入迷扇,然后操縱瀏覽器去不斷地加載相應(yīng)URL的頁(yè)面。
監(jiān)控測(cè)試:先清空系統(tǒng)日志爽哎,然后打開(kāi)瀏覽器訪問(wèn)HTTP服務(wù)器谋梭,給瀏覽器留一些時(shí)間來(lái)處理生成的輸入,最后檢查日志內(nèi)容倦青。
5.對(duì)USB攻擊面進(jìn)行模糊測(cè)試
對(duì)USB進(jìn)行模糊測(cè)試的挑戰(zhàn)瓮床、選定目標(biāo)模式、生成輸入产镐、處理輸入隘庄、監(jiān)控測(cè)試
6.小結(jié)
本章提供了在Android上進(jìn)行模糊測(cè)試所需的所有信息,從高層面上介紹了模糊測(cè)試的4個(gè)步驟癣亚,即選定目標(biāo)丑掺、生成測(cè)試輸入、處理輸入和監(jiān)控異常行為述雾。本章還介紹了對(duì)Android進(jìn)行模糊測(cè)試有哪些優(yōu)勢(shì)和挑戰(zhàn)街州。
本章完成了3個(gè)模糊測(cè)試工具的深入討論,前兩個(gè)是專門為本章設(shè)計(jì)的玻孟,最后一個(gè)是將公開(kāi)的工具遷移到Android設(shè)備上唆缴。每個(gè)例子中,模糊測(cè)試工具都能找到底層代碼中的問(wèn)題黍翎,這也能說(shuō)明模糊測(cè)試是一種發(fā)現(xiàn)Android設(shè)備中bug和安全漏洞的有效手段面徽。
七、調(diào)試與分析安全漏洞
1.獲取所有信息
包括文檔匣掸、源代碼趟紊、二進(jìn)制文件、符號(hào)文件以及可用的工具等碰酝。
2.選擇一套工具鏈
工具鏈(toolchain)就是開(kāi)發(fā)產(chǎn)品所用到的一系列工具霎匈。通常,一套工具鏈包含編譯器送爸、連接器铛嘱、調(diào)試器,以及任何必要的系統(tǒng)庫(kù)碱璃。推薦使用與廠商相同的工具鏈弄痹。
3.調(diào)試崩潰Dump
系統(tǒng)日志饭入、Tombstone
4.遠(yuǎn)程調(diào)試
遠(yuǎn)程調(diào)試是在Android平臺(tái)上調(diào)試的首選方法嵌器。
5.調(diào)試Dalvik代碼
6.調(diào)試原生代碼
使用Android原生開(kāi)發(fā)工具包(NDK)來(lái)調(diào)試編譯在應(yīng)用內(nèi)部的自定義原生代碼;使用AS調(diào)試原生代碼谐丢;使用AOSP在Nexus設(shè)備上調(diào)試Android瀏覽器爽航;使用AOSP實(shí)現(xiàn)完全源代碼級(jí)別的交互式調(diào)試蚓让;調(diào)試運(yùn)行在非Nexus設(shè)備上的原生代碼。
7.調(diào)試混合代碼
8.其他調(diào)試技術(shù)
調(diào)試語(yǔ)句讥珍、在設(shè)備上進(jìn)行調(diào)試历极、動(dòng)態(tài)二進(jìn)制注入
9.漏洞分析
明確問(wèn)題根源、判斷漏洞可利用性
10.小結(jié)
在本章中衷佃,我們學(xué)習(xí)了Android平臺(tái)上調(diào)試和漏洞分析技術(shù)趟卸。本章包含了大師Dalvik和原生代碼的調(diào)試技術(shù),包括如何使用覺(jué)的調(diào)試工具氏义,如何利用自動(dòng)化來(lái)提高效率锄列,如何使用AOSP支持的設(shè)備來(lái)進(jìn)行源代碼級(jí)別的調(diào)試,以及如何通過(guò)直接在真機(jī)上調(diào)試來(lái)提高性能惯悠。我們解釋了為什么符號(hào)在ARM平臺(tái)上更加重要邻邮,說(shuō)明了在非AOSP設(shè)備上調(diào)試所面臨的困難,并提供了解決這些問(wèn)題的應(yīng)對(duì)方案克婶。
本章的最后討論了漏洞分析的兩個(gè)主要目標(biāo):分析漏洞產(chǎn)生的根源和判斷漏洞的可自用性筒严。為讀者介紹了一些漏洞分析的覺(jué)工具和技術(shù),以便深入理解漏洞情萤。還帶領(lǐng)讀者分析了Android瀏覽器一個(gè)漏洞的成因鸭蛙,教會(huì)讀者在判斷漏洞可利用性方面應(yīng)該怎樣進(jìn)行都是。
八筋岛、用戶態(tài)軟件的漏洞利用
1.內(nèi)存破壞漏洞基礎(chǔ)
棧緩沖區(qū)溢出规惰、堆的漏洞利用
2.公開(kāi)的漏洞利用
GingerBreak、zergRush泉蝌、Mempodroid
3.Android瀏覽器漏洞利用
4.小結(jié)
本章討論了ARM平臺(tái)上用戶空間的一系列內(nèi)存破壞漏洞利用技術(shù)歇万,詳細(xì)介紹了棧和堆內(nèi)存相關(guān)的實(shí)現(xiàn)細(xì)節(jié)和利用技術(shù)。盡管討論的內(nèi)容沒(méi)有覆蓋所有可能出現(xiàn)的漏洞類型或利用技術(shù)勋陪,但是為漏洞利用開(kāi)發(fā)提供了思路贪磺。
基于堆的內(nèi)存破壞攻擊與應(yīng)用本身以及分配器十分相關(guān),是目前最常見(jiàn)的漏洞類型诅愚。釋放后我不用漏洞可以讓攻擊者使用新分配內(nèi)存塊來(lái)我不用已經(jīng)釋放的內(nèi)存塊寒锚,相當(dāng)于引入了別名引用bug。我們以Android的原生分配器dlmalloc和WebKit特定分配器RenderArena為例违孝,討論了這種情形刹前。虛函數(shù)表為堆破壞漏洞提供了一種劫持原生代碼執(zhí)行流的方式。
通過(guò)考察一些已經(jīng)公開(kāi)的真實(shí)漏洞利用雌桑,可以發(fā)現(xiàn)簡(jiǎn)單的思路能讓利用更穩(wěn)定喇喉,并降低開(kāi)發(fā)成本。GingerBreak利用展示了如何利用數(shù)組下標(biāo)漏洞來(lái)修改GOT校坑。zergRush利用是Android系統(tǒng)上棧破壞利用以及繞過(guò)棧cookie保護(hù)的一個(gè)突出例子拣技。Mempodroid則展示了一種非傳統(tǒng)的技術(shù)千诬,利用內(nèi)核漏洞獲得權(quán)限提升。
最后膏斤,本章介紹了幾種思路徐绑,用來(lái)利用Webkit渲染引擎中公開(kāi)且已修復(fù)的釋放后重用漏洞,解釋了編寫JavaScript來(lái)控制堆的關(guān)鍵步驟莫辨。
九傲茄、ROP漏洞利用技術(shù)
1.歷史和動(dòng)機(jī)
ROP(Return Oriented Programming)是一種利用內(nèi)存中現(xiàn)有原生代碼作為攻擊載荷,而不是注入自定義指令載荷(即shellcode)的漏洞利用方法沮榜。
使用ROP的原因有三:XN保護(hù)技術(shù)烫幕、ARM架構(gòu)中數(shù)據(jù)和指令緩存的分享機(jī)制、某些ARM平臺(tái)上操作系統(tǒng)加載器會(huì)執(zhí)行“代碼簽名”
2.ARM架構(gòu)下的ROP基礎(chǔ)
ROP不僅可以使用整個(gè)函數(shù)敞映,還可以使用程序中的小塊代碼片段较曼,稱為gadget。為了維持對(duì)程序計(jì)數(shù)器的控制振愿,這些gadget通常以函數(shù)返回指令為結(jié)尾捷犹。攻擊者可以選取一系列g(shù)adget,來(lái)組合成他們想要的載荷冕末。
3.案例分析:Android 4.0.1鏈接器
遷移棧指針萍歉、在新映射內(nèi)存中執(zhí)行任意代碼
4.小結(jié)
通過(guò)閱讀本章,可以了解到為何以及如何在ARM平臺(tái)上使用ROP技術(shù)档桃,來(lái)獲得任意原生代碼的執(zhí)行枪孩。在最近的Android系統(tǒng)版本中,使用ROP的主要原因是XN保護(hù)的開(kāi)啟藻肄,它讓攻擊者無(wú)法直接執(zhí)行普通內(nèi)存中的數(shù)據(jù)蔑舞。即使沒(méi)有開(kāi)啟XN保護(hù),ROP也可以用來(lái)解決ARM架構(gòu)下指令和數(shù)據(jù)緩存分享的問(wèn)題嘹屯。
基于lr的返回指令導(dǎo)致ROP難度加大攻询;但是由于有pop(pc)這樣的gadget,一般基于棧的ROP依然可選州弟。即使是以bxlr指令結(jié)尾的gadget也可以利用钧栖,只要聰明地將lr指向pop(pc)指令即可。把ARM指令混淆解析成Thumb的pop(,,,婆翔,pc)指令給我們帶來(lái)了更多的gadget拯杠。ARM的執(zhí)行模式可以通過(guò)Interworking機(jī)制支持來(lái)實(shí)現(xiàn),即設(shè)置gadget地址的最低位就可以切換到thumb模式啃奴。在ARM這樣的RISC架構(gòu)中潭陪,搜索gadget是非常容易的,它們都采用長(zhǎng)度固定的指令編碼方式纺腊,用反匯編器生成的反匯編列表就能實(shí)現(xiàn)畔咧。
本章深入介紹了從Android動(dòng)態(tài)鏈接器構(gòu)建ROP鏈的案例。在Android4.0和更早的版本中揖膜,鏈接器基址是固定的誓沸,所以無(wú)需信息泄露就能夠構(gòu)造ROP鏈。動(dòng)態(tài)鏈接器必須出現(xiàn)在所有動(dòng)態(tài)鏈接的二進(jìn)制程序中(包括Android中默認(rèn)編譯產(chǎn)生的幾乎所有二進(jìn)制文件)壹粟,因此拜隧,它會(huì)成為很多攻擊者的目標(biāo)。
十趁仙、攻擊內(nèi)核
1.Android的Linux內(nèi)核
2.內(nèi)核提取
從出廠固件中提取內(nèi)核洪添、從設(shè)備中提取內(nèi)核、從啟動(dòng)鏡像中提取內(nèi)核雀费、解壓內(nèi)核
3.運(yùn)行自定義內(nèi)核代碼
獲取源代碼干奢、搭建編譯環(huán)境、配置內(nèi)核盏袄、使用自定義內(nèi)核模塊忿峻、編譯自定義內(nèi)核、制作引導(dǎo)鏡像辕羽、引導(dǎo)自定義內(nèi)核
4.調(diào)試內(nèi)核
獲取內(nèi)核崩潰報(bào)告逛尚、理解Oops信息 、使用KGDB進(jìn)行Live調(diào)試
5.內(nèi)核涮利用
典型Android內(nèi)核刁愿、 獲取地址绰寞、案例分析
6.小結(jié)
本章介紹了關(guān)于攻擊Android設(shè)備Linux內(nèi)核的一些主題。由于采用單內(nèi)核設(shè)計(jì)和分發(fā)配置方式铣口,并且暴露了較大的攻擊面滤钱,所以Android內(nèi)核漏洞利用相對(duì)簡(jiǎn)單。
除此之外脑题,本章還給Android內(nèi)核利用程序開(kāi)發(fā)者提供了一些工具和建議菩暗,讓利用開(kāi)發(fā)變得更加簡(jiǎn)單。本章涵蓋編譯自定義內(nèi)核和模塊的整個(gè)過(guò)程旭蠕,展示了如何使用內(nèi)核提供的各種調(diào)試工具停团,以及如何從設(shè)備和原廠固件鏡像中提取信息。
本章的幾個(gè)安全教你如何針對(duì)內(nèi)核內(nèi)存破壞漏洞才曉得利用程序開(kāi)發(fā)掏熬。這些漏洞包括數(shù)組越界佑稠、直接內(nèi)存映射、信息泄露和堆破壞等旗芬。
十一舌胶、攻擊RIL無(wú)線接口層
1.RIL層簡(jiǎn)介
Android中的RIL是移動(dòng)通信硬件接口與Android電話服務(wù)子系統(tǒng)之間的一個(gè)抽象層。它支持2g疮丛、3g幔嫂、4g等所有類型的移動(dòng)網(wǎng)絡(luò)辆它,處理移動(dòng)通信中所有具體的業(yè)務(wù),包括網(wǎng)絡(luò)注冊(cè)履恩、語(yǔ)音通話锰茉、短信(SMS)、分組數(shù)據(jù)(IP通信)等切心。
RIL是Android中極少數(shù)可以直接從外界接觸到的代碼之一飒筑。它的攻擊面類似于服務(wù)器上部署的網(wǎng)絡(luò)服務(wù),從移動(dòng)網(wǎng)絡(luò)發(fā)送到Android設(shè)備的所有數(shù)據(jù)都會(huì)經(jīng)過(guò)設(shè)備中的RIL绽昏。最好的例子就是短信接收處理過(guò)程协屡。
當(dāng)短信發(fā)送至Android手機(jī)時(shí),會(huì)由手機(jī)中的蜂窩調(diào)制解調(diào)器接收全谤。蜂窩調(diào)制解調(diào)器從基站接收物理數(shù)據(jù)并解碼肤晓,然后將解碼后的消息傳給Linux內(nèi)核。這條消息會(huì)經(jīng)過(guò)Android RIL的各個(gè)組件认然,最終抵達(dá)負(fù)責(zé)短信收發(fā)的應(yīng)用程序材原。
RIL架構(gòu)、智能手機(jī)架構(gòu)季眷、Android電話棧余蟹、對(duì)電話棧的定制、RIL守護(hù)程序子刮、用于vendor-ril的API
2.短信服務(wù)
SMS消息的收發(fā)威酒、SMS消息格式
3.與調(diào)制解調(diào)器的進(jìn)行交互
模擬調(diào)制解調(diào)器用于模糊測(cè)試、在Android中對(duì)SMS進(jìn)行模糊測(cè)試
4.小結(jié)
本章介紹了許多關(guān)于Android電話棧的知識(shí)挺峡,尤其是RIL葵孤。我們簡(jiǎn)單了解了RIL的功能以及硬件制造商將蜂窩通信硬件與Android框架相集成的必要工作,并進(jìn)一步探索了如何監(jiān)控Android RIL與蜂窩調(diào)制解調(diào)器之間的通信橱赠。
本章后半部分講述了如何對(duì)Android設(shè)備的SMS消息子系統(tǒng)進(jìn)行模糊測(cè)試尤仍,其中包含關(guān)于SMS消息格式的知識(shí),以及如何構(gòu)建SMS消息的模糊生成器狭姨。本章還介紹了如何使用ADB來(lái)監(jiān)控Android電話棧的崩潰情況宰啦。有了這些知識(shí),就可以開(kāi)始對(duì)Android的RIL子系統(tǒng)進(jìn)行自己的攻擊實(shí)驗(yàn)了饼拍。
十二赡模、漏洞利用緩解技術(shù)
1.緩解技術(shù)的分類
2.代碼簽名
代碼簽名是一種通過(guò)難密碼學(xué)簽名來(lái)防止未授權(quán)代碼運(yùn)行的機(jī)制。
3.加固堆緩沖區(qū)
4.防止整數(shù)溢出
5.阻止數(shù)據(jù)執(zhí)行
6.地址空間布局隨機(jī)化
7.保護(hù)棧
8.保護(hù)格式化字符串
9.只讀重定位表
10.沙盒
11.增強(qiáng)源代碼
12.訪問(wèn)控制機(jī)制
13.保護(hù)內(nèi)核
14.其他加固措施
15.漏洞利用緩解技術(shù)總結(jié)
16.禁用緩解機(jī)制
更改personality师抄、修改二進(jìn)制文件漓柑、調(diào)整內(nèi)核
17.對(duì)抗緩解技術(shù)
對(duì)抗棧保護(hù)、對(duì)抗ASLR、對(duì)抗數(shù)據(jù)執(zhí)行保護(hù)辆布、對(duì)抗內(nèi)核級(jí)保護(hù)機(jī)制
18.展望未來(lái)
進(jìn)行中的官方項(xiàng)目瞬矩、社區(qū)的內(nèi)核加固工作、一些預(yù)測(cè)
19.小結(jié)
本章介紹了漏洞利用緩解技術(shù)的概念以及在Android系統(tǒng)上的使用方法锋玲,然后解釋了實(shí)現(xiàn)這些緩解技術(shù)需要改動(dòng)硬件景用、Linux內(nèi)核、Bionic C庫(kù)嫩絮、編譯工具鏈等組件丛肢。對(duì)于每種緩解技術(shù)围肥,都介紹了其背景情況剿干、實(shí)現(xiàn)效果以及Android采用的歷史。還給出了一個(gè)總結(jié)表格穆刻,詳細(xì)列舉了Android支持這些緩解技術(shù)的歷史發(fā)展置尔。接下來(lái),介紹了如何有意禁用這些利用緩解機(jī)制氢伟,以及如何進(jìn)行對(duì)抗榜轿。最后,對(duì)Android上漏洞緩解技術(shù)的未來(lái)作出了展望朵锣。
十三谬盐、硬件層的攻擊
1.設(shè)備的硬件接口
UART串行接口、I2C诚些、SPI和單總線接口飞傀、JTAG、尋找調(diào)試接口
2.識(shí)別組件
獲得規(guī)格說(shuō)明書诬烹、難以識(shí)別的組件
3.攔截砸烦、監(jiān)聽(tīng)和劫持?jǐn)?shù)據(jù)
USB、I2C绞吁、SPI和UART
4.竊取機(jī)密和固件
無(wú)損地獲取固件幢痘、有損地獲取固件、拿到dump文件后怎么做家破、
5.陷阱
定制的接口颜说、二進(jìn)制私有數(shù)據(jù)格式、熔斷調(diào)試接口汰聋、芯片密碼脑沿、bootloader密碼和熱鍵和啞終端、已定制的引導(dǎo)過(guò)程马僻、未暴露的地址線庄拇、防止逆向的環(huán)氧樹(shù)脂、鏡像加密和混淆和反調(diào)試
6.小結(jié)
本章旨在帶領(lǐng)沒(méi)有任何相關(guān)經(jīng)驗(yàn)的讀者了解如何通過(guò)物理訪問(wèn)來(lái)攻擊Android設(shè)備這樣的嵌入式硬件。我們介紹了嵌入式設(shè)備中經(jīng)常暴露出來(lái)的各類接口措近,包括UART溶弟、JTAG、I2C瞭郑、SPI辜御、USB和SD卡。接下來(lái)屈张,介紹了如何識(shí)別這些接口并與其進(jìn)行通信擒权。通過(guò)這些接口,研究人員可以對(duì)目標(biāo)設(shè)備有更深的理解阁谆。
對(duì)硬件進(jìn)行物理攻擊的一個(gè)主要目標(biāo)是進(jìn)一步發(fā)現(xiàn)碳抄、設(shè)計(jì)和實(shí)現(xiàn)不需要物理接觸的攻擊。我們介紹了如何借助一系列商業(yè)工具和免費(fèi)工具场绿,通過(guò)訪問(wèn)這些接口來(lái)讀取設(shè)備中的固件剖效。對(duì)固件進(jìn)行逆向和深入分析可以了解設(shè)備的工作運(yùn)轉(zhuǎn)原理,進(jìn)而有可能找出其中存在的嚴(yán)重漏洞焰盗。
最后璧尸,討論了在實(shí)踐中使用這些工具和技術(shù)可能遇到的各類陷阱,以及其中一些問(wèn)題的應(yīng)對(duì)之道熬拒。
附錄A 工具
開(kāi)發(fā)工具:Android SDK爷光、Android NDK、Eclipse澎粟、ADT插件蛀序、ADT軟件包、Android Studio
固件提取和刷機(jī)工具:Binwalk捌议、fastboot哼拔、三星(ODIN、Kies瓣颅、Heimdall)倦逐、NVIDIA(nvflash)、LG(LGBinExtractor宫补、LG Mobile Support工具)檬姥、HTC(unruu、runveal)粉怕、摩托羅拉(RSD Lite健民、sbf_flash、SBF-ReCalc)
Android原生工具:BusyBox贫贝、setpropex秉犹、SQLite蛉谜、strace
Hook和代碼改寫工具:ADBI框架、Idpreloadhook崇堵、Xposed框架型诚、Cydia Substrate
靜態(tài)分析工具:Smali和Baksmali、Androguard鸳劳、apktool狰贯、dex2jar、jad赏廓、JD-GUI涵紊、JEB、Radare2幔摸、IDA Pro和Hex-Rays Decompiler
應(yīng)用程序測(cè)試工具:Drozer(Mercury)框架摸柄、iSec Intent Sniffer和Intent Fuzzer
硬件安全工具:Segger J-Link、JTAGulator抚太、OpenOCD塘幅、Saleae昔案、Bus Pirate尿贫、GoodFET、Total Phase Beagle USB踏揣、Facedancer21庆亡、Total Phase Beagle I2C、Chip Quik捞稿、熱風(fēng)槍又谋、Xeltek SuperPro、IDA
附錄B 開(kāi)源代碼庫(kù)
谷歌:AOSP娱局、Gerrit源代碼審計(jì)
SoC廠商:全志彰亥、英特爾、美滿衰齐、聯(lián)發(fā)科任斋、英偉達(dá)、德州儀器耻涛、高通废酷、三星
OEM:華碩、HTC抹缕、LG澈蟆、摩托羅拉、三星卓研、索尼
上游代碼源
其他源代碼:定制化固件趴俘、Linaro、Replicant、代碼索引寥闪、個(gè)人代碼庫(kù)