張國強 殷 博 邱 宇 王偉靜
1(國網(wǎng)天津市電力公司電力科學(xué)研究院 天津 300384) 2(國網(wǎng)天津市電力公司 天津 300010) 3(南開大學(xué)計算機與控制工程學(xué)院 天津 300350)
緩沖區(qū)溢出指計算機對接收的輸入數(shù)據(jù)沒有進行有效的檢測導(dǎo)致數(shù)據(jù)占用了合法分配空間之外的內(nèi)存空間,從而使其他內(nèi)存空間的數(shù)據(jù)被覆蓋[1]。一旦發(fā)生緩沖區(qū)溢出會導(dǎo)致內(nèi)存相鄰位置的數(shù)據(jù)被修改、用戶的重要文件被修改甚至導(dǎo)致系統(tǒng)崩潰等嚴(yán)重的安全問題[2]。據(jù)中國國家信息安全漏洞庫統(tǒng)計,緩沖區(qū)溢出漏洞占其收錄的漏洞的22.10%,超危漏洞中有近三分之一是緩沖區(qū)溢出漏洞。
目前用來檢測程序漏洞的方法主要有靜態(tài)檢測技術(shù)和動態(tài)檢測技術(shù)[3-4]。動態(tài)檢測技術(shù)是將漏洞檢測代碼注入到目標(biāo)文件中以發(fā)現(xiàn)問題,它的優(yōu)點就是一般不會產(chǎn)生誤報[5]。但是由于要真正的編譯運行源程序,容易出現(xiàn)性能問題。靜態(tài)檢測技術(shù)是通過靜態(tài)程序分析方法掃描目標(biāo)文件源代碼,以發(fā)現(xiàn)潛在的緩沖區(qū)溢出漏洞。通過靜態(tài)檢測技術(shù)進行檢測速度快且能夠盡早地發(fā)現(xiàn)漏洞,因此它目前是進行漏洞檢測的主要方法[6]。然而由于靜態(tài)檢測技術(shù)不運行源程序,僅通過分析程序語法、結(jié)構(gòu)等來檢測漏洞,因此靜態(tài)檢測技術(shù)的準(zhǔn)確率對程序編碼的規(guī)范性、程序員的編程習(xí)慣以及靜態(tài)檢測方法的檢測強度和適用范圍等具有很強的依賴性。
由于靜態(tài)檢測技術(shù)的局限性,在使用漏洞檢測工具檢測緩沖區(qū)溢出漏洞時,存在著漏報、誤報等問題,使得在使用這些漏洞檢測工具時不能得到準(zhǔn)確的檢測結(jié)果,從而造成嚴(yán)重的軟件安全問題。目前關(guān)于緩沖區(qū)溢出漏洞工具的評估研究,已有一些研究成果。北京航空航天大學(xué)的李舟軍等[7]利用軟件安全漏洞檢測中的輕量級符號執(zhí)行、自動化白盒模糊測試等實現(xiàn)技術(shù)開發(fā)了相關(guān)的漏洞評估和響應(yīng)工具。萊頓大學(xué)的Xypolytos等[8]就漏洞檢測工具評估建立了分析模型并成功用于評估漏洞檢測工具。然而這些評估技術(shù)僅通過模型等定性地分析了各漏洞檢測工具的適用性,對各工具在緩沖區(qū)溢出中的檢測能力以及誤報、漏報等未能定量地進行細(xì)粒度評估,使得它們在應(yīng)用方面有所局限。并且這些評估技術(shù)僅僅針對單個工具進行縱向評估,涉及多個檢測工具的評估時,無法橫向評估各工具之間的性能。
本文研究了目前開源且使用范圍較為廣泛的Cppcheck、Splint、FlawFinder、ITS4和RatScan五種靜態(tài)漏洞檢測工具。提出了基于層次分析法的概率層次分析法,建立了漏洞檢測工具的評估模型。應(yīng)用SARD標(biāo)準(zhǔn)數(shù)據(jù)集分析緩沖區(qū)溢出漏洞的多發(fā)類型并提取其程序特征結(jié)構(gòu),根據(jù)漏洞檢測工具對含有緩沖區(qū)溢出漏洞的數(shù)據(jù)集的靜態(tài)檢測結(jié)果,基于緩沖區(qū)溢出漏洞的特征結(jié)構(gòu)、漏報率和誤報率,對五種典型的緩沖區(qū)溢出漏洞檢測工具進行了分析,綜合評估了各漏洞檢測工具在緩沖區(qū)溢出漏洞檢測方面的適用性和局限性。
Cppcheck基于規(guī)則檢查,用來靜態(tài)檢測C/C++程序中的漏洞,它只檢查編譯器無法檢測出來的bug[9]。Cppcheck檢查的bug主要有:數(shù)組寫操作是否越過上下邊界、內(nèi)存泄漏檢查、未初始化變量檢查、空指針檢查、安全異常檢查、格式化字符串檢查。
Cppcheck僅能檢測出其規(guī)則中規(guī)定的緩沖區(qū)溢出漏洞,對其他類型的緩沖區(qū)溢出漏洞沒有檢測能力。
Splint 基于規(guī)則檢查,主要用于檢測 C 語言的安全漏洞。Splint可以檢測出包括緩沖區(qū)溢出在內(nèi)的基本的源文件漏洞,Splint工具所能檢測出來的漏洞有空指針引用錯誤、內(nèi)存管理錯誤、緩沖區(qū)溢出漏洞等。
和Cppcheck類似,Splint僅能檢測出其規(guī)則中規(guī)定的緩沖區(qū)溢出漏洞。Splint的檢測機制精確,但其精確的檢測是以時間和空間效率為代價,因此Splint所占用的時間、空間資源都較高。
Flawfinder基于詞法分析,是在Linux系統(tǒng)下使用的,其設(shè)計初期就與眾多漏洞數(shù)據(jù)庫關(guān)聯(lián),漏洞數(shù)據(jù)庫中包含了FlawFinder能夠檢測出來的所有漏洞集合,如緩沖區(qū)溢出、格式化串漏洞等。
FlawFinder執(zhí)行速度快,能夠迅速且準(zhǔn)確地檢測到源代碼中潛在的緩沖區(qū)溢出漏洞,但是它僅能檢測出已存在于漏洞數(shù)據(jù)庫中的漏洞,其檢測能力基于漏洞數(shù)據(jù)庫的完備性。
ITS4基于詞法分析,既支持Linux操作系統(tǒng),也支持Windows操作系統(tǒng)。ITS4有一個漏洞數(shù)據(jù)庫,在對C/C++語言程序進行檢查時,將檢測的源文件解析為多個方法標(biāo)記流,對不安全的方法調(diào)用進行分析并確定其危險程度,并將檢查生成的方法標(biāo)記與相應(yīng)的漏洞數(shù)據(jù)庫進行匹配,從而得到源文件中的全部錯誤及其詳細(xì)敘述。
和FlawFinder類似,ITS4僅能檢測出已存在于漏洞數(shù)據(jù)庫中的漏洞,其檢測能力基于漏洞數(shù)據(jù)庫的完備性。
RatScan基于詞法分析,用于C/C++源代碼程序的靜態(tài)檢測[10],可以檢測緩沖區(qū)溢出漏洞、數(shù)組邊界錯誤等,并且會報告漏洞的等級信息和修改建議。RatScan界面清晰、操作方便。
RatScan的局限性與FlawFinder和ITS4類似。
層次分析法AHP(Analytic Hierarchy Process)將與評估相關(guān)的元素分解成目標(biāo)、準(zhǔn)則、方案等不同的層次,并在此基礎(chǔ)上進行定性和定量分析[11],最終將每個評估方案的優(yōu)先級與總體目標(biāo)進行匹配,得出基于組合權(quán)重整體評判的一致性指標(biāo),可以對其進行分析[12]。Wang Min等[13]基于層次分析法提出模糊綜合評價發(fā)進行風(fēng)險評估。Kapil Singi等[14]基于層次分析法優(yōu)化測試用例達(dá)到擇優(yōu)選取測試用例進行軟件測試的目的。層次分析法在進行決策分析時具有系統(tǒng)性、實用性等多種優(yōu)點,但本文在使用層次分析法進行緩沖區(qū)溢出漏洞工具評估過程中,發(fā)現(xiàn)存在著如下缺陷:
(1) 難以模擬真實數(shù)據(jù)。層次分析法在構(gòu)建每個層次要素的比較判斷矩陣時,標(biāo)度值分別使用1、3、5、7、9等代表兩元素之間的重要程度,這種粗粒度的比較難以真正模擬現(xiàn)實中的真實數(shù)據(jù)。在進行緩沖區(qū)溢出漏洞工具評估中,由于檢測工具的復(fù)雜性和層次分析法的低精度造成評估結(jié)果具有較大的偏差。
(2) 當(dāng)涉及多個檢測工具的評估時,無法橫向評估各工具之間的性能。層次分析法僅可以對單個漏洞檢測工具進行性能評估,而難以實現(xiàn)多個漏洞檢測工具之間的評估。這是因為層次分析法僅將評估準(zhǔn)則進行層次劃分來進行單個工具的評估,而在橫向多工具的評估中并沒有進行準(zhǔn)則劃分。因此,層次分析法的這一特性嚴(yán)重影響了在工具評估中的實際應(yīng)用。
針對緩沖區(qū)溢出漏洞檢測工具的評估研究,本文基于層次分析法的思想提出了概率層次分析法,概率層次分析法由如下兩點改進:
(1) 使用符合實際情況的細(xì)粒度標(biāo)度值。在構(gòu)建判斷矩陣時,不嚴(yán)格劃分各重要程度以及各重要程度的標(biāo)度值,根據(jù)實際情況對重要程度及其標(biāo)度值進行賦值。即若a比b重要6.3倍,則其標(biāo)度值則為6.3,實現(xiàn)細(xì)粒度的評估各工具。
(2) 使用概率權(quán)重評估。將每種檢測工具在各評估層次中所占的概率與層次分析法得到的各層次的權(quán)重值相結(jié)合,得到每種檢測工具在各層次的評估值,最后得到每種檢測工具在總層次中的概率權(quán)重評估值,并依據(jù)這個概率權(quán)重評估值對多個工具進行評估。
在使用概率層次分析模型進行評估時主要步驟有下述幾步。
(1) 概率層次分析模型建立因素:目的層、準(zhǔn)則層。
(2) 構(gòu)建每個層次要素的兩個比較判斷矩陣:判斷矩陣是重要性排序的有關(guān)依據(jù),判斷矩陣中的元素aij表示因素i比因素j重要aij倍。
(3) 確定判斷矩陣的特征向量、權(quán)重,并檢驗了判斷矩陣的一致性。根據(jù)權(quán)重來計算和規(guī)格化矩陣的特征向量,以下為判斷矩陣和相應(yīng)特征向量的最大特征值計算方法:
① 正規(guī)化判斷矩陣的每列:
(1)
② 加和正規(guī)化后的每列矩陣:
(2)
(3)
所求的特征向量即為:w=[w1,w2,…,wn]T
對一致性指標(biāo)和測試系數(shù)的計算,驗證了判斷矩陣的一致性及其一致指標(biāo)和測試系數(shù)公式,如下:
(4)
(5)
式中:RI為平均隨機一致性指標(biāo),其近似值如表1所示。
表1 平均隨機一致性指標(biāo)
(4) 一致性測試后,確定了各層的分類權(quán)重。若測試失敗,需要重新校準(zhǔn)判斷矩陣。當(dāng)CR<0.1時,判斷矩陣的整體一致性是較好的,CR>0.1時,需要對判斷矩陣進行調(diào)整。
(5) 相同的整體水平,相對于總體目標(biāo),將各層次的相對權(quán)重進行比較并將其排序,再將排序的相對權(quán)重正確組合并計算,最后的計算結(jié)果應(yīng)與層次一致性的檢查結(jié)果保持一致。在此部分,需要從上到下進行抽取,從而獲得最小元素,以確定優(yōu)先級的相對權(quán)重和整個層次模型的相關(guān)性。
(6) 計算概率權(quán)重評估值:
定義概率權(quán)重公式如式(6)所示,定義Stool為概率權(quán)重評估值,矩陣(C1,C2,…,Ci,…,Cn)為各層次評估準(zhǔn)則權(quán)重,(R1,…,Ri,…,Rn)T為每種檢測工具在各評估層次中所占的概率。
(6)
本文中將緩沖區(qū)溢出漏洞的特征結(jié)構(gòu)定義為各層次評估準(zhǔn)則權(quán)重。漏報率(Rerror)是指使用該工具對某程序進行檢測時未檢測出的漏洞數(shù)占程序中實際存在的漏洞數(shù)的比率。程序用P表示,缺陷模式用M表示,算法用A表示,IP(M,A,P)表示IP的數(shù)量。則漏報率定義為:
(7)
誤報率(Rdistor)是指使用該工具對某程序進行檢測時檢測出的但實際上并不屬于漏洞的漏洞數(shù)占程序中實際存在的漏洞數(shù)的比率。與漏報率類似,程序用P表示,缺陷模式用M表示,算法用A表示,IP(M,A,P)表示IP的數(shù)量,IPN(M,A,P)表示經(jīng)檢查不是漏洞的IP數(shù)。則誤報率定義為:
(8)
因此,將概率層次分析模型用于評估漏洞檢測工具的結(jié)果表達(dá)式為:
(9)
評估架構(gòu)如圖1所示。架構(gòu)模塊主要分為四部分,分別是程序結(jié)構(gòu)分析模塊、工具檢測及漏報率誤報率計算模塊、概率層次分析法分析模塊、工具評估及分析模塊。
圖1 評估分析架構(gòu)
各模塊介紹如下所述:
(1) 程序特征提取模塊 對數(shù)據(jù)集SARD-testsuite-100中的各程序進行分析,提取每個程序的結(jié)構(gòu)特征,并分析程序中緩沖區(qū)溢出漏洞發(fā)生的位置及原因,最后根據(jù)其漏洞發(fā)生位置及引發(fā)原因?qū)彌_區(qū)溢出漏洞多發(fā)類型進行分類。
(2) 工具檢測及漏報率誤報率計算模塊 分別使用Cppcheck、Splint、ITS4、FlawFinder和RatScan五種工具對數(shù)據(jù)集SARD-testsuite-100中的各程序進行檢測,記錄檢測結(jié)果。結(jié)合各程序的結(jié)構(gòu)及漏洞發(fā)生的位置、原因,提取所有能檢測出的緩沖區(qū)溢出漏洞的程序,計算每個工具檢測的漏報數(shù)和誤報數(shù)并進一步計算漏報率和誤報率。
(3) 概率層次分析法分析模塊 使用概率層次分析法,通過構(gòu)建概率層次分析模型、構(gòu)建判斷矩陣并計算權(quán)重、計算概率權(quán)重評估值。若一致性檢驗通過,則得到各緩沖區(qū)溢出漏洞占總體評估準(zhǔn)則的權(quán)重,通過這權(quán)重可以得到各緩沖區(qū)溢出漏洞的嚴(yán)重程度、多發(fā)情況等。
(4) 工具評估及分析模塊 根據(jù)(2)中的漏報率和誤報率兩個準(zhǔn)則和(3)中的各緩沖區(qū)溢出漏洞的權(quán)重大小,對各工具進行評估,結(jié)合緩沖區(qū)溢出漏洞的分類分析各工具使用的適用性和局限性。
使用五個工具對SARD-testsuite-100數(shù)據(jù)集中的程序進行檢測,檢測結(jié)果如表2所示,記錄了每個工具能檢測出的漏洞總數(shù)、漏報數(shù)以及誤報數(shù)。
表2 五個工具對數(shù)據(jù)集的檢查結(jié)果
每種工具的誤報率(Rerror)和漏報率(Rdistor)(即每種檢測工具在評估層次中所占的概率)如表3所示。其中誤報率和漏報率為工具評估準(zhǔn)則是對工具性能等進行評估的一般性指標(biāo)。
表3 漏報率和誤報率計算結(jié)果 %
使用概率層次分析模型進行緩沖區(qū)溢出漏洞檢測工具評估的步驟如下所述。
(1) 構(gòu)建概率層次分析結(jié)構(gòu)模型,如圖2所示。
圖2 概率層次分析結(jié)構(gòu)模型
該概率層次結(jié)構(gòu)模型為:目標(biāo)層為評估準(zhǔn)則A,又分為兩個準(zhǔn)則,分別為漏報B1和誤報B2。準(zhǔn)則層為漏報準(zhǔn)則B1和誤報準(zhǔn)則B2,B1層和B2層結(jié)構(gòu)及權(quán)重分別如圖3和圖4所示。
圖3 漏報B1
圖4 誤報B2
(2) 構(gòu)建細(xì)粒度判斷矩陣并計算權(quán)重。評估準(zhǔn)則A的判斷矩陣及B層相對于A層權(quán)重如表4所示。其中各判斷矩陣中重要程度的標(biāo)度值均是根據(jù)CWE中的信息而統(tǒng)計的各準(zhǔn)則重要程度實際數(shù)據(jù)。
表4 A層判斷矩陣
準(zhǔn)則層中漏報B1的判斷矩陣及C層相對于B1層權(quán)重如表5所示。
表5 B1層判斷矩陣
準(zhǔn)則層中誤報B2的判斷矩陣及C層相對于B2層權(quán)重如表6所示。
表6 B2層判斷矩陣
(3) 對細(xì)粒度判斷矩陣的一致性進行檢驗。計算結(jié)果如下:
A:λmax=2.000 0 CR=0<0.1
B1:λmax=5.128 3 CR=0.028 6<0.1
B2:λmax=3.065 8 CR=0.063 3<0.1
計算所得數(shù)據(jù)表明,一致性檢驗通過。
(4) 層次總排序。排序結(jié)果如表7所示。
表7 層次總排序
(5) 計算概率權(quán)重評估值。根據(jù)表3的概率和表7的權(quán)重,使用式(9)進行計算,結(jié)果如表8所示。
表8 評估計算結(jié)果 %
通過對表9的分析,得出:(1) Cppcheck的漏報缺陷值為28.12%,遠(yuǎn)遠(yuǎn)超過其他檢測工具,但其誤報缺陷值為1.03%,檢測誤報非常低。(2) ITS4的漏報缺陷值為1.28%,漏報很低,但其誤報缺陷值為17.74%,是五種工具中誤報最高的。(3) 五種工具的漏報缺陷值排序為ITS4、Splint、RatScan、FlawFinder、Cppcheck,在使用檢測工具時,若追求低漏報,則性能最優(yōu)的檢測工具為ITS4,其次為Splint。(4) 五種工具的漏報缺陷值排序為Cppcheck、FlawFinder、RatScan、Splint、ITS4,在使用檢測工具時,若追求低誤報,則性能最優(yōu)的檢測工具為Cppcheck,其次為FlawFinder。(5) 五種工具的總?cè)毕葜蹬判驗镕lawFinder、ITS4、RatScan、Splint、Cppcheck,在考慮總體情況下選擇檢測工具時,檢測性能最優(yōu)的FlawFinder和ITS4,分別為9.00%和9.51%。
總體而言,F(xiàn)lawFinder和ITS4的總體檢測性能最優(yōu)。但是在現(xiàn)實應(yīng)用中,若實際需求,若對代碼質(zhì)量要求較高,則在檢測時需使用漏報最低的工具以提高代碼質(zhì)量。若追求代碼質(zhì)量和人力物理投入相平衡,則在檢測時需使用漏報和誤報相均衡的工具,此時RatScan是性能最優(yōu)的檢測工具。因此在實際進行緩沖區(qū)溢出檢測時,應(yīng)根據(jù)相應(yīng)評估結(jié)果,選擇最滿足需求的漏洞檢測工具。
為驗證應(yīng)用概率層次分析模型進行緩沖區(qū)溢出漏洞檢測工具評估的結(jié)果的正確度,使用五種檢測工具對SARD中多個數(shù)據(jù)集進行檢測,記錄檢測結(jié)果并對結(jié)果進行分析,根據(jù)五種漏洞檢測工具對SARD中多個數(shù)據(jù)集的批量檢測結(jié)果分析,可得出:(1) 檢測結(jié)果中ITS4漏報率最低且遠(yuǎn)低于其他檢測工具,而Cppcheck漏報率最高且遠(yuǎn)高于其他檢測工具。但Cppcheck誤報率很低。與使用概率層次分析模型進行分析的結(jié)果基本一致。(2) Splint和ITS4誤報率較高且誤報率相近,均遠(yuǎn)超過其他工具的誤報率。在概率層次分析模型的分析結(jié)果中可以看到,除Splint和ITS4誤報率較高且誤報率相近外,RatScan的誤報率也較高。
在使用概率層次分析模型評估漏洞檢測工具中,使用根據(jù)實際情況而定的細(xì)粒度標(biāo)度值來表述重要程度,得到精確的漏洞檢測工具的評估結(jié)果。(1) 誤報和漏報在每個工具中都是普遍存在的,且漏報率相對較低的檢測工具其檢測率較高,因此其誤報率相對較高。(2) Cppcheck對于指針間賦值、malloc()函數(shù)等動態(tài)分配的內(nèi)存空間以及非定長數(shù)組等引發(fā)的緩沖區(qū)溢出均無法檢測,對于只有在代碼運行后才發(fā)生的緩沖區(qū)溢出漏洞無法檢測。因此其漏報率較大而誤報率很低。(3) Splint對所有可能引發(fā)緩沖區(qū)溢出的不安全語句均會報錯,而不進行進一步的確定緩沖區(qū)溢出是否真正發(fā)生,需要人為地進行檢查排除。因此其誤報率較高而漏報率相對較低。(4) FlawFinder僅能檢測出有限種已存在于漏洞數(shù)據(jù)庫中的緩沖區(qū)溢出漏洞,并且對于指針的越界訪問、數(shù)組的越界訪問等不會報錯,檢測有較大漏報。FlawFinder一旦發(fā)現(xiàn)代碼中存在與漏洞數(shù)據(jù)庫中相匹配的語句就進行報錯,而沒有進一步確認(rèn),因此FlawFinder會產(chǎn)生誤報。(5) ITS4可以解析出所有的不安全的函數(shù)調(diào)用,把它們列入漏洞行列,使工具檢測的誤報率較高。ITS4對于漏洞的解析依賴于已存在的漏洞數(shù)據(jù)庫,因此漏洞數(shù)據(jù)庫中漏洞的不全面性也會導(dǎo)致無法檢查出某些漏洞,從而導(dǎo)致漏報。(6) RatScan主要檢查源程序文件中隱藏的漏洞,對于能引發(fā)緩沖區(qū)溢出的不安全的庫函數(shù)的使用和定長數(shù)組的定義均會報錯,誤報率較大。
本文所構(gòu)建的概率層次分析模型定量評估的結(jié)果與批量檢測的分析結(jié)果一致性較高,
且通過細(xì)粒度標(biāo)度值,使用概率權(quán)重改進型評估,使概率層次分析模型進行評估的結(jié)果精確度很高。因此該模型適用于對多種漏洞檢測工具的綜合評估中,并且提高了評估結(jié)果的準(zhǔn)確性和科學(xué)性。
在實際應(yīng)用中,使用層次分析法進行緩沖區(qū)溢出漏洞檢測工具評估時發(fā)現(xiàn)其有一定的局限性,因此本文在此基礎(chǔ)上提出了概率層次分析法模型。實驗中使用數(shù)據(jù)集SARD-testsuite-100,并使用概率層次分析模型對Cppcheck、Splint、ITS4、FlawFinder和RatScan五種漏洞檢測工具進行了評估,綜合評估了各漏洞檢測工具在緩沖區(qū)溢出漏洞檢測方面的適用性和局限性。實驗證明,概率層次分析法在橫向評估多個漏洞檢測工具上具有有效性,且其評估效果較好。在進一步的工作中,會將概率層次分析法應(yīng)用到其他的多種工具、系統(tǒng)或軟件的評估中。