close

更多安全資訊和分析文章請關注啟明星辰ADLab微信公眾號及官方網站(adlab.venustech.com.cn)




目 錄


一、前言

二、Android App漏洞掃描的難點

三、個人掃描器和商業化漏洞掃描器的區別

四、半自動化和自動化漏洞掃描的區別

五、基於文本匹配的半自動化靜態漏洞掃描器介紹及優化

六、基於靜態污點分析的半自動化漏洞掃描器介紹及優化

七、研究經驗總結

八、未來優化方向


一、前 言


在Android應用層安全研究領域,研究人員大多採用人工審計加腳本的方式進行漏洞挖掘。針對某個新的攻擊面,對手機廠商上千款的預置App開展批量的漏洞挖掘時,短時間內很難產出結果,漏洞挖掘效率低。

在2021年7月上旬,啟明星辰ADLab基於開源工具二次開發,編寫了一套半自動化靜態漏洞掃描工具以輔助漏洞挖掘。在2021年8月底,僅3天時間,用這套工具在小米手機上挖掘到10餘處高危漏洞及若干中危漏洞,位列小米SRC 2021 TOP1。

本文主要介紹半自動化漏洞挖掘關鍵技術以及一些研究經驗總結。


二、Android App漏洞掃描的難點


由於Java的語言特性,掃描器在某些情況下存在漏報、誤報。此外很多App漏洞都屬於邏輯漏洞,和代碼邏輯強相關。與棧溢出等安全漏洞不同,我們很難直接通過掃描逆向後的App代碼得到準確的結果,基本都需要研究員介入做最後的漏洞確認。典型的場景就是Webview Jsbridge漏洞。掃描器確實可以掃描出從外部輸入被解析到輸入數據被Webview加載的代碼執行路徑,但Jsbridge漏洞最關鍵的域名校驗策略有多種寫法,代碼實現完全取決於開發者。掃描器在處理這種漏洞時只能承擔輔助作用,即幫助研究員定位哪些代碼路徑可觸發Webview Jsbridge函數,而不能直接得到『存在Webview Jsbridge漏洞』的結果。

同時Android系統誕生的時間足夠長且代碼開源,故市面上已經存在非常成熟且開源的漏洞掃描工具,內卷極其嚴重。很多時候比的不是掃描邏輯,而是比誰的漏洞模板和數據建模更優秀。


三、個人掃描器和商業化掃描器的區別


根據不同的掃描目的(如企業使用、個人使用),掃描器可分為個人掃描器和商業化掃描器。主要存在以下4個區別:

漏洞掃描的顆粒度不同
掃描結果的呈現方式不同
對於漏洞漏報的容忍度不同
對於漏洞誤報的容忍度不同

四、半自動化和自動化漏洞掃描的區別

半自動化漏洞掃描指的是需要在掃描過程中或掃描結束後人工參與的漏洞掃描。大多數情況下是指掃描結束後需要研究員二次確認漏洞是否真實存在。Android應用層漏洞因其特性,存在很多邏輯漏洞,所以對於個人研究者而言,半自動化掃描器會是更好的選擇。

五、基於文本匹配的半自動化靜態漏洞掃描器介紹及優化


5.1 實現原理

首先利用反編譯工具(如jadx)將dex轉換為Java源碼並保存到本地,然後執行文本掃描,可簡化為執行grep(正則匹配),最後按照掃描模板中定義的漏洞點識別文本,一旦匹配則保留結果。

其中,掃描模板決定了該漏洞掃描器的漏洞發現率。只要漏洞模板定義得足夠好,可以保證大部分的漏洞類型不出現漏報。但該掃描策略顆粒度太大,一定會存在誤報,需要研究員人工確認。

5.2 開源工具MobSF

MobSF[1]是目前許多文本匹配掃描器的始祖。其核心實現(文本匹配)邏輯簡單,大量類品只是基於該框架增刪改UI、增加漏洞掃描模板等。為避免重複造輪子浪費時間,我們最終選擇了MobSF,在此基礎上進行拓展優化目標。

MobSF基本界面如圖1所示。
圖1 MobSF主界面

圖2展示的ISSUE僅為使用MobSF的『預置漏洞模板』得到的結果,並非實際可用漏洞,僅用作界面展示。

圖 2 MobSF掃描結果詳情頁

當用戶點擊FILES標籤下的代碼文件,如`xx /xx/common/xx.java`後,程序會自動打開並加載目標源文件。

圖 3 MobSF漏洞詳情頁

MobSF掃描器以yaml格式解析漏洞掃描模板[2]:

圖4 掃描模板定義

MobSF的優點:

