史國振,黃 瓊,席宗虎,2,蘇 铓
(1.北京電子科技學院 信息安全系,北京100070;2.西安電子科技大學 計算機學院,陜西 西安710071;3.西安電子科技大學 綜合業務網理論及關鍵技術國家重點實驗室,陜西 西安710071)
針對惡意代碼種類多樣,而現有的內部檢測方法不能夠保證操作系統安全的問題。本文結合惡意代碼進程的特點并借助虛擬化技術,以QEMU虛擬機為平臺,設計實現了一種Android系統隱藏進程發現工具,從操作系統外部檢測,保證了操作系統的安全監控。通過從QEMU模擬的內存中獲取客戶機系統進程雙向鏈表入口地址,并遍歷系統所有進程來發現系統中實際運行進程的情況,并與原有的分析工具獲取的進程列表進行對比,從而分析得出惡意隱藏的進程和代碼,實現系統的外部監控,并對系統進程全面監管。該工具的設計與實現為系統安全性的提供和用戶隱私的保護奠定了基礎。
進程是程序在操作系統中運行表現形式,為了保證運行的有序和穩定,操作系統通常具有嚴密的進程管理和調度機制,一般惡意代碼等為了隱藏其運行蹤跡,通常對其進程進行偽裝,文獻 [1]針對 Windows系統提出了一種基于直接內核對象操作 (DKOM)的進程偽裝保護方法.從內核級入手,直接修改操作系統內核空間中存儲進程相關信息的數據結構,以此實現進程隱藏的目的。文獻 [2]針對Android惡意軟件泛濫的問題,綜合靜態和動態分析技術,設計實現了Android惡意軟件檢測系統。但這種惡意軟件檢測系統對新的病毒檢測成功率低、誤報的機率較高。針對Android的隱藏進程發現方法鮮有研究,現有的安全軟件在惡意軟件檢測方面也存在一定的局限性。一方面,受操作系統本身安全的影響,運行于操作系統內的安全工具容易受到攻擊;另一方面,安全軟件的權限僅限于系統內核級,存在被系統內核級惡意軟件攻擊的危險。針對上述問題,研究并設計一種能夠在操作系統外部運行的安全檢測工具至關重要,通過為其設置更高的權限,可以順利完成檢測工作,同時解決了工具自身受到攻擊的問題。虛擬化技術的迅速發展為上述構想的實現提供了很好的契機,文獻 [3]指出虛擬機管理器具有更高的權限和更小的可信計算機,利用虛擬機管理器在單獨的虛擬機中部署監控工具能夠對目標虛擬機進行檢測,同時保證監控工具的有效性和防攻擊性。
目前,Android系統中的惡意程序[4]大都是通過APK的形式安裝到手機中,通過應用級或者系統級的漏洞獲取更高的權限,達到破壞系統安全、竊取用戶隱私的目的。現有的靜態分析方法[5,6]通過提取APK文件內容構建特征向量,與已知惡意代碼家族中代碼樣本進行比較一定程度上解決了惡意程序的識別問題。但是,該方法只能檢測出特征庫中已有的惡意軟件樣本,無法檢測未知的惡意軟件,同時靜態分析很難應對代碼混淆、反射、加密等情況。針對靜態分析的缺點,出現了動態分析方法,能夠監控APK文件運行時的行為,并通過行為對其是否為惡意軟件進行判定。但是,動態分析中惡意行為難以界定,而且對使用了進程隱藏技術的惡意代碼難以檢測。甚至在被惡意軟件的破壞或者繞過后,上述安全工具則毫無記錄可以分析。
Android系統[7]中,Dalvik虛擬機作為Runtime中的核心部分,專門負責應用程序的運行。每個運行的應用程序都與一個Dalvik虛擬機實例對應,當某個應用出現異常時,只有對應的Dalvik虛擬機出現異常,系統不會受到其影響,這樣就保證了系統的穩定。如表1所示,Dalvik虛擬機[8]中的進程和線程的概念,同Linux系統中的進程和線程概念是一致的。

表1 Dalvik虛擬機進程和線程同Linux進程的關系
Android系統的內核是基于Linux內核的,其繼承并沿用了Linux操作系統的進程管理機制。通常在操作系統中,每個進程都有一個且只有一個進程控制塊PCB(process control block)來記錄和刻畫進程狀態等其它相關信息,并將信息按照struct task_struct{}結構體定義的形式來保存,供操作系統調度和管理。每個task_struct()中記錄著其所對應進程的所有信息,其結構部分成員如下:


