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