UI精美。對於大多數不會前端開發或者想節省開發時間的研究員來說,MobSF是一個絕佳的二次開發目標。研究員只需將精力聚焦於核心掃描邏輯的優化和掃描模板的構建上。掃描結果的展示及統計可直接採用MobSF的框架,避免重複造輪子,節省了大量不必要的時間。
功能豐富。MobSF還支持惡意病毒掃描、敏感數據掃描等。研究員可根據自己的需要對這些模塊增刪改查。適合不同方向的研究員,如病毒分析、隱私合規、漏洞挖掘等。
糾誤成本低。MobSF支持在瀏覽器中直接查看反編譯得到的源碼。研究員只需要點擊一次便可快速糾誤。對於一些漏洞類型,經驗豐富的研究員只需幾秒就能確定掃描結果是否誤報。
只要漏洞模板足夠完善,漏報概率極低。
掃描器會將APK反編譯並保存java源碼到本地,適合研究員快速分析目標APP。也便於研究員反覆測試及掃描結果的查詢。

MobSF的缺點:

誤報率高。掃描的核心邏輯為正則匹配。以查找包含hello關鍵詞的漏洞舉例,hello、helloWorld、aaahello、hellooooooooood均會被標記為漏洞。雖糾誤成本低,但若誤報的數量太大(100:1),同樣會耗費研究員大量的精力。
分析速度慢。掃描器會將APK反編譯並保存Java源碼到本地,該流程的執行速度取決於目標APK的代碼複雜度且後續會對本地文件執行正則匹配以掃描漏洞。若漏洞模板豐富,漏洞掃描亦很耗時間。以小米手機為例,300個預裝App總分析時間為4~6個小時(8核32G Macbook pro)。但多次分析同一APK時,速度較快,因為不再需要反編譯APK。

占用磁盤空間大。以小米手機為例,300個預裝App分析後占用的磁盤大小為40G~60G。

5.3 拓展和優化

本節主要介紹對該框架進行拓展以及優化時使用到的技術及思考。

在2021年7月的1.0版本,除了核心的掃描邏輯沒變,我們對其餘的代碼模塊均做了二次開發。在2022年9月的2.0版本,又對其核心的掃描邏輯做了優化升級。至此,除了UI模塊未變,其餘模塊均做了二次開發。
移除動態調試、病毒查殺、iOS支持等無關模塊,僅保留StaticAnalyzer模塊。
刪除自帶的無用模板,根據需要編寫特定的漏洞掃描模板(30+)。
優化多次掃描的邏輯。
優化部分代碼邏輯,提升掃描速度。
針對誤報率過高導致的即使糾誤成本低也需耗費大量精力的問題,結合Android App漏洞的特性,優化其核心掃描邏輯。目前在大多數類型(如雙無PendingIntent劫持、Intent轉發、代碼執行等基礎漏洞)的漏洞掃描上誤報率極低。誤報率從(100:1)降低至(3~10):1。部分漏洞無誤報。

六、基於靜態污點分析的半自動化漏洞掃描器介紹及優化

6.1 污點分析的基本介紹

污點分析分為靜態和動態,這裡介紹靜態的污點分析。污點分析的原則是:

將當前用戶的輸入視作污點數據,所有基於該污點數據產生的新數據同樣視作污點數據。
所有污點數據的執行路徑稱為污點路徑。

跟蹤和污點數據相關的信息的流向,根據特定的規則判斷它們是否會影響某些代碼邏輯,進而挖掘程序漏洞。

6.2 邏輯梳理

如果現在要編寫基於靜態污點分析的掃描器來分析App是否存在Webview jsbridge攻擊點(Intent轉發漏洞也一樣),先梳理一下思維:

找到一個導出的Activity(具備BROWSABLE屬性並響應VIEW action)。
該activity會解析外部傳入的intent並讓註冊了jsbridge接口的webview加載intent中的url。

因此核心在於:

確定參數傳遞的入口。
獲得污點的傳播路徑:從這些Activity解析Intent的位置依次往後查看,構建一條調用鏈直到到達webview.loadUrl。亦可逆推。
判斷調用鏈是否到達最終的攻擊入口。

那如何知道這個Android App中哪些Activity是導出的?又該怎麼獲得方法和方法之間的調用關係呢?我們可以藉助Androguard[3]。這款工具是現在很多Android靜態分析工具的核心,它會分析dex並完全解析其中的類、方法,生成相關的Python類,在Androguard分析完後,某個類/方法調用了誰,誰調用了它,全都保留在內存里。而研究人員只需要進行正序或者逆序的溯源即可(即在Androguard上做二次開發,添加自己的邏輯)。

這裡以逆序的溯源為例:

