陳曉燕,高 彥
(78156部隊,蘭州 730020)
基于源碼的漏洞挖掘技術,是以程序源碼為基礎進行分析研究,從中挖掘漏洞的技術方法。使用這種方法的前提條件,是必須獲取目標軟件的源代碼。雖然有這一限制條件,但源碼使得漏洞挖掘的難度大大降低,而借助于各種方法技巧,找到漏洞就相對更加容易一些。因此,在有源碼的情況下,通常都會使用這類方法。
從這個角度可以把這些技術分為白盒測試,黑盒測試和灰盒測試三類。這是一種非常形象的說法。黑盒這個詞在許多領域都有使用,指的是不清楚內(nèi)部結(jié)構的一個體系或整體。而黑盒測試,只是向其進行有目的的輸入,通過觀察這個系統(tǒng)的輸出來猜想輸入對系統(tǒng)產(chǎn)生了什么樣的影響,當經(jīng)過大量的嘗試,就可以確定這個系統(tǒng)在哪些方面存在缺陷,進而發(fā)現(xiàn)漏洞。白盒與灰盒則是相對黑盒而言的。白盒就是要查看這個系統(tǒng)的內(nèi)部結(jié)構,弄懂它整個的工作原理,然后從中找出邏輯上或其他方面的漏洞?;液袆t介于兩者之間,既有反匯編目標軟件,分析其邏輯的思想,又有根據(jù)輸入輸出發(fā)現(xiàn)漏洞的黑盒思想。
漏洞挖掘技術有許多種,在具體使用中的方法也不相同,針對不同的目標軟件,通常會先進行簡單的分析,據(jù)分析結(jié)果來制定一個大概的漏洞挖掘操作思路,這些思路非常靈活,但總的來講,可以總結(jié)出一個一般流程。首先,對于不開源的程序或軟件,要對其反匯編,得到可讀的匯編代碼,然后根據(jù)匯編代碼指令,找到程序的入口、出口,將它分割為表示過程或函數(shù)的組,即對程序進行過程抽象。對于開源程序,由于有源代碼,可直接進行過程抽象。有了過程抽象的結(jié)果后,我們可以對程序進行測試輸入、漏洞掃描或是進行代碼與指令的具體分析。這兩條線路分屬動態(tài)分析與靜態(tài)分析兩種方法,而進行測試輸入也可以作為黑盒測試方法。
主要從兩個方面進行。一是在有源代碼的情況下,由分析者考慮程序員可能會出現(xiàn)的邏輯性錯誤或疏忽,這就需要分析者自身是一位優(yōu)秀的程序工程師,并掌握大量的安全經(jīng)驗和漏洞挖掘技巧。二是針對目標程序,由測試者手工構造特殊輸入條件,這些輸入包括有效的和無效的輸入,然后觀察程序輸出和它所產(chǎn)生的狀態(tài)變化等,從而分析漏洞是否存在。
Fuzzing技術是一種非常典型的黑盒測試技術。它的基本原理是使用大量半有效的數(shù)據(jù)作為應用程序的輸入,以程序是否出現(xiàn)異常為標志,來判定是否存在的漏洞。
Fuzzing技術中的輸入有如下兩個特點,第一是數(shù)量十分龐大,以數(shù)量來覆蓋所有漏洞可能產(chǎn)生的方面,由于通常是使用Fuzz工具來自動完成,大量的輸入就成為可能,從而對輸入的目的性要求降低;第二是它輸入數(shù)據(jù)的半有效性,F(xiàn)uzz工具也并非完全漫無目的的輸入,為了提高效率,設計者對輸入做了必要的規(guī)定,使輸入的必要標識部分有效,讓程序認為這個輸入合法,接受它并讓它在程序內(nèi)部進行處理,而其他的部分則是隨意的,這就使得在程序處理這些數(shù)據(jù)時可能會出現(xiàn)錯誤的結(jié)果,嚴重的甚至可以直接使程序崩潰。
靜態(tài)分析技術的原理是通過分析程序中的語法和語義來發(fā)現(xiàn)程序中常見的安全問題。所謂靜態(tài)分析,就是程序處于靜態(tài),不運行它,也不給輸入,直接通過分析目標程序反匯編的邏輯,發(fā)現(xiàn)其中出現(xiàn)的問題。靜態(tài)分析重點檢查函數(shù)調(diào)用是否有缺陷,返回狀態(tài)是否有異常,特別是有沒有邊界檢查函數(shù)調(diào)用,這些函數(shù)有strcpy、strcat等,它們可能造成緩沖區(qū)溢出,還有需要用戶提供輸入的函數(shù)、在用戶緩沖區(qū)進行指針運算的程序等,因為這些位置最容易出現(xiàn)漏洞,也是程序員容易疏忽的地方。
動態(tài)分析技術,就是在程序動態(tài)運行的過程中對軟件中存在的漏洞進行檢測。運用這種技術,它的目標軟件首先必須是可執(zhí)行程序,并且在分析的過程中還要有輸入操作,然后通過觀察執(zhí)行過程中程序的運行狀態(tài)、內(nèi)存使用狀況和寄存器的值等來發(fā)現(xiàn)潛在問題。其中的原理就是利用操作系統(tǒng)提供的各種接口對運行的程序跟蹤監(jiān)視,來獲得目標程序運行過程中的運行數(shù)據(jù)及運行狀態(tài)以供參考分析。當前比較常用的有環(huán)境錯誤注入法以及數(shù)據(jù)流分析法兩種方法。環(huán)境錯誤注入法,是故意將一些容易引發(fā)錯誤的輸入注入到軟件運行中,然后根據(jù)程序是否有不正常的反應來達到驗證的目的。運用此法,對程序的可靠性及容錯性進也是一種有力的檢驗。
這種技術嚴格來講與別的漏洞挖掘技術有很大的區(qū)別,它并不是用來發(fā)掘一些未知的0day漏洞的,而是用來分析已經(jīng)公布漏洞的原理,可以算是一種漏洞分析技術,其原理就是通過將已經(jīng)發(fā)布的漏洞補丁安裝后,從二進制代碼中具體查出與安裝前不一樣的地方,從而定位這個漏洞的位置,并可以分析出這個漏洞背后的邏輯問題,因此這一技術也稱為補丁比對技術。
總之,每種漏洞挖掘技術的使用都有著一定的限制條件,也有著挖掘時的側(cè)重點,在實際運用時針對具體情況進行判斷,選擇適合的一種或幾種配合使用,達到安全的目的。