文雪巍,秦秀媛,王鳳領(lǐng)
(黑龍江財經(jīng)學(xué)院)
0 引言
長期以來,計算機(jī)信息安全這個問題一直在困擾著人們,特別是隨著系統(tǒng)軟件和應(yīng)用軟件的廣泛使用,人們發(fā)現(xiàn)存在漏洞問題非常普遍.在這些漏洞中,數(shù)據(jù)驅(qū)動型漏洞達(dá)到了半數(shù)以上.數(shù)據(jù)驅(qū)動型漏洞是指由數(shù)據(jù)不正確使用引起的溢出產(chǎn)生的漏洞,它分為緩沖區(qū)溢出漏洞和格式化字符串漏洞等[1].
為了減少這種漏洞的出現(xiàn),數(shù)據(jù)驅(qū)動型漏洞的檢測技術(shù)成為了信息安全研究的一個重要課題.原有的檢測方法只能對漏洞語句做到詞法分析和語法分析.該文在此基礎(chǔ)上提出了語義分析的靜態(tài)檢測方法,并實現(xiàn)了一個原型檢測系統(tǒng)[2].該系統(tǒng)可以在軟件開發(fā)完成后,在軟件開發(fā)小組內(nèi)部進(jìn)行檢測,檢測出軟件中是否存在緩沖區(qū)溢出漏洞,以及漏洞出現(xiàn)的位置,為軟件開發(fā)人員提供了更準(zhǔn)確的檢測依據(jù).
1 原型檢測系統(tǒng)的總體設(shè)計
這種面向語義分析的原型檢測系統(tǒng)是以語法分析和編譯原理中的詞法分析為基礎(chǔ)的,采用Wagner對緩沖區(qū)的數(shù)學(xué)描述方法,以實現(xiàn)語義方面的檢測.主要由四個模塊組成原型檢測系統(tǒng),分別是創(chuàng)建程序執(zhí)行流程模塊、綜合處理模塊、詞法分析模塊和緩沖區(qū)預(yù)先搜索模塊四個部分.原型檢測系統(tǒng)的整體結(jié)構(gòu)圖如圖1所示.

圖1 原型檢測系統(tǒng)結(jié)構(gòu)圖
根據(jù)圖1所示,其工作流程是:原型檢測系統(tǒng)首先讀入源代碼文件,如果有多個源代碼文件就逐個讀入.程序有兩個分支,“詞法分析模塊”將源代碼“粉碎”成一個token字序列(一個token字就是一個有屬性標(biāo)記的符號,比如,包括屬性有,標(biāo)識符,數(shù)字,關(guān)鍵字等).“詞法分析模塊”將token字序列傳遞給“緩沖區(qū)預(yù)先搜索模塊”(其實所謂的傳遞就是token字序列是全局變量,全局可見的),“緩沖區(qū)預(yù)先搜索模塊”根據(jù)token字序列,將字符指針,字符緩沖區(qū)等內(nèi)容從token字序列中“提取”出來,存入到固定的數(shù)據(jù)結(jié)構(gòu)中(數(shù)據(jù)結(jié)構(gòu)的描述在“緩沖區(qū)預(yù)先搜索模塊”中).“創(chuàng)建程序執(zhí)行流程模塊”根據(jù)緩沖區(qū)列表和源程序的執(zhí)行流程,對存在關(guān)系的緩沖區(qū)進(jìn)行統(tǒng)計,比如,如果兩個緩沖區(qū)簡直存在關(guān)系,那么就在有向圖中這兩個節(jié)點(diǎn)之間添加一條邊.“創(chuàng)建程序執(zhí)行流程模塊”得到一個緩沖區(qū)之間關(guān)系的有向圖.“綜合處理模塊”獲得token字串序列和流程有向圖,加載漏洞函數(shù)數(shù)據(jù)庫,根據(jù)該文提出的語義分析方法進(jìn)行語義分析,最后將分析的結(jié)果輸出到檢測報告中.
2 原型檢測系統(tǒng)模型的詳細(xì)設(shè)計[3]
2.1 詞法分析模塊
2.1.1 詞法分析算法
源代碼文件的錄入過程就是依靠詞法分析實現(xiàn)的,其本質(zhì)上是將源代碼的源程序轉(zhuǎn)換成眾多的Token字.考慮到源程序各個部分的具體的內(nèi)容互不相同,為了方便檢測和控制,常常將不同的部分轉(zhuǎn)換成特定的Token字進(jìn)行具體的標(biāo)記.如下所示,為常見的C語言類轉(zhuǎn)換語句:

如果要詞法分析上面的C語言語句,可以簡單的將其劃為四個部分即:數(shù)字、特殊字符、變量、關(guān)鍵字,他們分別對應(yīng)著“1”、“=”、“b”、“int”,這樣該C語言的四個部分具有了特定的屬性,這樣既實現(xiàn)了詞法分析.類似的,可以對所有的源文件進(jìn)行這樣的詞法分析.
2.1.2 詞法分析算法流程
圖2為詞法分析算法流程圖,也即Lex的工作流程.