首先得到AndroidManifest的內容,判斷哪些Activity的exported= true或者exported != false且具備Intent-filter,Intent-filter包含BROWABLE屬性,同時響應VIEW這個action。
拿到webview.loadUrl這個函數的被調用情況。附加條件如addJavascriptInterface,也是一樣的判斷邏輯。
依次回退調用鏈,查看調用loadUrl的方法是否有被其他類的某個方法調用,如果有,持續回退,並構建調用鏈。
一旦發現回退到的類名等同於導出的Activity或者其他顆粒度更細的函數,如四大生命周期函數,Intent的解析函數等(取決於掃描策略),匹配終止,打印出該調用鏈。

至此,掃描器就找到了一條外部可控的攻擊路徑,接着研究員便可執行漏洞的可利用分析。

6.3 開源工具Jandroid

與『基於文本匹配的半自動化掃描器』一樣,『基於靜態污點分析』的半自動化漏洞掃描器也存在很好的開源實現。Jandroid[4]掃描器於2019年年底公開。

Jandroid掃描模板[5]:

圖 5 掃描模板

Jandroid掃描結果為可視化的節點:

圖 6掃描結果

『基於靜態污點分析』的優點:較之於文本匹配,該掃描策略掃描速度更快。無需轉換dex為java源碼,速度是文本匹配掃描器的2~4倍。採用基於調用關係依賴的掃描策略,所以只要模板定義得好,誤報率會很低,在掃描『ZIP包路徑穿越』、『Intent轉發』、『命令注入』等漏洞時有奇效。且不占用太多磁盤空間。

『基於靜態污點分析』的缺點:經研究發現,這種分析策略因Java的語言特性限制存在很大不足,導致漏報率較高,只能當作輔助審計的工具,故將其擱置。例如,作為一個瀏覽器App,基本都會有導出且具備Browable屬性的Activity,同時該Activity會調用webview.loadUrl打開指定網頁。但令人驚訝的是,我們使用該掃描策略掃描了3款主流瀏覽器應用,卻只掃出1款瀏覽器存在少許符合條件的Activity。同時經人工確認,該款App也不止具備這幾個符合條件的Activity,該掃描策略的漏報率極高。

接下來我們會介紹『基於調用關係的靜態分析』為何會存在漏報以及如何解決。

6.4 漏報原因以及解決方案

Java是一個面向對象的語言,擁有4大特性:封裝、繼承、多態、抽象。Java也存在反射機制。為了實現『一次編譯,多平台共用』的目的,在程序語言和機器語言中間布置了一個中間層即JVM。JVM擁有自己的堆用於存放生成的對象,也有自己的堆管理策略。

以Java的接口舉例。在Java中,如果要創建一個接口的實例,就需要使用一個類來實現這個接口,並使用new關鍵詞(或者其他實例化的方法)標記以便JVM將其實例化,而JVM在運行時才會為對象分配內存並調用其構造函數。故只有在運行時程序才能知道該對象具體的類型是什麼,才能進一步去尋找需要調用的目標函數。

前面我們已經提到,Androguard在靜態分析時會梳理方法和方法之間的調用關係並構建調用鏈。但如果目標方法依賴的是一個接口,而接口的具體實現又只能在運行時才會實例化,這就會導致Androguard在靜態分析時無法定位這個接口的真實實例,從而導致調用鏈的斷開。

同時,基於Java的語言特性,Android開發者們有很多花哨的代碼寫法,很典型的便是EventBus、Rxbus。以事件總線舉例,可以將其簡單地理解為一個隊列Queue。

圖7 事件流
事件流擁有一個管理類Manager。
在初始化階段或動態註冊階段,各註冊者(即各個類,基於同一接口)會調用Manager的subscribe函數告訴Manager自己要處理的eventID。
當一個事件來臨時,如用戶觸發某個操作,這個事件會從事件流的上游傳遞到下游(本質就是Manager遍歷自己的註冊者列表),如果註冊者註冊的eventID和這個事件的ID一致,那麼Manager會終止遍歷,並將這個事件拋給該註冊者處理。

前面介紹到了,『調用關係依賴』的漏洞掃描策略是利用方法和方法之間的顯式調用關係來生成回溯鏈的。在這種情況下,事件的發出方只知道調用了事件管理類Manager的event_in函數,但在靜態的情況下不知道到底被哪個註冊者的event_handle函數處理了,所以也就沒有辦法繼續維護該回溯鏈,從而導致漏報(即多態導致漏報)。

在2019年底接觸到這種掃描策略後,就考慮過如何解決這個問題。結論是,如果能加上一些語法分析以及機器學習,便能部分解決這個問題。當然,動態分析也能解決這個問題。