通過該成員可以從當前進程描述符所在鏈表找到其前后的進程描述符,進而找到所有進程描述符,實現遍歷操作系統進程的目的。
QEMU[10]是一個由Fabrice Bellard編寫的開源模擬器軟件。具體來說,它是一個使用了可移植的動態二進制翻譯器的模擬器軟件。通過分析主流CPU的體系架構特點并為其定義對應的結構體,使用動態二進制翻譯技術將上層需要執行的指令翻譯成可在宿主機上直接執行的指令,然后將其交給宿主機的CPU去執行。由于QEMU對各種硬件的模擬也是使用純軟件化的方法實現,這使得QEMU可以模擬的硬件平臺與真實硬件無必然對應關系。
QEMU的操作模式分為兩種[11]:全系統模擬 (full system emulation) 和 用 戶 模 式 模 擬 (user mode emulation),如圖1所示。
(1)全系統模式仿真:在這種模式下,QEMU模擬的硬件平臺可以模擬出客戶機系統運行起來需要的所有硬件資源,例如ARM平臺上的ARM處理器,BIOS,內存等常用的硬件設備。客戶機中的應用依靠客戶機上運行的操作系統的進程任務調度,作業管理來實現,最終將數據發送給QEMU模擬的CPU進行處理,等待結果的返回;QEMU則是將上層發送來的指令翻譯成宿主機系統所能識別的指令,并交由宿主機的CPU來執行。在宿主機看來,就是應用程序QEMU發送了一段讓宿主機處理的數據,然后等待數據返回。其中QEMU在其中充當的是一個動態的翻譯官。

圖1 QEMU的操作模式
(2)用戶模式仿真:在這種模式下,QEMU模擬的是客戶機系統需要運行的CPU,接收客戶機應用發來的各種請求,然后指令翻譯送往宿主機,等待返回的結果。而不管客戶機中的進程任務調度及作業管理等,僅充當CPU的功能。
通過分析發現全系統模式仿真使用的范圍更加的廣泛,并且對客戶機系統的監控也更加的全面,適用于分析操作系統隱藏的進程。
(1)先分析Android源碼[12]找到與內核相關的代碼,其次,按照sched.h文件里TASK_STRUCT的聲明,一個成員一個成員的算偏移,從而找到成員list_head這個雙向鏈表的地址,按圖索驥找到所有進程。但由于TASK_STRUCT是一個很大的結構體 (擁有幾十或者上百個成員),并且成員長度各不相同,比如一個char占一個字節,一個int占4個字節等;此外考慮到編譯時的對齊問題,手工計算既費力又容易錯算,這種發現進程鏈表的方式不適合本工具。
(2)進程鏈表存在于內核區,用戶區的應用不能直接的調用。考慮到驅動工作于內核區,所以可以嘗試設計一個特定的驅動,實現在內存中開辟獨立的空間用來存放獲取到的進程鏈表入口地址,并將數據返回給用戶層。但驅動程序對系統權限的要求很高,并且其最高權限就是內核權限,而惡意軟件同樣可以獲取到內核權限,若惡意軟件在發動攻擊之前破壞系統的安全檢測工具,則操作系統完全暴露在惡意軟件之下,安全問題甚是嚴重。為此,從系統內監控的方案同樣存在缺點。
針對以上兩種方法各自存在的缺點,本文依托QEMU虛擬機,設計并實現了一種從系統外部監控并發現Android平臺下隱藏進程的工具。
假設前提:通過進程隱藏技術[13,14]對應用A進行了進程隱藏處理,Android系統自身的進程管理工具或者是adb工具不能夠發現應用A的進程,通過本文設計的工具來對Android系統進行全面監控,并獲取Android系統中運行的所有進程,最后,使用 “基于交叉視圖的檢測技術[15]”同原有分析工具獲取的進程列表進行對比來發現隱藏進程。
本文設計的Android系統隱藏進程發現工具,其關鍵技術在于尋找系統中運行的進程的入口地址,以方便獲取到鏈表的地址。具體對于是獲取到哪個進程的入口地址沒有要求。為此,Android系統隱藏進程發現工具的設計如圖2所示。

