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