但對個人安全研究者而言,這種解決方案成本太高,個人研究者並沒有必要死磕。編寫漏洞掃描工具的本意就是為了更高效地挖洞。如果編寫漏洞挖掘工具的成本是人工審計加腳本挖掘的幾倍甚至幾十倍,那也就沒有編寫漏洞掃描器的意義了(如果是商業掃描器,或者企業內部的掃描器,自然有必要解決這個問題)。

另外我們相信,不能過於依賴掃描器的準確率。作為掃描器而言,如果這個掃描器的掃描結果有效率是99.9%,那也仍有0.1%的概率漏報。以數學的概念理解,0.1%和99.9%相比太小,完全可以忽略。但如果這0.1%中恰好包含嚴重漏洞呢?出現『前99.9%的漏洞總價值100美元,這0.1%的漏洞價值20萬美元』的情況也是可能的。故我們認為個人研究員在編寫掃描器時除了準確率外還需要有兜底策略,即防禦漏報。因彼時(2019年底)的研究重心並不在移動安全,故未再深入研究。

2021年7月,在編寫『基於文本匹配的半自動化漏洞掃描器』時,我們想到可以結合這兩個掃描器,將他們的優勢互補,便可很大程度彌補各自的缺陷。此時我們編寫的並非商業化掃描器,而是個人掃描器,因此無需一個技術點上死磕。只要能解決問題,那就是好辦法。

『基於靜態污點分析的掃描器』確實會存在漏報,但『基於文本匹配的掃描器』並不會。即使某些漏洞使用『基於文本匹配的掃描器』掃描也不能得到確切的結果,但至少可以拋出問題,避免出現『遺漏漏洞』的情況,此時只需結合人工審計即可覆蓋所有的攻擊點。

同時『基於靜態污點分析的掃描器』也會在一定程度上彌補『基於文本匹配的掃描器』容易誤報的問題。只需編寫一個Bridge合併它們掃描的數據和結果即可。

這樣,研究員便能以很小的代價得到一個相對好的結果。

2021年7月,我們在編寫這款漏洞掃描器1.0時,只花了不到2周時間(大部分時間用於微調UI和優化輸出),就得到了很好的結果。後續的2.0優化,也不過1周多的時間。

七、研究經驗總結

不建議使用挖掘App(如Facebook、淘寶)的思維挖掘Android OEM廠商的App漏洞(如三星、小米等)。構建漏洞掃描器亦是如此。前者只是App,後者是操作系統,很多時候都需要兼顧應用層、框架層、內核甚至是TEE的特性對預置App進行漏洞挖掘。
結合反編譯軟件的特性定製化靜態掃描軟件的掃描邏輯:如雙無PendingIntent的漏洞掃描。
本文介紹了『基於文本匹配』和『基於靜態污點分析』的Android半自動化靜態掃描技術,中間也提到了兩個很成熟的開源掃描工具MobSF和Jandroid。從這裡我們也能了解到,因為Android已經發展了十多年,業內對它的研究已經非常成熟,各種掃描策略都有開源實現,所以很多時候研究者們能做的就是看能否對他們的策略進行優化或者能否先別人一步準備好漏洞掃描模板。現階段的競爭已趨於『漏洞模板質量和數量』的競爭。誰能率先發現新的攻擊面,誰就能掌握主動。所以研究員可將更多的精力放在新攻擊面的挖掘上。

八、未來優化方向

將結合Android框架層的機制挖掘OEM App的一些獨特攻擊面,並考慮結合動態分析。因目前的掃描器已能完成大部分的任務,故未來再根據實際需求對其進行相應優化。


參考鏈接:

[1]https://github.com/MobSF/Mobile-Security-Framework-MobSF
[2]https://github.com/MobSF/Mobile-Security-Framework-MobSF/blob/master/mobsf/StaticAnalyzer/views/android/rules/android_rules.yaml
[3] https://github.com/androguard/androguard
[4] https://github.com/WithSecureLabs/Jandroid
[5]https://github.com/WithSecureLabs/Jandroid/blob/master/templates/android/sample_basic_browsable_jsbridge.template

啟明星辰積極防禦實驗室(ADLab)


ADLab成立於1999年,是中國安全行業最早成立的攻防技術研究實驗室之一,微軟MAPP計劃核心成員,「黑雀攻擊」概念首推者。截止目前,ADLab已通過CVE累計發布安全漏洞1100餘個,通過 CNVD/CNNVD/NVDB累計發布安全漏洞近3000個,持續保持國際網絡安全領域一流水準。實驗室研究方向涵蓋操作系統與應用系統安全研究、移動智能終端安全研究、物聯網智能設備安全研究、Web安全研究、工控系統安全研究、雲安全研究。研究成果應用於產品核心技術研究、國家重點科技項目攻關、專業安全服務等。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()