圖2 Android系統隱藏進程發現工具設計思想
(1)于Android系統中選擇系統初始化時進程swpper。
(2)將這個進程控制表的入口地址,寫入到QEMU模擬的CPU的一個寄存器Ri中。
(3)通過QEMU上的VMM從Ri中讀取進程地址內容,以獲得swpper的進程控制表的入口地址。
(4)根據sched.h文件里結構體task_stract{}的聲明并結合特定的偏移算法,計算出各成員的偏移,找到循環雙向鏈表list_head{}結構體,并獲取下一個進程的鏈表入口地址*next。
(5)通過*next內容尋到下一個進程的*next地址,同時獲取當前進程task_stract{}結構體中的信息。
(6)重復步驟 (5)直到遍歷完所有進程。
針對上節提出的進程發現模型,具體的實現步驟如下:
步驟1 修改Android系統代碼
(1)定位進程描述結構體
在Android 4.0的內核源碼中,在內核根目錄下include/linux/sched.h的1114行定位進程描述符struct task_struct,其重要成員變量如下:

tasks是連接進程描述符之間的雙向鏈表結構,通過該成員就可以從當前進程描述符所在鏈表找到它前后的進程描述符,進而找到所有進程描述符。
(2)初始化進程描述符:init_task
初始化進程 “swpper”的進程描述符在內核根目錄arch/arm/kernel/Init_task.c中,init_task定義如下:
struct task_struct init_task = INIT_TASK (init_task);
在INIT_TASK ()中,對init_task結構進行了初始化:

步驟2 將進程描述法寫入寄存器
(1)在Android中找寄存器
在Android的GoldFish虛擬處理器的電池驅動程序,相關 文 件 在 根 目 錄 下 drivers/power/goldfish_battery.c,這是一個power_supply的驅動程序,實現了讀取屬性等幾個操作,通過讀取虛擬機的寄存器得到當前 “電池”的信息。而這個信息在goldfish_battery.c是一個固定值,不會被內核修改,所以選擇這種數值不會被修改的寄存器來存儲上一步初始化的特定進程描述符的地址。
(2)將init_task地址寫入寄存器
在goldfish_battery.c的goldfish_battery_probe ()中寫入:GOLDFISH_BATTERY_WRITE (data,SYSTEM_TASK_STRUCT,&init_task);
步驟3 修改QEMU源代碼
(1)在QEMU找寄存器
在 QEMU源代碼的根目錄下external/qemu/hw/goldfish_battery.c
(2)獲取寄存器中內容
goldfish_battery_write (val);
(3)讀取Android操作系統的進程描述符到qemu
Android操作系統的內存是QEMU中的虛擬內存,故獲取的進程描述符地址是操作系統內存里的地址,需要使用QEMU的cpu_memory_rw_debug()函數將操作系統內存內容讀取到QEMU控制臺可見的地方。
(4)尋找進程名
進程名即成員comm,在以進程描述符結構體起始地址為基準偏移0x2d4處,使用:

(5)尋找下一進程
進程的雙向鏈表即成員tasks,在以進程描述符結構體起始地址為基準偏移0x1c0處,使用:

即可得到下一進程的雙向鏈表結構地址,如果想使用下一進程的進程描述符,需要減去雙向鏈表結構的地址,使用:

即可得到下一進程的進程描述符。
(6)讀取所有進程

通過上面的步驟,借助QEMU成功的發現了Android系統的所有進程。
本文設計的Android系統隱藏進程發現工具是基于QEMU模擬器的1.2.0版本實現的,在對本工具進行測試時,QEMU模擬Android 4.0版本的系統平臺。
在部署完測試環境之后,首先在Android虛擬機運行Gallery應用,使用進程隱藏技術將Gallery應用的進程隱藏,通過Android系統上的模擬終端列出所有的運行進程。如圖3所示,發現所列舉的進程中沒有Gallery應用對應的進程。在上述情況下,使用本文設計的Android系統隱藏進程發現工具來檢測隱藏進程,本工具從系統之外列舉出Android系統中運行的所有進程。通過兩次獲取的進程列表對比,本工具成功的發現了Gallery應用的隱藏進程 (圖3黃線框中的android.gallery3d),驗證了本文隱藏進程發現工具設計的正確性。

