傅 濤
?
基于源碼與二進制文件的漏洞挖掘技術
傅 濤
(江蘇博智軟件科技股份有限公司,江蘇 南京 210044)
基于源碼的漏洞挖掘分析技術是源代碼審核技術,它通過對程序的源碼閱讀分析,檢測程序中可能存在的安全漏洞。而基于二進制文件的漏洞挖掘分析技術,則是著眼目標文件中的函數(shù)、庫函數(shù)以及各種間接跳轉,獲得程序的控制流圖,分析反匯編出來的代碼或者腳本語言,從而識別出可疑的匯編代碼序列,進而發(fā)現(xiàn)漏洞信息,為科學實現(xiàn)漏洞挖掘提供有效思路。
漏洞挖掘;源碼;二進制文件;虛擬堆棧;動靜態(tài)結合
漏洞挖掘分析技術是指對未知漏洞的探索,綜合應用各種技術和工具,盡可能地找出軟件中的潛在漏洞,然后對已發(fā)現(xiàn)漏洞的細節(jié)進行深入分析,為漏洞利用、補救等處理措施作鋪墊。根據(jù)漏洞挖掘分析的自動化程度,可分為手工分析、半自動或自動化分析;根據(jù)軟件源代碼的開放性,可分為白盒分析、黑盒分析和灰盒分析三類;根據(jù)目標軟件的運行狀態(tài),又可分為靜態(tài)分析和動態(tài)分析。本文主要研究基于源碼的漏洞挖掘分析技術虛擬堆棧分析漏洞挖掘技術。
基于源碼的漏洞挖掘分析技術是源代碼審核技術,該技術是指對程序的源碼通過人工或者運用半自動化、自動化工具進行閱讀分析,檢測程序中可能存在的安全漏洞的關鍵點。目前使用最為廣泛的是詞法分析、控制流分析和數(shù)據(jù)流分析等。
詞法分析的核心是特征數(shù)據(jù)庫,特征數(shù)據(jù)庫中包含了從詞法、語法、語義等方面進行分析得出的可能產(chǎn)生安全問題的函數(shù),如strcpy、gets、malloc等。再在特征數(shù)據(jù)庫的基礎上對程序進行分析,尤其對那些囊括函數(shù)的地方進行重點分析[1]。
控制流分析主要是用來發(fā)現(xiàn)程序的執(zhí)行流與數(shù)據(jù)操作相關的特征。它的基本方法是對程序的基本塊進行標識,標識出程序最基本的模塊,以及模塊之間的調用關系。它包含了基本模塊和控制流程兩個部分。通過對基本模塊的分析,得出函數(shù)、變量、緩沖區(qū)等重要的信息,再結合對控制流程分析而得到的程序控制結構的信息,進行宏觀和微觀的分析。這種分析方法能夠得到比較全面的分析結果。
而數(shù)據(jù)流分析是建立在控制流分析的基礎上的,在控制流分析得到程序的基本模塊和控制流程后,利用這些信息對程序的函數(shù)和進程的數(shù)據(jù)信息進行全局性的分析。其具體的實現(xiàn)方法是在通過建立程序各個節(jié)點的數(shù)據(jù)流方程,然后通過求解來收集系統(tǒng)的數(shù)據(jù)流信息。
基于源碼的漏洞挖掘分析可以檢測出很多漏洞,但同時也存在很多漏報以及誤報。現(xiàn)在市面上比較常見的檢測工具有很多,比如免費開源的ITS4,F(xiàn)lawFinder,Splint以及一些商業(yè)軟件如Fortify等。
ITS4[2]是第一款用于檢測軟件源碼中安全問題的代碼審計工具,它以命令行方式工作在Linux和 Unix 環(huán)境中的一種靜態(tài)掃描 C/C++語言源代碼中安全漏洞的簡單工具,可以集成到軟件開發(fā)環(huán)境中。ITS4構造了一種對安全具有威脅的模型結構的數(shù)據(jù)庫,然后使用詞法分析技術對源碼進行對應模式的搜索匹配。這類檢測技術的特點是實現(xiàn)簡單、算法效率高,但是由于沒有考慮到語法和語義層面的信息,容易出現(xiàn)漏報和誤報的情形。
Flawfinder[3]主要用以審查C/C++源代碼然后以風險等級來報告可能存在的脆弱點(錯誤)。它基于Unix/ Linux系統(tǒng),內嵌了一個C/C++有問題的函數(shù)數(shù)據(jù)庫,包括緩沖區(qū)溢出危險(strcpy(), strcat()函數(shù)等),格式化字符串問題(printf()函數(shù)等),競爭條件(access(),chown()函數(shù)等),shell元字符危險(exec()函數(shù)家族,system()等),以及低劣隨機數(shù)值獲?。╮andom()函數(shù))。然后掃描源代碼文件,通過比對數(shù)據(jù)庫函數(shù),得得到潛在的安全漏洞,最后以HTML格式生成報告。
Splint[4]是用來靜態(tài)檢查 C 語言程序安全弱點和編寫錯誤的工具,能進行多種常規(guī)的檢查,其中包括未使用的變量、使用未定義變量、無法執(zhí)行的代碼、忽略返回值、類型不一致、執(zhí)行路徑未返回、無限循環(huán)等錯誤等。同時它還會通過在源碼中添加注記給出的附加信息,使其可以進行功能更加強大的檢查。同一般的程序分析工具相比,Splint 可以檢查抽象邊界問題,全局變量非法使用問題等,因而可以作為檢測源代碼中緩沖區(qū)溢出漏洞的基礎之一。但是,由于條件約束分析的要求比較嚴格,所以檢測范圍不廣。
Fortify是一款在編譯階段掃描C++/JAVA語言的若干種安全風險的源代碼審計工具,它是集合了Fortify開發(fā)工具包和擁有超過了500個漏洞比較代碼的Fortify源代碼分析服務的一套產(chǎn)品,其列舉所有可以采取行動或執(zhí)行的計算機代碼的路徑,并且迅速發(fā)現(xiàn)計算機代碼的敏感區(qū),然后確定精確的漏洞限制。Fortify開發(fā)工具包會產(chǎn)生一個類似于編譯器生成的輸出,它會停在明顯會產(chǎn)生安全危險的軟件開發(fā)函數(shù)前,會提示代碼使用了危險函數(shù),將會發(fā)生什么以及為什么不要使用這些函數(shù)。此外,F(xiàn)ortify源代碼分析服務可以在整合構造時生成軟件代碼存在的漏洞和安全錯誤分析,也可以分析發(fā)現(xiàn)由軟件函數(shù)接受的外部輸入引起的漏洞,同時讓產(chǎn)品發(fā)現(xiàn)在離散的分段代碼中不存在但是結合其他脆弱的內容便會產(chǎn)生的漏洞。
由于不是所有的程序都公開源代碼,很多商業(yè)的軟件只能得到已經(jīng)編譯好的二進制文件,所以就需要逆向工程的處理,在二進制級上進行審核或者比對。
基于二進制文件的漏洞挖掘分析技術,第一步是識別出目標文件中的函數(shù)、庫函數(shù)以及各種間接跳轉,獲得程序的控制流圖;然后再跟蹤分析反 匯編出來的代碼或者腳本語言,從而識別出一些可疑的匯編代碼序列,進而發(fā)現(xiàn)一些存在漏洞的關鍵信息。
目前基于二進制文件的漏洞挖掘分析技術包括二進制補丁比對、有向圖分析、污點數(shù)據(jù)傳播分析、IDC腳本分析技術等。
目前常用的二進制補丁比對方法主要分為基于文本的比對,基于匯編指令的比對以及基于結構化的比對。前種方法只適用于若干字節(jié)變化的比較,不適合文件修改較多的情況。而第二種方法可以圖形化的顯示比對結果,同時可以發(fā)現(xiàn)一些非結構化的變化(如緩沖區(qū)大小改變等),但是仍然存在輸出結果范圍大,誤報情況多和漏洞定位不精確的缺點。結構化比對從邏輯結構的層次上對補丁文件進行分析,但是當比對的兩個二進制文件較大時程序的執(zhí)行效率會非常低。
有向圖分析技術利用反匯編軟件IDA得到反匯編文件,然后直接通過廣度或者深度優(yōu)先搜索算法,搜索匯編代碼中的Ret,Call指令。根據(jù)軟件邏輯流程得出函數(shù)調用有向圖,用每個調用函數(shù)點作為有向圖的節(jié)點,其中包含了函數(shù)的入口地址,局部變量使用情況,分配的堆??臻g大小,調用者傳遞的參數(shù)以及返回地址等信息。然后在有向圖中判斷每個調用函數(shù)是否進行了參數(shù)邊界檢測,特別是那些容易引發(fā)漏洞的函數(shù)調用。圖1顯示了一個簡單的有向圖。
需要指出的是,由于編譯器的不同,不同函數(shù)被編譯后采用的尋址方式又不盡相同,致使程序在反匯編后,提取相關函數(shù)的匹配搜索變得比較困難,而如何對編譯器進行優(yōu)化又是一個難以解決的問題。
圖1 簡單有向圖示例
污點數(shù)據(jù)傳播分析技術可以分為靜態(tài)分析和動態(tài)分析兩類,這里只對其靜態(tài)分析技術進行介紹。
靜態(tài)的污點數(shù)據(jù)傳播分析涉及數(shù)據(jù)流和控制流等多個方面,首先通過反匯編軟件得到反匯編文本,然后抽取其中的語法、語義特征,記錄數(shù)據(jù)流向,監(jiān)控污染數(shù)據(jù)的產(chǎn)生、傳播軌跡。
對于沒有源碼的二進制文件,污點數(shù)據(jù)傳播分析通過雙向數(shù)據(jù)流分析,從污點數(shù)據(jù)輸入開始,自上而下形成一棵傳播樹;再從反匯編文本中搜索可疑函數(shù)的調用,然后從這些函數(shù)調用的地方開始向上回溯,找到兩者相交的位置(可能不存在交點),從而產(chǎn)生污染流路徑。將污染數(shù)據(jù)標記為“tainted”,通過程序語句傳播“tainted”數(shù)據(jù),凡是對“tainted”數(shù)據(jù)進行添加、插入、合并等操作,那么它的結果值也肯定是“tainted”。最后再分析交點處指令,判斷是否進行了污點數(shù)據(jù)的長度檢查,進而判斷漏洞是否存在。
污點數(shù)據(jù)傳播分析技術在搜索字符串操作函數(shù)時受到編譯器優(yōu)化的影響,同時構造完整的污染點數(shù)據(jù)也是一個難點。
IDC 腳本分析技術主要是基于IDA Pro 的靜態(tài)分析技術,在漏洞挖掘分析時對于緩沖區(qū)溢出漏洞方面的檢測要比前兩種技術更有效[5]。IDC腳本分析技術的關鍵是在匯編代碼中搜索諸如ReadFile,recv等數(shù)據(jù)輸入函數(shù)的調用,在這些函數(shù)后面如果能夠搜索到容易產(chǎn)生漏洞的關鍵函數(shù),比如strcpy(),sprintf()等函數(shù)的調用,則記錄相應的內存地址,并且檢查在調用函數(shù)前是否進行了數(shù)據(jù)長度的檢查,如果沒有就有可能存在潛在的安全漏洞。
虛擬堆棧分析是挖掘緩沖區(qū)溢出漏洞常用的動態(tài)分析技術[6]。它首先進行格式化分析,然后在這基礎上通過動態(tài)攔截軟件運行時的可疑函數(shù)調用,創(chuàng)建記錄所有函數(shù)緩沖區(qū)使用情況的虛擬堆棧表;其次判斷緩沖區(qū)是否在堆中,如果緩沖區(qū)在堆中則定位堆指針,而如果緩沖區(qū)在棧中則通過查詢虛擬棧表,來獲得緩沖區(qū)位置、大小以及函數(shù)的返回地址等信息;最后將得到的信息與限定條件進行比較,得到分析的結果,進而判斷是否存在安全問題,圖2顯示了虛擬堆棧分析的流程。
雖然虛擬堆棧分析的方法比較簡單,但是在虛擬堆棧分析中,如果沒有后期人工分析的有效介入,還是很難實現(xiàn)漏洞的挖掘,因此,漏洞挖掘的成功率在很大程度上依靠人的經(jīng)驗,要實現(xiàn)系統(tǒng)化困難很多。
圖2 虛擬堆棧分析流程
單純地通過靜態(tài)或者動態(tài)地分析挖掘漏洞,總是不可避免的存在一些缺陷和問題。動態(tài)分析和靜態(tài)分析又有著各自的優(yōu)勢,可以通過將靜態(tài)與動態(tài)分析方法相結合進行漏洞挖掘分析,以求更好的彌補各自的缺陷,發(fā)揮各自的優(yōu)勢,達到更好地漏洞挖掘分析效果。
下面以緩沖區(qū)溢出漏洞的挖掘分析為例,詳細闡述這種方法的處理流程,具體方法為:
(1)首先,對于有源代碼的軟件程序,將 目標程序通過源代碼掃描軟件進行分析,查找目 標程序中存在的容易發(fā)生緩沖區(qū)溢出的函數(shù),比如strcpy()、sprintf()等,如果發(fā)現(xiàn)直接進行修改直至沒有。然后將目標程序進行編譯,編譯成為可以執(zhí)行的二進制文件,進而轉為執(zhí)行第二步的漏洞挖掘分析。
(2)對于沒有源代碼的二進制文件,通過反匯編軟件獲得反匯編代碼,然后根據(jù)strcpy()、sprintf()等函數(shù)的特征代碼在目標軟件的反匯編代碼中搜索strcpy()、sprintf()等容易發(fā)生緩沖區(qū)溢出的函數(shù)。再結合IDA或者Ollydbg 動態(tài)加載目標軟件,接著在所有搜索到的關鍵函數(shù)處設置斷點,通過改變輸入數(shù)據(jù)不斷觀察調試器異常行為,最后確認脆弱點。
本文討論了基于源碼、基于二進制文件和基于靜以及動態(tài)結合的漏洞挖掘分析技術。不同的漏洞挖掘技術在漏洞挖掘分析中存在不同的特點,將靜態(tài)分析與動態(tài)分析相結合的漏洞挖掘分析方法相可以更好地發(fā)揮各自的優(yōu)勢,達到更好地漏洞挖掘分析效果。
[1] 周英. 基于詞法分析的源代碼自動分析技術[J]. 計算機與信息技術, 2010(4): 61–62.
[2] Cigital. ITS4. [EB/OL]. http://www.cigital.com/its4.
[3] Cigital. FlawFinder. [EB/OL]. http://www.dwheeler.com/ flaw-finder.
[4] Splint. [EB/OL]. http://splint.org/.
[5] 唐正軍. 網(wǎng)絡入侵檢測系統(tǒng)的設計與實現(xiàn)[M]. 北京: 電子工業(yè)出版社, 2002: 103-251.
[6] 吳晨, 張量, 張靜. ASP. NET+SQLSERVER 數(shù)據(jù)庫開發(fā)與實例[M]. 北京: 清華大學出版社, 2004: 351–422.
[7] 徐欣明. 一種緩沖區(qū)溢出漏洞自動挖掘及漏洞定位技術[D]. 華中科技大學碩士論文, 2008.
[8] 曹軍. Wnidows危急級漏洞挖掘及分析技術研究[D]. 四川大學碩士學位論文, 2006.
[9] 羅鴻彥. 基于逆向分析的緩沖區(qū)溢出漏洞挖掘技術[D]. 上海交通大學工學碩士學位論文, 2008.
[10] 史尤昭. 數(shù)據(jù)挖掘技術研究與應用[J]. 軟件, 2015, 36(11): 38-42.
[11] 印杰, 李千目. 軟件代碼漏洞的電子取證技術綜述[J]. 軟件, 2015, 36(12): 49-59.
Vulnerability Mining based on Source Code and Binary Files
FU Tao
(Jiangsu Elex Software Technology Co., LTD, Nanjing 210044)
The vulnerability mining analysis technology that based on source code is the source code review technical,which attempts to detect possible security vulnerability by reading and analyzing the source code. Moreover, vulnerability mining that based on binary files, which is aimed at the functions, library functions, and various indirect jumps of the object file, obtaining the control flow diagram of the program and analyzing the disassembled code or script language. Accordingly, this vulnerability mining can identify the suspicious assembly code sequence, and then discover the vulnerability information, which provide effective ideas for the scientific implementation of vulnerability mining.
Vulnerability mining; Source code; Binary files; Virtual stack; Dynamic and static combination.
TP311
A
10.3969/j.issn.1003-6970.2018.07.019
傅濤(1980-),男,博士,副研究員,高級工程師,曾獲中國人民解放軍和江蘇省政府科技進步獎。主要研究方向:計算機網(wǎng)絡,信息安全。
本文著錄格式:傅濤. 基于源碼與二進制文件的漏洞挖掘技術[J]. 軟件,2018,39(7):95-97