傅 濤,孫文靜
(1. 江蘇博智軟件科技有限公司,南京 210019;2. 南京審計大學計算機與軟件學院,南京 210044)
一種基于靜、動態(tài)分析相結(jié)合的漏洞挖掘分析方法
傅濤1*,孫文靜2
(1. 江蘇博智軟件科技有限公司,南京210019;2. 南京審計大學計算機與軟件學院,南京210044)
基于源碼與二進制文件的的靜態(tài)漏洞挖掘分析可以檢測出很多漏洞,但同時存在很多漏報以及誤報。動態(tài)分析技術分析動態(tài)調(diào)試器中程序的內(nèi)存、狀態(tài)以及調(diào)試器的寄存器等信息,進而發(fā)現(xiàn)潛在的安全漏洞,具有較高的準確率和較強的針對性。但動態(tài)漏洞分析技術在輸入數(shù)據(jù)格式較為復雜時,很容易構造出觸發(fā)程序異常的數(shù)據(jù)。針對二者的不足,本文提出了一種基于靜、動態(tài)結(jié)合的漏洞挖掘分析方法,為漏洞挖掘分析增添了新的思路。
漏洞挖掘;靜態(tài)分析;動態(tài)分析;靜、動態(tài)相結(jié)合
本文著錄格式:傅濤,孫文靜,等. 一種基于靜、動態(tài)分析相結(jié)合的漏洞挖掘分析方法[J]. 軟件,2016,37(8):95-98
靜態(tài)漏洞分析技術都需要借助一些靜態(tài)分析工具來“理解”程序源代碼或者反匯編代碼,其執(zhí)行效率比較高。但是,靜態(tài)分析缺少必要程序的運行時信息,它很難處理程序邏輯中由動態(tài)因素引起的復雜條件分支和循環(huán),因此分析結(jié)果將會不可避免地出現(xiàn)大量的漏報或誤報[1]。此外,基于二進制文件的靜態(tài)分析技術需要有扎實的逆向基礎,能夠?qū)Υ罅扛邚碗s度的反匯編代碼進行細致的分析,因此很難將分析自動化。而且靜態(tài)分析工具的設計開發(fā)一般都是針對某種語言及其應用平臺,不能對多種語言和不同平臺都能勝任,同時它們的針對性也不夠強。
動態(tài)分析技術通過動態(tài)檢測程序的運行狀況,可以準確的發(fā)現(xiàn)出異常的發(fā)生,從而找出目標程序的漏洞或缺陷,具有較高的準確率和較強的針對性。不足的是,動態(tài)漏洞分析技術在輸入數(shù)據(jù)格式較為復雜時,很容易構造出觸發(fā)程序異常的數(shù)據(jù)。
基于此,亟待需要探索出新的漏洞挖掘方法,結(jié)合現(xiàn)有漏洞挖掘技術的優(yōu)點,融合靜態(tài)分析和動態(tài)分析之長,以增強漏洞挖掘的目的性和自動化,提高漏洞挖掘分析的效率。
本文提出了將靜態(tài)分析與動態(tài)分析相結(jié)合的漏洞挖掘分析方法,通過兩者的結(jié)合以彌補兩者的缺陷,同時又發(fā)揮各自的優(yōu)勢,達到更好地漏洞挖掘分析效果。
靜態(tài)分析技術是指在程序非運行情況下,對程序的源代碼進行分析,直接在程序的邏輯上尋找潛在的漏洞,主要包括基于源碼和基于二進制文件的漏洞挖掘分析技術。
1.1基于源碼的漏洞挖掘分析技術
該技術是指對程序的源碼通過人工或者運用半自動化、自動化工具進行閱讀分析,檢測程序中可能存在的安全漏洞的關鍵點。目前使用最為廣泛的是詞法分析、控制流分析和數(shù)據(jù)流分析等。
詞法分析的核心是特征數(shù)據(jù)庫,特征數(shù)據(jù)庫中包含了從詞法、語法、語義等方面進行分析得出的可能產(chǎn)生安全問題的函數(shù),如strcpy、gets、malloc等。再在特征數(shù)據(jù)庫的基礎上對程序進行分析,尤其對那些囊括函數(shù)的地方進行重點分析[2]。
控制流分析主要是用來發(fā)現(xiàn)程序的執(zhí)行流與數(shù)據(jù)操作相關的特征。它的基本方法是對程序的基本塊進行標識,標識出程序最基本的模塊,以及模塊之間的調(diào)用關系。它包含了基本模塊和控制流程兩個部分。通過對基本模塊的分析,得出函數(shù)、變量、緩沖區(qū)等重要的信息,再結(jié)合對控制流程分析而得到的程序控制結(jié)構的信息,進行宏觀和微觀的分析。所以這種分析方法能夠得到比較全面的分析結(jié)果。
而數(shù)據(jù)流分析是建立在控制流分析的基礎上的,在控制流分析得到程序的基本模塊和控制流程后,利用這些信息對程序的函數(shù)和進程的數(shù)據(jù)信息進行全局性的分析。其具體的實現(xiàn)方法是在通過建立程序各個節(jié)點的數(shù)據(jù)流方程,然后通過求解來收集系統(tǒng)的數(shù)據(jù)流信息。
基于源代碼掃描分析技術屬于靜態(tài)分析技術,都需要借助一些靜態(tài)分析工具來“理解”程序源代碼或者反匯編代碼。雖然執(zhí)行效率而言比較高,但是由于是靜態(tài)分析缺少必要程序的運行時信息,這種分析方法很難處理程序邏輯中由動態(tài)因素引起的復雜條件分支和循環(huán),因此分析結(jié)果將會不可避免地出現(xiàn)大量的漏報或誤報[3]。
1.2基于二進制文件的漏洞挖掘分析技術
其基本思路:反匯編可執(zhí)行程序,識別出目標文件中的函數(shù)、庫函數(shù)以及各種間接跳轉(zhuǎn),獲得程序的控制流圖;跟蹤分析反匯編出來的代碼或者腳本語言,識別出一些可疑的匯編代碼序列,進而發(fā)現(xiàn)一些存在漏洞的關鍵信息。
目前基于二進制文件的漏洞挖掘分析技術包括二進制補丁比對、有向圖分析、污點數(shù)據(jù)傳播分析、IDC腳本分析技術等。
1.2.1二進制補丁比對技術
一般的軟件漏洞公告中都不會對漏洞的確切位置進行公布,也不會指出漏洞導致的具體原因,所以已公布的漏洞的信息其實是比較少的。通過補丁比對分析,找出補丁程序具體所做修改之處,定位漏洞代碼,然后進行分析找出漏洞觸發(fā)的原因,得到更多漏洞的相關信息。
目前常用的二進制補丁比對方法主要分為基于文本的比對,基于匯編指令的比對以及基于結(jié)構化的比對。前種方法只適用于若干字節(jié)變化的比較,不適合文件修改較多的情況。而第二種方法可以圖形化的顯示比對結(jié)果,同時可以發(fā)現(xiàn)一些非結(jié)構化的變化(如緩沖區(qū)大小改變等),但是仍然存在輸出結(jié)果范圍大,誤報情況多和漏洞定位不精確的缺點,比較有代表性的工具有eEye的EBDS軟件。
1.2.2有向圖分析技術
有向圖分析技術利用反匯編軟件IDA得到反匯編文件,然后直接通過廣度或者深度優(yōu)先搜索算法,搜索匯編代碼中的Ret,Call指令。根據(jù)軟件邏輯流程得出函數(shù)調(diào)用有向圖,用每個調(diào)用函數(shù)點作為有向圖的節(jié)點,其中包含了函數(shù)的入口地址,局部變量使用情況,分配的堆??臻g大小,調(diào)用者傳遞的參數(shù)以及返回地址等信息。然后在有向圖中判斷每個調(diào)用函數(shù)是否進行了參數(shù)邊界檢測,特別是那些容易引發(fā)漏洞的函數(shù)調(diào)用。
1.2.3污點數(shù)據(jù)傳播分析技術
對于沒有源碼的二進制文件,污點數(shù)據(jù)傳播分析通過雙向數(shù)據(jù)流分析,從污點數(shù)據(jù)輸入開始,自上而下形成一棵傳播樹;再從反匯編文本中搜索可疑函數(shù)的調(diào)用,然后從這些函數(shù)調(diào)用的地方開始向上回溯,找到兩者相交的位置(可能不存在交點),從而產(chǎn)生污染流路徑。將污染數(shù)據(jù)標記為“tainted”,通過程序語句傳播“tainted”數(shù)據(jù),凡是對“tainted”數(shù)據(jù)進行添加、插入、合并等操作,那么它的結(jié)果值也肯定是“tainted”。最后再分析交點處指令,判斷是否進行了污點數(shù)據(jù)的長度檢查,進而判斷漏洞是否存在。與有向圖分析技術類似的難題是,污點數(shù)據(jù)傳播分析技術在搜索字符串操作函數(shù)時受到編譯器優(yōu)化的影響,同時構造完整的污染點數(shù)據(jù)也是一個難點。
1.2.4IDC腳本分析技術
IDC腳本分析技術主要是基于IDA Pro的靜態(tài)分析技術,在漏洞挖掘分析時對于緩沖區(qū)溢出漏洞方面的檢測要比前兩種技術更有效[4]。IDC腳本分析技術的關鍵是在匯編代碼中搜索諸如ReadFile,recv等數(shù)據(jù)輸入函數(shù)的調(diào)用,在這些函數(shù)后面如果能夠搜索到容易產(chǎn)生漏洞的關鍵函數(shù),比如strcpy(),sprintf()等函數(shù)的調(diào)用,則記錄相應的內(nèi)存地址,并且檢查在調(diào)用函數(shù)前是否進行了數(shù)據(jù)長度的檢查,如果沒有就有可能存在潛在的安全漏洞。
靜態(tài)分析方法的主要優(yōu)點在于漏洞發(fā)掘過程中沒有任何的運行時間開銷,快速高效,適合自動化,檢測范圍廣,代碼覆蓋率高,易融入開發(fā)流程等[5-8]。主要不足:
1)檢測代碼類型存在局限性
靜態(tài)分析工具的設計開發(fā)一般都是針對某種語言及其應用平臺[9]。
2)誤報率高
無論是特征檢測還是檢測方式,都是來自于以往的經(jīng)驗總結(jié),這就會導致對于當前程序是否適合、有效的問題。這樣造成的結(jié)果就是檢測的誤報率高。
3)針對性不強
靜態(tài)分析技術的重點是分析代碼的“特征”,它所關注的是程序的實現(xiàn)特性,程序的功能特性則是被忽視,因此進行的檢查就沒有針對程序結(jié)構及功能的分析。
動態(tài)分析技術就是通過將目標程序加載到動態(tài)跟蹤調(diào)試器中,讓程序動態(tài)地執(zhí)行,從而分析動態(tài)調(diào)試器中程序的內(nèi)存、狀態(tài)以及調(diào)試器的寄存器等信息,進而發(fā)現(xiàn)潛在的安全漏洞。
最優(yōu)折衷解一般位于Pareto前端的中間段,選擇折衷解的方法有多種,如基于信息熵理論的Pareto集選優(yōu)方法[7]和TOPSIS法[20]。為了更靈活地表達設計者對不同優(yōu)化目標的偏好,本文采用TOPSIS法幫助設計人員選擇最優(yōu)折衷解。
2.1環(huán)境錯誤注入法
程序開發(fā)時,通常沒有將程序運行的環(huán)境進行充分的考慮,總是認為程序會在理想的安全穩(wěn)定的情況下運行,所以一旦程序的運行環(huán)境出現(xiàn)了某種人為的或是非人為的變化時,程序能不能正常的運行就不得而知,所以在程序運行中輸入環(huán)境錯誤是驗證計算機和軟件系統(tǒng)容錯性和可靠性的一種有效方法。
2.2虛擬堆棧分析
虛擬堆棧分析是挖掘緩沖區(qū)溢出漏洞常用的動態(tài)分析技術[10]。它首先進行格式化分析,然后在這基礎上通過動態(tài)攔截軟件運行時的可疑函數(shù)調(diào)用,創(chuàng)建記錄所有函數(shù)緩沖區(qū)使用情況的虛擬堆棧表;其次判斷緩沖區(qū)是否在堆中,如果緩沖區(qū)在堆中則定位堆指針,而如果緩沖區(qū)在棧中則通過查詢虛擬棧表,來獲得緩沖區(qū)位置、大小以及函數(shù)的返回地址等信息;最后將得到的信息與限定條件進行比較,得到分析的結(jié)果,進而判斷是否存在安全問題。
2.3Fuzzing技術
Fuzzing技術是一種自動或半自動化的漏洞挖掘分析技術,通過向目標(如文件格式、網(wǎng)絡協(xié)議、API等)輸入半有效的數(shù)據(jù),即提供非預期的輸入數(shù)據(jù)并監(jiān)測系統(tǒng)的異常情況來發(fā)現(xiàn)潛在的軟件安全漏洞[50]。而所謂半有效的數(shù)據(jù),是指該數(shù)據(jù)的大部分是有效的,這樣應用程序就會認為這是一個有效的數(shù)據(jù),但是同時該數(shù)據(jù)的其余部分是無效的。
Fuzzing技術主要是通過構造模糊測試工具(fuzzer)來實現(xiàn)的。通過向編寫的 fuzzer 工具中輸入一些隨機或者精心構造的數(shù)據(jù)來觀察目標程序?qū)斎霐?shù)據(jù)的響應,從而發(fā)現(xiàn)問題。通常對目標的fuzzing測試以大小相關的部分、字符串、標志字符串開始或結(jié)束的二進制塊等為重點。根據(jù)對象不同,一般將fuzz分為fuzz文件格式和fuzz網(wǎng)絡協(xié)議。
2.3.1fuzz文件格式
對于黑客和攻擊者而言,他們往往會嘗試對軟件所約定的數(shù)據(jù)結(jié)構進行稍許的修改,然后觀察軟件在解析這種“畸形文件”時是否會發(fā)生錯誤,是否會引起堆棧的溢出,一旦發(fā)生了錯誤,再經(jīng)過精心地構造畸形數(shù)據(jù),就有可能利用軟件的漏洞達到破壞軟件,操作系統(tǒng)獲得權限等目的。
1)以一個正常的文件模板為基礎,按照一定的規(guī)則產(chǎn)生一批畸形文件。
2)將畸形文件逐一加載到軟件進行解析,監(jiān)視軟件是否產(chǎn)生了異?;蛘咤e誤。
3)記錄軟件產(chǎn)生的錯誤信息,如寄存器狀態(tài),棧狀態(tài)等。
4)測試人員通過日志等形式了解異常信息,從而確定這些錯誤是否能被利用。
2.3.2fuzz網(wǎng)絡協(xié)議
網(wǎng)絡協(xié)議與文件格式一樣都需要嚴格的fuzz測試以確保其魯棒性與健壯性。網(wǎng)絡協(xié)議的fuzz按照協(xié)議標準,對郵件、FTP服務器等網(wǎng)絡應用中的服務器端和客戶端的數(shù)據(jù)包進行fuzz,,通過控制觀察被測協(xié)議實現(xiàn)的外部輸入的響應對其進行分析評價。
對于攻擊者而言,網(wǎng)絡協(xié)議解析中的漏洞比文件格式解析時的漏洞更有價值,因為利用文件格式中的漏洞需要用戶點擊下載載有shellcode的畸形文件,攻擊者不能人為地讓用戶主動下載。而一個郵件服務程序在解析SMTP協(xié)議中如果產(chǎn)生了堆棧溢出,攻擊者就可以主動地發(fā)送載有shellcode的畸形數(shù)據(jù)包以獲得遠程控制。但是協(xié)議比文件格式更為復雜性,因此協(xié)議fuzz要比文件格式fuzz更為復雜。
假設服務器端在解析“Cmd3”數(shù)據(jù)包中的命令時存在堆棧溢出漏洞,那么攻擊者會先模仿客戶端,在與服務器進行了正確的“Cmd1”和“Cmd2”會話后,才能觸發(fā)這個漏洞;若直接發(fā)送“Cmd3”數(shù)據(jù)包,則數(shù)據(jù)包有可能直接被服務器丟掉。
動態(tài)分析,不需要測試人員對目標程序的邏輯流程作深入的分析和理解,也不需要了解目標程序的文件格式或通信協(xié)議,只利用隨機填充數(shù)據(jù)來驗證目標程序?qū)Ψ钦]斎氲目煽啃浴5斴斎霐?shù)據(jù)格式較為復雜時,很容易構造出觸發(fā)程序異常的數(shù)據(jù)。
此外,F(xiàn)uzzing 測試是一種黑箱測試,不能對程序進行覆蓋測試,永遠不能保證目標軟件中不再存在漏洞。
動態(tài)分析和靜態(tài)分析有著各自的優(yōu)勢,單純地通過靜態(tài)或者動態(tài)地分析挖掘漏洞,又總是不可避免的存在一些缺陷和問題。為此,本文建議通過將靜態(tài)與動態(tài)分析方法相結(jié)合進行漏洞挖掘分析,以求更好的彌補各自的缺陷,發(fā)揮各自的優(yōu)勢,達到更好地漏洞挖掘分析效果。
以緩沖區(qū)溢出漏洞的挖掘分析為例,基于靜、動態(tài)結(jié)合的漏洞挖掘分析方法的處理流程為:
(1)首先,對于有源代碼的軟件程序,將目標程序通過源代碼掃描軟件進行分析,查找目標程序中存在的容易發(fā)生緩沖區(qū)溢出的函數(shù),比如strcpy()、sprintf()等,如果發(fā)現(xiàn)直接進行修改直至沒有。然后將目標程序進行編譯,編譯成為可以執(zhí)行的二進制文件,進而轉(zhuǎn)為執(zhí)行第二步的漏洞挖掘分析。
(2)對于沒有源代碼的二進制文件,通過反匯編軟件獲得反匯編代碼,然后根據(jù) strcpy()、sprintf()等函數(shù)的特征代碼在目標軟件的反匯編代碼中搜索strcpy()、sprintf()等容易發(fā)生緩沖區(qū)溢出的函數(shù)。再結(jié)合IDA或者Ollydbg 動態(tài)加載目標軟件,接著在所有搜索到的關鍵函數(shù)處設置斷點,通過改變輸入數(shù)據(jù)不斷觀察調(diào)試器異常行為,最后確認脆弱點。
當然在實際的運用中,緩沖區(qū)溢出漏洞只是一種漏洞類型,在應對其他漏洞時,雖然查找監(jiān)測的漏洞函數(shù)不一樣,但是主體的思想與方法是一致。
傳統(tǒng)的漏洞挖掘分析方法在漏洞挖掘分析中總是不可避免的存在一些缺陷和問題,基于源碼與二進制文件的的靜態(tài)漏洞挖掘分析可以檢測出很多漏洞,但同時存在很多漏報以及誤報。動態(tài)分析技術分析動態(tài)調(diào)試器中程序的內(nèi)存、狀態(tài)以及調(diào)試器的寄存器等信息,進而發(fā)現(xiàn)潛在的安全漏洞,具有較高的準確率和較強的針對性。但動態(tài)漏洞分析技術在輸入數(shù)據(jù)格式較為復雜時,很容易構造出觸發(fā)程序異常的數(shù)據(jù)。針對二者的不足,本文提出了一種基于靜、動態(tài)結(jié)合的漏洞挖掘分析方法,通過兩者的相互結(jié)合可以更好地彌補兩者的缺陷,同時又發(fā)揮各自的優(yōu)勢,達到更好地漏洞挖掘分析效果,為漏洞挖掘分析增添了新的思路。
[1] 田蘭, 汪君勇. 貴州氣象信息網(wǎng)絡安全問題研究[J]. 貴州氣象, 2008, 32(6): 35-36.
[2] Cigital. ITS4. [EB/OL]. http://www.cigital.com/its4.
[3] 杜家幸, 趙斌, 封心充. 淺析氣象網(wǎng)絡安全[J]. 硅谷, 2008, 4: 20.
[4] 唐正軍. 網(wǎng)絡入侵檢測系統(tǒng)的設計與實現(xiàn)[M]. 北京: 電子工業(yè)出版社, 2002: 103-251.
[5] Brain Chess, Gary McGraw. StaticAnalysis for Security. IEEE Security and Privacy, v 2, n 6, November/December, 2004, 76-79.
[6] Bruce Potter, BoozAllen and Gary McGraw. Software Security Testing. IEEE Security and Privacy, v 2, n 5, September/ October, 2004, 81-85.
[7] Gary McGraw. Application Security Testing Tools: Worth the Money. Network Magazine, v 19, n 11, 2004, 60.
[8] 劉為. 基于模糊測試的XSS漏洞檢測系統(tǒng)研究與實現(xiàn)[D].長沙: 湖南大學, 2010.
[9] 羅宇翔. 面向軟件安全缺陷的靜態(tài)代碼分祈及防御[D].中國科學院碩士論文, 2007.
[10] 吳晨, 張量, 張靜. ASP.NET+SQLSERVER 數(shù)據(jù)庫開發(fā)與實例[M]. 北京: 清華大學出版社, 2004: 351-422.
FU Tao1, SUN Wen-jing2(1. Jiangsu Elextec Tech. Co., Ltd., Nanjing210003, China; 2. Nanjing Audit University, Nanjing210029, China)
Static vulnerability mining based on the source code and binaries can detect a lot of vulnerabilities, but there are a lot of missing reports and error reports. Dynamic analysis techniques can analyze the dynamic memory debugger program, status and debugger register and other information. Then identify potential security vulnerabilities, with high accuracy and highly targeted. However, it is easy to construct a program to make an exception of data when input data format is more complicated in dynamic vulnerabilities analysis technology. For the above two drawbacks, this paper presents an vulnerability analysis mining method based on static and dynamic analysis, which adds a new way of thinking for mining vulnerabilities analysis.
Vulnerability mining; Static analysis; Dynamic analysis; Combination of static and dynamic
TP 311
A
10.3969/j.issn.1003-6970.2016.08.021
江蘇省2016年度科技發(fā)展基金,項目編號:寧科(2016)138號。
傅濤(1980-),男,博士,副研究員,主要研究方向:信息安全。孫文靜(1979-),女,碩士,研究方向:計算機網(wǎng)絡。