圖3 進程發現測試實驗結果
近年來,隨著Android系統版本的不斷更新,Android系統的惡意軟件數量呈快速增長態勢,用戶的隱私、財產安全面臨著嚴峻的考驗和前所未有的挑戰。本文針對現有的內部檢測方法不能夠保證操作系統安全的問題,設計并實現了一種基于QEMU的Android隱藏進程發現工具。該工具從系統外部監控整個系統,遍歷系統所有進程來發現系統中實際運行進程的情況,并與原有的分析工具獲取的進程列表進行對比,從而分析得出惡意隱藏的進程和代碼,實現系統的外部監控,并對系統進程全面監管。并通過實驗驗證了隱藏進程發現工具設計的可行性和正確性。然而,本工具有些地方還有待改進,還需要進一步的研究。針對Android系統下的進程發現問題,本工具暫時不能發現游離于進程鏈路表之外的隱藏進程,這將是接下來需要研究的內容。
[1]LAN Zhiling,SONG Yubo,TANG Lei.Novel process-protecting method using camouflage techniques based on direct ker-nel object manipulation [J].Journal of Southeast University(Natural Science Edition),2013,43 (1):24-29 (in Chinese).[藍智靈,宋宇波,唐磊.基于直接內核對象操作的進程偽裝保護方法 [J].東南大學學報:自然科學版,2013,43(1):24-29.]
[2]HU Wenjun,ZHAO Shuang,TAO Jing,et al.A detection method and system implementation for Android malware [J].Journal of Xi’an Jiaotong University,2013,47 (10):37-43(in Chinese).[胡文君,趙雙,陶敬,等.一種針對Android平臺惡意軟件的檢測方法及系統實現 [J].西安交通大學學報,2013,47 (10):37-43.]
[3]XIANG Guofu,JIN Hai,ZOU Deqing,et al.Virtualizationbased security monitoring [J].Journal of Software,2012,23(8):2173-2187 (in Chinese).[項國富,金海,鄒德清,等.基于虛擬化的安全監控 [J].軟件學報,2012,23 (8):2173-2187.]
[4]FANG Xinxin.Malware implementation and detected on Android [D].Nanjing:Nanjing Post and Communications University,2013 (in Chinese).[房鑫鑫.Android惡意軟件實現及檢測研究 [D].南京:南京郵電大學,2013.]
[5]QIN Zhongyuan,XU Yuqing,LIANG Biao,et al.An Android malware static detection method [J].Journal of Southeast University (Natural Science Edition),2013,43 (6):1162-1167 (in Chinese). [秦中元,徐毓青,梁彪,等.一種Android平臺惡意軟件靜態檢測方法 [J].東南大學學報 (自然科學版),2013,43 (6):1162-1167.]
[6]MEI Hong,WANG Qianxiang,ZHANG Lu,et al.Software analysis:A road map [J].Chinese Journal of Computers,2009,32 (9):1697-1710 (in Chinese). [梅宏,王千祥,張路,等.軟件分析技術進展 [J].計算機學報,2009,32(9):1697-1710.]
[7]SONG Jie,DANG Licheng,GUO Zhenchao,et al.The security mechanism analysis and applied research of Android OS mobile platform [J].Computer Technology and Development,2010,20 (6):152-155 (in Chinese). [宋杰,黨李成,郭振朝,等.Android OS手機平臺的安全機制分析和應用研究[J].計算機技術與發展,2010,20 (6):152-155.]
[8]ZHOU Yimin,CHEN Rong.Analysis about process in Dalvik virtual machine [J].Computer Technology and Development,2010,20 (2):83-86 (in Chinese). [周毅敏,陳榕.Dalvik虛擬機進程模型分析 [J].計算機技術與發展,2010,20(2):83-86.]
[9]Linux kernel[EB/OL].[2013-11-28].http://www.kernel.org.
[10]QEMU[EB/OL].[2009-02-01].http://www.oschina.net/p/qemu.
[11]LUO Yan.Research on dynamic binary translation and optimization based on OEMU [D].Hangzhou:Zhejiang University,2013(in Chinese).[羅艷.基于QEMU的動態二進制翻譯優化研究 [D].杭州:浙江大學,2013.]
[12]Android[EB/OL].[2013-09-04].http://source.android.com/source/downloading.html.
[13]WO Tianyu,HU Chunming,LI Jianxin,et al.Hidden OS objects correlated detection technology based on VMM [J].Journal of Software,2013,24 (2):405-420 (in Chinese).[沃天宇,胡春明,李建欣,等.基于VMM的操作系統隱藏對象 關 聯 檢 測 技 術 [J]. 軟 件 學 報,2013,24 (2):405-420.]
[14]LIU Haochen,LUO Senlin.Trojan horse’s hiding and detecting technique of Android OS [J].Netinfo Security,2013,13 (1):33-37 (in Chinese).[劉昊辰,羅森林.Android系統木馬隱藏及檢測技術 [J].信息網絡安全,2013,13(1):33-37.]
[15]LI Peng,WANG Ruchuan,GAO Dehua.Research on Rootkit dynamic detection based on fuzzy pattern recognition and support virtual machine technology [J].Acta Electronica Sinica,2012,40 (1):115-120 (in Chinese). [李鵬,王汝傳,高德華.基于模糊識別和支持向量機的聯合Rootkit動態檢測技術研究 [J].電子學報,2012,40 (1):115-120.]