Android安全研究经验谈
安全研究做什么
從攻擊角度舉例,可以是:對某個模塊進(jìn)行漏洞挖掘的方法,對某個漏洞進(jìn)行利用的技術(shù),通過逆向工程破解程序、解密數(shù)據(jù),對系統(tǒng)或應(yīng)用進(jìn)行感染、劫持等破壞安全性的攻擊技術(shù)等。
而防御上則是:查殺惡意應(yīng)用的方法,檢測和防范漏洞利用,為增強系統(tǒng)和第三方應(yīng)用的安全性提供解決方案等。
當(dāng)然,通常情況下攻與防的概念是相對模糊的,一種安全技術(shù)往往在攻防兩端都適用,也許更值得留意的是一種技術(shù)背后的思路和意識。研究員需要在新技術(shù)上傾注靈感,并且付出相當(dāng)程度的汗水,才能換來某種成果——通過艱難的探索過程最終獲得極大的成就感。我也經(jīng)常在當(dāng)Android adb shell中的$變成#時激動得大呼小叫(終端程序從一般用戶提升到root用戶),因為在此之前往往已經(jīng)歷了一個復(fù)雜的漏洞分析和利用過程。
需要具備的知識
在正式開始安全研究前,首先要掌握一定知識和技能。安全涉及的知識范疇是無限的,但大多數(shù)時候可以遇到問題再去了解相關(guān)的知識,不過以下內(nèi)容是我認(rèn)為應(yīng)該提前掌握的。?
【要掌握的理論知識】
主要是操作系統(tǒng)原理。這是非常重要的知識,是認(rèn)識某一個具體系統(tǒng)的前提。雖然大學(xué)教材多以Linux內(nèi)核為案例進(jìn)行教學(xué),但微軟開源的Windows Reserch Kernel(簡稱WRK)同樣也是非常棒的學(xué)習(xí)資料。比起單純閱讀源碼和分析文章,自己動手編譯系統(tǒng)內(nèi)核,用調(diào)試器一步步調(diào)試內(nèi)核更有幫助。最后還可以嘗試自己編寫內(nèi)核驅(qū)動模塊或分析已有的內(nèi)核Rootkit來深入理解操作系統(tǒng)。我在大學(xué)里有很長一段時間在分析WRK,了解包括系統(tǒng)引導(dǎo)、內(nèi)存管理、進(jìn)程管理、線程調(diào)度、文件系統(tǒng)、網(wǎng)絡(luò)驅(qū)動等內(nèi)容,對我一直非常有幫助。鑒于嵌入式平臺的開發(fā)和調(diào)試都有一定限制和不便,我不大建議一開始就在手機設(shè)備上研究操作系統(tǒng)內(nèi)核,在PC上完成這部分知識儲備會更方便。
就移動平臺而言,理解操作系統(tǒng)有助于我們進(jìn)一步理解Android系統(tǒng)本身,而在理解Android系統(tǒng)之后,才能開始討論Android系統(tǒng)的安全問題,這是一個循序漸進(jìn)的過程。
【幾門需要掌握的語言】
研究員不需要特別強的軟件開發(fā)能力,需要關(guān)注的是某種語言的內(nèi)部實現(xiàn)過程。掌握C/C++,能理解該語言被編譯器處理后匯編層面的實現(xiàn)原理。了解Java,需要理解Dalvik/ART虛擬機內(nèi)部的實現(xiàn)過程。對于x86/ARM匯編,能讀懂即可,遇到不認(rèn)識的指令能從指令集手冊中找到答案。
另外,還需要掌握一門腳本語言,主要用來快速編寫小工具或者POC,我推薦Python,因為開源社區(qū)中大部分Android安全分析類工具都是用Python編寫的,例如知名的Androguard和Drozer。
【逆向工程】
逆向工程絕對是一項必備技能。無論是分析惡意軟件行為還是分析閉源軟件漏洞,都需要逆向工程。但更重要的是,逆向工程能讓我們從閉源程序中汲取營養(yǎng),加快理解系統(tǒng)的速度。在對這類程序進(jìn)行反匯編、調(diào)試的過程中,也會加深對操作系統(tǒng)、程序語言內(nèi)部實現(xiàn)的理解,將上述知識串聯(lián)起來。
神奇小子Geohot不久前利用CVE–2014–3153開發(fā)出了Android 4.4 Root通殺工具Towelroot,大多數(shù)人都不明白這個漏洞復(fù)雜的利用方法,但我通過對Towelroot逆向工程,第一時間理解了該漏洞利用的幾項關(guān)鍵技術(shù)(Towelroot加入了大量混淆指令來反逆向工程,因而難度頗高)。也許我們不是天才,但逆向工程能讓我們時不時地跟上天才的步伐。
理解Android系統(tǒng)
Android源碼非常龐大,即便只看系統(tǒng)組件,恐怕也要好幾年。更何況其源碼并不是Android手機的全部,還有Linux內(nèi)核、基帶、bootloader、TrustZone等底層模塊等待我們探索。我們只需了解支撐Android系統(tǒng)運轉(zhuǎn)的核心服務(wù),以及Android系統(tǒng)的安全機制設(shè)計即可,其余內(nèi)容則可在需要用到時再去分析。
就組件來說,下面是應(yīng)該優(yōu)先理解的。
1. Zygote:Android應(yīng)用的孵化器,一切Android程序由此進(jìn)程fork而來。
2. Binder:Android的進(jìn)程間通信機制,它是Android平臺最核心的功能組件。
3. Package Manager Service:應(yīng)用安裝包管理服務(wù),不僅負(fù)責(zé)包的安裝和卸載,更重要的是負(fù)責(zé)Android應(yīng)用信息的查詢和控制,例如Android權(quán)限管理。
4. Activity Manager Service:管理Android框架層的進(jìn)程,也包含了Android應(yīng)用四大組件的邏輯實現(xiàn)。
5. Dalvik虛擬機:雖然即將被ART取代,但Dalvik依然是幫助我們理解虛擬機和Android可執(zhí)行程序文件格式的好教材。
就安全機制來說,則需要了解下面幾點。
1. 沙箱隔離:沙箱是基于不同應(yīng)用之間User ID的不同而實現(xiàn)的,其本質(zhì)是Linux對于不同用戶間訪問權(quán)限的隔離。
2. 應(yīng)用權(quán)限控制:Android應(yīng)用需要申請相應(yīng)的權(quán)限才能訪問系統(tǒng)的資源和信息,大多數(shù)權(quán)限由Android框架層的API進(jìn)行控制,另一部分權(quán)限映射到應(yīng)用所在的Group ID上,由Linux內(nèi)核做出控制。
3. SE Linux:Linux內(nèi)核層的安全增強,是一套獨立于傳統(tǒng)Linux權(quán)限訪問控制的強制性權(quán)限控制機制。Google已將這套機制移植到Android內(nèi)核,這給內(nèi)核漏洞利用帶來了一些挑戰(zhàn)。?
Android安全研究的熱點方向與現(xiàn)狀
【手機Root與內(nèi)核漏洞挖掘利用】
在Android 2.x時代,往往利用一些用戶層程序的漏洞即可將手機root,現(xiàn)在則主要依賴內(nèi)核漏洞。Android為Linux內(nèi)核引入了新的內(nèi)核模塊,以及不同廠商的驅(qū)動方案。這就為系統(tǒng)內(nèi)核引入了新的安全隱患,無論是高通、MTK還是三星獵戶座,或者華為海思的芯片,多少都出現(xiàn)過一些內(nèi)核漏洞,這是Android平臺內(nèi)核的一個主要攻擊點。隨著Google將SE Linux引入Android,攻擊面有所減小,但不能完全解決內(nèi)核漏洞利用的問題。從防御角度來說,同樣面臨著挑戰(zhàn):一些APT攻擊如果利用內(nèi)核漏洞,將能拿到系統(tǒng)的完全控制權(quán)。Android平臺內(nèi)核漏洞長期以來一直都在持續(xù)曝光,漏洞利用與防范依然是持續(xù)的熱點。
從這個方向入手,首先需要了解Linux內(nèi)核,然后不斷對目前已公開的CVE漏洞進(jìn)行分析,理解漏洞的成因和各個類型。在漏洞利用方面,有開源項目run_root_shell可作為參考,該項目包含了多個經(jīng)典漏洞的利用實現(xiàn),是入門的好材料。除此之外,還可以關(guān)注國外的POC程序或?qū)σ绘Iroot類產(chǎn)品做分析。
【Android應(yīng)用與系統(tǒng)框架層漏洞挖掘】
Android應(yīng)用本身的問題主要集中在4大組件上,通常是一些邏輯處理問題導(dǎo)致信息泄露、身份認(rèn)證繞過等。得益于Android沙箱機制,應(yīng)用本身的攻擊面是相對較小的,但一些開發(fā)人員似乎因此有恃無恐,在編碼過程中表現(xiàn)出了較差的安全意識。此外圍繞WebView或者SSL漏洞所引發(fā)的安全問題也比較常見。
框架層漏洞也是邏輯漏洞居多,但危害往往要比應(yīng)用更大。比較著名的高危漏洞有Master Key簽名繞過、WebView遠(yuǎn)程代碼執(zhí)行等。
目前已存在一些開源漏洞挖掘工具,如Drozer和Intent Fuzzer。我們可以在此基礎(chǔ)上改進(jìn),如果有獨特的挖掘思路,也可以自己嘗試開發(fā)挖掘工具。
【惡意軟件攻防】
從數(shù)量上看,隱私竊取和釣魚軟件是目前Android平臺主要的惡意軟件類型。
如果用戶對于應(yīng)用申請的權(quán)限毫不知情,一款應(yīng)用便能輕松獲取用戶的短信、通訊錄、地理位置、錄音等私密信息。Android平臺需要有主動防御程序控制應(yīng)用獲取隱私的行為,目前有兩種方法實現(xiàn),一種是集成到廠商的ROM代碼中,另一種則是利用API Hook實現(xiàn)。無論使用哪種方式,目前面臨的問題都是如何更智能地為用戶管理權(quán)限,以減少防御軟件頻繁彈窗帶來的打擾。
市面上還充斥著大量的仿冒支付類應(yīng)用,他們看起來可能與正版應(yīng)用沒有區(qū)別,因為這些仿冒應(yīng)用是由正版應(yīng)用篡改而來的。這些軟件通常會有用戶名和密碼竊取的惡意代碼。安全軟件需要通過簽名、代碼特征等方法對此進(jìn)行識別。
從趨勢上看,惡意軟件也不再局限于Android安裝包(APK)的形式進(jìn)行分發(fā),而往往會帶有Linux可執(zhí)行文件(ELF),對系統(tǒng)進(jìn)行更深層次的攻擊。 目前市面上的安全產(chǎn)品對APK文件的查殺已較成熟,但對系統(tǒng)原生層的惡意軟件查殺還沒有特別完善的實現(xiàn),對一些APT級別的新型威脅防御也仍在探索階段。
知名的惡意軟件Oldboot就是惡意程序使用底層技術(shù)對抗查殺的典型案例,該程序的完整分析細(xì)節(jié)已被公開,讀者可從網(wǎng)絡(luò)上搜索文章參考,以更好地理解如何分析惡意軟件行為。
【支付安全】
長期以來,手機支付使用短信驗證碼和獨立支付密碼解決支付者身份認(rèn)證的問題。但仍存在短信遭人竊聽或密碼被竊取的風(fēng)險,因此一些廠商效仿PC上的U盾方案,推出音頻盾或藍(lán)牙盾解決認(rèn)證問題。而利用ARM架構(gòu)下的TrustZone將支付認(rèn)證過程獨立于操作系統(tǒng)之外,也是一個方向。手機支付是很強的需求,依然有很多方案值得探索。
【應(yīng)用加固(加殼)與逆向工程】
游戲、支付類應(yīng)用都有很強的反逆向工程、防破解、防篡改的需求,目前已有幾家比較成熟的方案出現(xiàn)。但目前對于Android ELF格式程序的保護(hù)還不夠,終極防護(hù)當(dāng)然是使用類似PC上的VMProtect虛擬機。逆向工程與加固保護(hù)是一個不斷攻防的過程,加固方案需要不斷提升自己的保護(hù)強度,修補方案上的漏洞。而對于逆向工程師來說,不能逆向不意味著不能分析程序行為。一個好的軟件跟蹤方法往往讓你事半功倍。
目前國內(nèi)比較知名的加固方案有梆梆加固、360加固保、愛加密等,大家可以在這些產(chǎn)品官網(wǎng)上看到相應(yīng)信息。
【企業(yè)安全BYOD】
僅就終端設(shè)備本身來說,BYOD通常的方案是將手機系統(tǒng)隔離出兩個環(huán)境:一個公用,一個私用,兩者互不影響。三星的KNOX安全套件就提供了這樣一個功能,使用Container,將需要隔離的公用應(yīng)用包裹起來;Google也在開發(fā)類似應(yīng)用,但傳聞進(jìn)展較慢。這類方案通常會和系統(tǒng)本身緊密結(jié)合,實現(xiàn)這樣一套方案,或者發(fā)現(xiàn)這類方案中的安全漏洞,也是一個新的方向。
實例:Android 4.4.2系統(tǒng)vold漏洞
【如何在第一時間得知漏洞】
并非所有漏洞都會被納入漏洞數(shù)據(jù)庫(CVE),很多漏洞是被秘密修補的。一種方法是看版本升級時Android源碼中的Change Log,運氣好的話,你會從AOSP的Git Commit信息中注意到下面這句:
代碼1
洞的信息。如果你對這條提交記錄背后的問題足夠敏感,就能發(fā)現(xiàn)問題。
事實上,注意到這條信息的人是少數(shù)。大多數(shù)人得知這個問題前,已有人掌握了技術(shù)細(xì)節(jié)并開發(fā)出了一款針對Moto的root工具放到了XDA論壇和Twitter上。
【如何掌握漏洞細(xì)節(jié)】
可能你會想到對這款名為“[Root 4.4.x] Pie for Motorola devices”工具進(jìn)行逆向工程,但通過JEB,可以發(fā)現(xiàn)它經(jīng)過了復(fù)雜的混淆。
這種混淆叫做dexGuard,比Google使用的ProGuard更復(fù)雜。花精力脫殼,還不如自己開發(fā)一個能做軟件行為跟蹤(trace)的ROM對其進(jìn)行分析,但這是比較高級的話題。
先把工具放到一邊,其實我們也可以通過現(xiàn)有的信息對該漏洞的利用方法進(jìn)行分析。首先我們已獲得了漏洞修補信息(其diff信息參見https://android.googlesource.com/platform/system/vold/+/0de7c61),這個問題出現(xiàn)在系統(tǒng)vold進(jìn)程中,再結(jié)合源碼和AIRBUS發(fā)布的分析報告,我們就可以得知以下信息。
1. 問題出現(xiàn)在系統(tǒng)進(jìn)程vold(卷管理進(jìn)程),這是一個以root權(quán)限運行的分區(qū)管理進(jìn)程。具體出現(xiàn)問題的功能模塊是ASEC(Android Secure External Caches),其大致功能是對應(yīng)用在SD卡上存儲的文件進(jìn)行權(quán)限管理。因為SD卡的文件系統(tǒng)格式是FAT,它本身是不支持文件權(quán)限管理的。
2. 使用“vdc asec create YOURNAME ext4 none 2000 false”命令,vold進(jìn)程接收到消息,在/data/app-sec目錄下創(chuàng)建一個文件夾/data/app-sec/YOURNAME,并將這個目錄mount成/mnt/asec/YOURNAME。
3. 如代碼所示,vold在將/data/app-sec/和YOURNAME拼湊在一起時,使用了sprintf,未對YOURNAME這個字符串做任何校驗。這意味著我們可以將YOURNAME構(gòu)造成“../../PATH”的形式。這樣vold將為我們mount任何目錄,如果這個目錄已存在(例如/sbin),將被新mount的目錄覆蓋。
代碼2
【如何利用這個漏洞獲取root】
既然vold可以為我們重復(fù)mount任意目錄,就意味著我們可以使用自己指定的目錄覆蓋系統(tǒng)目錄,也就等價于可以替換系統(tǒng)文件來獲得以root身份執(zhí)行的機會。將/sbin目錄重新mount,替換/sbin/adbd文件,并且當(dāng)系統(tǒng)進(jìn)程adbd重新被init進(jìn)程啟動時,我們將有機會以root權(quán)限執(zhí)行任意代碼。這個漏洞利用代碼非常簡單。
代碼3
這段命令首先創(chuàng)建了一個指向/sbin的符號鏈接/data/local/tmp/test1。然后使用vdc向vold發(fā)送觸發(fā)漏洞的消息,vold將會把/data/app-sec/../../data/local/tmp/test1 mount起來。因為/data/local/tmp/test1是/sbin的符號鏈接,所以/sbin目錄被覆蓋成一個空分區(qū)。這個空分區(qū)是不可寫入的,但我們能在該分區(qū)內(nèi)建立符號鏈接,因此我為/data/local/tmp/adbd建立了一個符號鏈接是/sbin/adbd。這樣一來,/sbin/adbd就指向了一個我們可控的文件:/data/local/tmp/adbd。當(dāng)adbd進(jìn)程被殺死,init進(jìn)程將重新啟動adbd,/data/local/tmp/adbd以root權(quán)限運行。后面要做的就是為手機安裝su程序了,至此,手機root的過程完成。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Android安全研究经验谈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BQ24296充电管理芯片使用过程中的注
- 下一篇: sd 卡驱动--基于高通平台