◆劉 星 魏麗珍 梁煜麓 羅 佳
?
安卓沙箱中ELF文件行為檢測技術(shù)研究
◆劉 星 魏麗珍 梁煜麓 羅 佳
(廈門安勝網(wǎng)絡(luò)科技有限公司 福建 361000)
隨著安卓的發(fā)展和普及,安卓平臺惡意軟件的功能實現(xiàn)開始由java層向native層轉(zhuǎn)移,因此檢測方法也由單一靜態(tài)轉(zhuǎn)變到動、靜態(tài)結(jié)合。本文在傳統(tǒng)的動態(tài)檢查方法基礎(chǔ)上,提出一種新的動態(tài)檢測方案,通過修改系統(tǒng)內(nèi)核中斷處理函數(shù),在目標(biāo)程序使用系統(tǒng)調(diào)用時,獲取其使用的系統(tǒng)調(diào)用函數(shù)名稱、參數(shù)、上下文信息、返回值等,通過對這些信息分析處理,判斷出程序是否為惡意軟件。
移動安全;沙箱;ELF文件行為;安卓;檢測技術(shù)
在安卓發(fā)展初期,惡意軟件基本都是以java語言開發(fā),由于java語言逆向分析簡單的特點,惡意軟件很容易被安全廠商逆向分析、檢測并查殺。隨著時間推移,惡意軟件開發(fā)者水平的提高,惡意功能代碼由java層轉(zhuǎn)移到了native層,由NDK開發(fā)編譯成ELF文件,再加上o-llvm的普遍使用,給靜態(tài)分析造成了很大困難。因此,實現(xiàn)一種高效、靈活的動態(tài)檢測系統(tǒng),在惡意軟件檢測方面具有非常重要的意義。
為解決靜態(tài)分析、檢測遇到的問題,動態(tài)檢測系統(tǒng)開始廣泛應(yīng)用,通過動、靜態(tài)信息綜合判斷程序是否有惡意行為。
安卓系統(tǒng)是由Linux內(nèi)核層和以應(yīng)用程序、Framework、本地運行庫和安卓運行時組成的用戶層構(gòu)成。內(nèi)核和用戶層通過系統(tǒng)調(diào)用銜接,所以安卓的動態(tài)檢測系統(tǒng)包含兩部分,分別是Linux系統(tǒng)調(diào)用檢測和用戶層代碼調(diào)用檢測。
用戶層主要是通過修改源代碼(如xposed框架[1])或者采用注入的方式,修改虛擬機中java類方法對應(yīng)的數(shù)據(jù)結(jié)構(gòu),達到修改執(zhí)行流程目的。
傳統(tǒng)系統(tǒng)調(diào)用檢測通常有兩種,一種在用戶層利用內(nèi)核提供的相關(guān)機制或者HOOK,另一種是修改系統(tǒng)調(diào)用函數(shù)實現(xiàn)。
使用內(nèi)核機制實現(xiàn)比較簡單,如內(nèi)核提供的inotify/fanotify機制、連接器[2]等?;诖祟悪C制實現(xiàn)的系統(tǒng)調(diào)用監(jiān)控,雖然實現(xiàn)起來比較容易,但是監(jiān)控粒度比較粗,無法精確到具體函數(shù)參數(shù)、操作進程等信息,無法滿足通過動態(tài)行為來甄別惡意軟件的需求。
使用機制實現(xiàn),通常是將監(jiān)控模塊注入到目標(biāo)進程,使用導(dǎo)入表或者內(nèi)聯(lián)HOOK目標(biāo)函數(shù)。因為所有操作都在用戶層實現(xiàn),很容易被檢測和被繞過。再者,如果惡意程序采用靜態(tài)鏈接,或自己實現(xiàn)系統(tǒng)調(diào)用過程,就無法通過此方式來監(jiān)控相關(guān)信息。
除HOOK外,strace等工具也是可以用來監(jiān)控系統(tǒng)調(diào)用,作為第三方工具,輸出結(jié)果可定制性差,容易被檢測和繞過。
鑒于傳統(tǒng)動態(tài)檢測系統(tǒng)的不足,本文提出了以下動態(tài)檢測方案。
為了解決傳統(tǒng)方案在系統(tǒng)調(diào)用監(jiān)控中存在的缺點,本文從系統(tǒng)內(nèi)核出發(fā),根據(jù)系統(tǒng)調(diào)用原理,提出了一種基于中斷的系統(tǒng)調(diào)用檢測方案。
在Arm64架構(gòu)下,系統(tǒng)調(diào)用的流程大致如下:
(1)把系統(tǒng)調(diào)用號放到X8寄存器,通過svc指令進入內(nèi)核層。
(2)內(nèi)核層通過中斷向量表找到對應(yīng)的中斷服務(wù)程序,el0_sync或el0_sync_compat [3]。
(3)中斷服務(wù)程序從esr_el1 [4]寄存器中獲取異常原因,如果由svc指令產(chǎn)生,則進入el0_svc或el0_svc_compat流程。
(4)el0_svc_或el0_svc_compat流程中,通過系統(tǒng)調(diào)用號在 sys_call_table或compat_sys_call_table找到對應(yīng)的函數(shù)地址,進入系統(tǒng)調(diào)用程序。
(5)系統(tǒng)調(diào)用完成后,返回到中斷服務(wù)程序,然后再返回到用戶空間。
通過以上分析可以看出,系統(tǒng)調(diào)用的分發(fā)流程在el0_svc中(el0_svc和el0_svc_compat流程會在獲取系統(tǒng)調(diào)用表后合二為一),因此可以通過加入代碼,修改el0_svc的邏輯,得到系統(tǒng)調(diào)用參數(shù)等信息。
在系統(tǒng)調(diào)用前后加入代碼,分別命名為before和after,因為涉及到的寄存器可能被污染,需要對相關(guān)寄存器進行保存。
Arm64參數(shù)傳遞時[5],前8個使用X0到X7寄存器傳遞,其余通過棧傳遞。由于Arm64最大系統(tǒng)調(diào)用參數(shù)個數(shù)為6,所以使用X0 到X5。因此before的函數(shù)參數(shù)為7個,分別對應(yīng)系統(tǒng)調(diào)用的X0 到X5,即系統(tǒng)調(diào)用參數(shù),外加一個系統(tǒng)調(diào)用號,使用X6傳遞。由于使用了X6、LR(使用BL指令,導(dǎo)致LR寄存器被污染)和X0(函數(shù)返回值),所以需要備份X0到X8以及LR。在進入before時寄存器值和棧結(jié)構(gòu)如圖1所示。
圖1 進入before前寄存器和棧信息
在before返回后,依次按照入棧順序恢復(fù)各個寄存器值,使流程進入系統(tǒng)調(diào)用函數(shù),系統(tǒng)調(diào)用返回后進入after函數(shù)。由于系統(tǒng)調(diào)用會污染相關(guān)寄存器,因此參數(shù)無法從寄存器直接獲取。但是,系統(tǒng)在進入中斷后,各個寄存器會被系統(tǒng)以pt_regs的結(jié)構(gòu)備份在棧中,因此可以從棧中獲取到相關(guān)信息。所以,after的函數(shù)參數(shù)個數(shù)可以簡化為2個,分別是系統(tǒng)調(diào)用返回值X0和指向pt_regs的指針,使用X1傳遞,先要備份X1,然后使X1指向pt_regs地址。在進入after時,系統(tǒng)堆棧如圖2所示。
圖2 進入after前寄存器和棧信息
通過以上步驟,雖然可以攔截到系統(tǒng)調(diào)用信息,但是獲取到的是所有用戶層的系統(tǒng)調(diào)用請求,重要信息被大量無用信息干擾,不利于后續(xù)處理。為了解決以上問題,需要在before和after函數(shù)中對一些系統(tǒng)調(diào)用做特殊處理。
在before中,需要對以下系統(tǒng)調(diào)用做特殊處理:
(1)SyS_execve時,需要檢測文件路徑是不是被監(jiān)控文件,如果是,則將當(dāng)前進程PID加入到監(jiān)控隊列(通過鏈表實現(xiàn))。
(2)SyS_exit時,從監(jiān)控隊列里面移除當(dāng)前PID。
在after中,需要對以下系統(tǒng)調(diào)用做特殊處理:
(1)sys_fork時,如果父進程在監(jiān)控隊列,就將自身PID加入到監(jiān)控隊列。
(2)SyS_ptrace時,如果系統(tǒng)調(diào)用返回成功,需要將目標(biāo)進程PID加入到監(jiān)控隊列。
(3)函數(shù)返回時,需要將系統(tǒng)調(diào)用的返回值作為當(dāng)前函數(shù)的返回值。
其余情況下,檢測當(dāng)前PID是否在監(jiān)控隊列,如果在就輸出日志,流程如圖3所示。
圖3 調(diào)用流程圖
通過以上步驟,可以完整獲取目標(biāo)進程系統(tǒng)調(diào)用信息,為惡意行為檢測提供依據(jù)。
惡意程序為了躲避檢測,各種手段層出不窮,使得靜態(tài)檢測難度不斷提高。但是,無論惡意軟件如何從靜態(tài)層面隱藏自身,其功能的實現(xiàn)必須依靠系統(tǒng)提供的接口。本文提出的系統(tǒng)調(diào)用檢測方法,從內(nèi)核層系統(tǒng)調(diào)用中斷過程實現(xiàn),有以下優(yōu)點:實現(xiàn)起來比較方便,不需要修改每個系統(tǒng)調(diào)用實現(xiàn)代碼;更加底層,惡意樣本無法繞過;利用PID作為過濾條件,能準(zhǔn)確獲取其行為,減少無用信息干擾;對特殊系統(tǒng)調(diào)用特殊處理,既能獲取到與目標(biāo)進程有關(guān)聯(lián)進程信息,也可以排除無關(guān)進程。動態(tài)檢測作為惡意軟件檢測的一種手段,需要在實踐中不斷改進、完善,從而使其發(fā)揮更大作用。
[1]rovo89. Xposed[J/OL]. https://github. com/rovo89/Xposed.
[2]楊燚.連接器(Netlink Connector)及其應(yīng)用[J/OL]. https://www.ibm.com/developerworks/cn/linux/l-connector/.
[3]linuxer. Linux kernel的中斷子系統(tǒng)之(六):ARM中斷處理過程[EB/OL]. http://www. wowotech.net/irq_subsy stem/irq_handler.html.
[4]ARM.ARM Cortex-A Series Programmer’s Guide for ARMv8-A[J/OL]. http://infocenter.arm.com.