圖2 詞法分析流程
源文件中各個部分都被賦予了特定的屬性后,整個程序就轉(zhuǎn)換成了一個Token字符序列,該序列有明顯的獨(dú)特性,且很多模塊都可以檢測這些Token序列,因此,源文件就很容易被搜索.需要注意整個過程的最基本操作就是詞法分析[4].
2.2 緩沖區(qū)搜索模塊
2.2.1 緩沖區(qū)的搜索方法
在源代碼中開辟緩沖區(qū)可能會引起數(shù)據(jù)驅(qū)動型漏洞,因此必須對源程序中開辟的緩沖區(qū)進(jìn)行具體的檢測.一般要找到源程序中的某一個緩沖區(qū),直接從緩沖區(qū)列表中讀取即可,但是要注意這一緩沖區(qū)列表不是自動生成的,首先需要檢測整個工程,進(jìn)而根據(jù)不同緩沖區(qū)的特點(diǎn)創(chuàng)建而成.2.2.2 模塊的算法流程
模塊的算法流程顯示了緩沖區(qū)搜索的整個過程,如圖3所示.
找到并檢測程序中的緩沖區(qū),并給予其具體的定義,采用專用的數(shù)據(jù)進(jìn)行表征進(jìn)而將其存儲在特定的區(qū)域.為了方便緩沖區(qū)的標(biāo)記和定義,一般要在開辟緩沖區(qū)之前制定一個對應(yīng)緩沖區(qū)具體屬性的表.
2.3 創(chuàng)建程序執(zhí)行流程模塊
改進(jìn)的Wagner處理方法.
在整數(shù)范圍內(nèi)Wagner方法比較常用,但是遇到有向圖循環(huán)時,該處理方法就顯得格外麻煩,因為需要在所有的字符串后都分別設(shè)置一個特別域.因此,為了降低處理過程的復(fù)雜性,可以有意的避免循環(huán)圖的出現(xiàn)或者改變循環(huán)圖為非循環(huán)圖[5].
這里優(yōu)化了Wagner方法,動態(tài)檢測時只處理與之相關(guān)的緩沖區(qū)域,盡量降低對緩沖區(qū)的干擾和影響,涉及到的約束關(guān)系相對比較簡單:

圖3 緩沖區(qū)搜索流程
(1)最常見的約束關(guān)系是緩沖區(qū)的開辟和使用(常與緩沖區(qū)的大小相關(guān));
(2)字符串的長度是否達(dá)到一定值,這時常常要考慮庫文件中的一些函數(shù),這種約束關(guān)系也是常常涉及到[6].
很明顯,上面說到的約束關(guān)系要比普通Wagner方法簡單很多,其十分有效的回避了循環(huán)圖問題,用很少的約束就達(dá)到了目的.但是上面所述的約束也存在兩個很大的缺陷:①不能把所有的緩沖區(qū)的信息都揭示出來;②沒有涉及到堆溢出的處理方法即沒有檢測堆分配和堆指針的安全性.因此,大多時候在搜索模塊必須解決上面所述的兩個突出問題.一般,綜合處理模塊負(fù)責(zé)了程序執(zhí)行流程模塊的程序執(zhí)行流程有向圖和緩沖區(qū)預(yù)先搜索模塊的緩沖區(qū)列表的創(chuàng)建,便于分析程序的語法和語義.
2.4 綜合分析模塊
圖4是綜合分析模塊的算法流程.
綜合分析模塊分析檢索緩沖區(qū)時必須先得到Token字串序列和開辟的緩沖區(qū)的列表,然后參照程序執(zhí)行流程有向圖及定義的危險函數(shù),進(jìn)而確定是否及哪里會出現(xiàn)溢出及有缺陷的語義和內(nèi)容,并將判斷結(jié)果及時的報告到相關(guān)文件中.

圖4 綜合分析流程
3 測試過程
該檢測軟件的測試過程包括兩個點(diǎn):一個是測試具有代表性的開源代碼、另一個是測試存在溢出漏洞的緩沖區(qū).使用上述兩個測試過程進(jìn)行系統(tǒng)檢驗可以得到較為完整的測試結(jié)果,檢驗系統(tǒng)是否能夠正常運(yùn)行.
為對檢測系統(tǒng)做清晰的說明,舉幾個簡單但是特別構(gòu)造的具有緩沖區(qū)溢出漏洞的代碼,給出原型系統(tǒng)的檢測結(jié)果.代碼1為:

從代碼1可以發(fā)現(xiàn),這段代碼具有明顯的數(shù)據(jù)驅(qū)動型漏洞.目的緩沖區(qū)buffer[10]中,開辟的空間大小為10字節(jié),而源緩沖區(qū)“Hello a example”,包括’
凤山县|
信阳市|
宁远县|
富阳市|
新野县|
禄劝|
娱乐|
北川|
金寨县|
泗阳县|
乃东县|
隆子县|
弥渡县|
石家庄市|
阳信县|
桂东县|
贵溪市|
井陉县|
肥城市|
从化市|
郴州市|
石首市|
昌邑市|
桓仁|
新乐市|
海丰县|
方城县|
蒙城县|
左贡县|
手游|
克山县|
绍兴县|
闽清县|
太仓市|
德兴市|
绥宁县|
南宫市|
体育|
青铜峡市|
黄大仙区|
勐海县|