孔 軍,吳偉明,谷勇浩
(北京郵電大學(xué) 計算機(jī)學(xué)院,北京 100876)
基于缺陷模式匹配的靜態(tài)源碼分析技術(shù)研究
孔 軍,吳偉明,谷勇浩
(北京郵電大學(xué) 計算機(jī)學(xué)院,北京 100876)
隨著信息技術(shù)的飛速發(fā)展,應(yīng)用軟件的規(guī)模不斷擴(kuò)大,越來越多的軟件安全問題頻頻出現(xiàn),因此如何保證和提高軟件質(zhì)量日益成為一個備受關(guān)注的問題。研究表明,在測試階段修正錯誤所付出的成本比代碼編寫階段多出10倍,因此以靜態(tài)分析的方式來檢測軟件質(zhì)量能大大降低投入成本。基于缺陷模式的軟件測試是近些年發(fā)展起來的一種程序源代碼靜態(tài)分析技術(shù),主要用于自動或者半自動的軟件缺陷檢測及預(yù)防,此類缺陷檢測工具由于效率高和使用簡單等特點(diǎn)在高可信軟件測試中得到了廣泛應(yīng)用。所謂的缺陷模式,是指程序中經(jīng)常發(fā)生的錯誤或缺陷所呈現(xiàn)出的特定規(guī)律。缺陷模式通常由具有領(lǐng)域程序設(shè)計經(jīng)驗(yàn)的人或者測試人員總結(jié)出來。本文通過利用開源軟件為實(shí)驗(yàn)工具,運(yùn)用靜態(tài)分析的相關(guān)理論,自定義檢測器對軟件項(xiàng)目做測試得出了一些存在的問題。
軟件測試;靜態(tài)代碼;缺陷模式;檢測器
本文著錄格式:孔軍,吳偉明,谷勇浩. 基于缺陷模式匹配的靜態(tài)源碼分析技術(shù)研究[J]. 軟件,2016,37(11):146-149
隨著信息技術(shù)的發(fā)展,軟件的規(guī)模不斷擴(kuò)大,越來越多的軟件安全問題頻頻出現(xiàn),因此如何保證和提高軟件質(zhì)量在互聯(lián)網(wǎng)中成為一個備受關(guān)注的問題。根據(jù)Boehm的統(tǒng)計,在軟件開發(fā)總成本中,用在測試上的開銷要占30%到50%,對于某些關(guān)系人類生命安全的關(guān)鍵軟件[1],其測試費(fèi)用甚至高達(dá)所有其他軟件工程階段費(fèi)用總和的三到五倍。因此,提高軟件測試的有效性和測試效率,降低軟件開發(fā)成本已成為迫切需要解決的任務(wù)。
檢測軟件安全質(zhì)量,通常從兩個方面進(jìn)行:動態(tài)分析與靜態(tài)分析。在動態(tài)分析中,需要根據(jù)實(shí)際狀況,設(shè)計多組極限測試數(shù)據(jù),并實(shí)際的執(zhí)行被測
程序;靜態(tài)分析則是掃描源程序,從中找出可能導(dǎo)致錯誤的結(jié)構(gòu)異常,控制流異常及數(shù)據(jù)流異常。靜態(tài)分析較動態(tài)而言,成本低,容易實(shí)現(xiàn),能覆蓋所有路徑且不依賴于特定的運(yùn)行環(huán)境。根據(jù)McConnell所著《Code Complete》中提供的數(shù)據(jù),在測試階段修正錯誤所付出的成本比代碼編寫階段多出10倍。因此采用靜態(tài)分析的方式來檢測軟件質(zhì)量能大大降低成本。
如何保證軟件產(chǎn)品的可靠性,一直都是任何軟件項(xiàng)目致力解決的問題。影響軟件可靠性的因素很多,而軟件缺陷是度量軟件可靠性的一個重要的指標(biāo),減少軟件缺陷才能保證軟件可靠性。
隨著計算機(jī)處理速度的飛速提高,以及內(nèi)存和外存容量的快速增加,軟件在整個系統(tǒng)中的重要性變得越來越高,軟件的規(guī)模和復(fù)雜性急劇增加,軟件的可靠性面臨著危機(jī)。軟件測試在這一階段承受了挑戰(zhàn),許多測試?yán)碚摵蜏y試方法相繼誕生,逐漸形成了一套體系,本文的研究便是基于這些理論和方法。
1.1 代碼安全問題
1.1.1 SQL注入
SQL注入是一種常見的針對web應(yīng)用程序的攻擊,這是通過構(gòu)建特殊的輸入作為參數(shù)傳入Web應(yīng)用程序,而這些輸入大都是SQL語法里的一些組合,通過執(zhí)行SQL語句進(jìn)而執(zhí)行攻擊者所要的操作,其主要原因是程序沒有細(xì)致地過濾用戶輸入的數(shù)據(jù),致使非法數(shù)據(jù)侵入系統(tǒng)。
1.1.2 XSS攻擊
XSS (Cross Site Script) 即為跨站腳本攻擊[2]。它指的是惡意攻擊者往Web頁面里插入惡意腳本代碼,而程序?qū)τ谟脩糨斎雰?nèi)容未過濾,當(dāng)用戶瀏覽該頁之時,嵌入其中Web里面的腳本代碼會被執(zhí)行,從而達(dá)到惡意攻擊用戶的特殊目的。
1.2 代碼質(zhì)量問題
1.1.1 空指針引用
空指針(Null Pointer)引用,是程序設(shè)計語言中一類常見的動態(tài)內(nèi)存錯誤。指針變量可以指向堆地址、靜態(tài)變量和空地址單元,當(dāng)引用指向空地址單元的指針變量時,就會產(chǎn)生空指針引用故障,有可能產(chǎn)生不可預(yù)見的錯誤,導(dǎo)致軟件系統(tǒng)崩。
1.1.2 系統(tǒng)資源未釋放
軟件開發(fā)過程中有很多調(diào)用系統(tǒng)或處理器資源的情況,比如文件流和字符流、數(shù)據(jù)庫連接等等,如果開發(fā)者在開發(fā)軟件時疏忽沒有意識到這個問題,或者是由于代碼問題沒有釋放資源,就有可能導(dǎo)致系統(tǒng)負(fù)載越來越重,嚴(yán)重的會引起系統(tǒng)崩潰,應(yīng)當(dāng)重視資源的回收問題。
2.1 靜態(tài)分析技術(shù)
代碼靜態(tài)分析是指在不運(yùn)行代碼的方式下,通過詞法分析、語法分析、控制流、數(shù)據(jù)流分析等技術(shù)對程序代碼進(jìn)行掃描[3],驗(yàn)證代碼是否滿足規(guī)范性、安全性、可靠性、可維護(hù)性等指標(biāo)的一種代碼分析技術(shù)。目前靜態(tài)分析技術(shù)向模擬執(zhí)行的技術(shù)發(fā)展以能夠發(fā)現(xiàn)更多傳統(tǒng)意義上動態(tài)測試才能發(fā)現(xiàn)的缺陷,例如符號執(zhí)行、抽象解釋、值依賴分析等等并采用數(shù)學(xué)約束求解工具進(jìn)行路徑約減或者可達(dá)性分析以減少誤報增加效率。以下為后續(xù)實(shí)驗(yàn)所需要的具體分析理論。
2.1.1 詞法分析生成token流
詞法分析階段是編譯過程的第一個階段,是編譯的基礎(chǔ)。這個階段的任務(wù)是從左到右一個字符一個字符地讀入源程序,即對構(gòu)成源程序的字符流進(jìn)行掃描然后根據(jù)構(gòu)詞規(guī)則識別單詞(也稱單詞符號或符號)。詞法分析程序可以使用Lex等工具自動生成。
詞法分析是編譯程序的第一個階段且是必要階段;詞法分析的核心任務(wù)是掃描、識別單詞且對識別出的單詞給出定性、定長的處理;實(shí)現(xiàn)詞法分析程序的常用途徑:自動生成,手工生成。
2.1.2 語法分析生成抽象語法樹
語法分析是編譯過程的一個邏輯階段。語法分析的任務(wù)是在詞法分析的基礎(chǔ)上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達(dá)式”等等。語法分析程序判斷源程序在結(jié)構(gòu)上是否正確,源程序的結(jié)構(gòu)由上下文無關(guān)文法描述。
2.1.3 語義分析
語義分析也是編譯過程的一個邏輯階段,語義分析的任務(wù)是對結(jié)構(gòu)上正確的源程序進(jìn)行上下文有關(guān)性質(zhì)的審查,進(jìn)行類型審查。語義分析是審查源程序有無語義錯誤,為代碼生成階段收集類型信息。比如語義分析的一個工作是進(jìn)行類型審查,審查每個算符是否具有語言規(guī)范允許的運(yùn)算對象,當(dāng)不符合語言規(guī)范時,編譯程序應(yīng)報告錯誤[4]。如有的編譯程序要對實(shí)數(shù)用作數(shù)組下標(biāo)的情況報告錯誤。又
比如某些某些程序規(guī)定運(yùn)算對象可被強(qiáng)制,那么當(dāng)二目運(yùn)算施于一整型和一實(shí)型對象時,編譯程序應(yīng)將整型轉(zhuǎn)換為實(shí)型而不能認(rèn)為是源程序的錯誤。
2.2 缺陷模式
軟件缺陷是存在于軟件中的、不期望的或不可接受的偏差,其結(jié)果是當(dāng)軟件運(yùn)行于某一特定條件時將出現(xiàn)軟件故障,軟件缺陷以一種靜態(tài)的形式存在于軟件的內(nèi)部,是軟件開發(fā)過程中人為錯誤的結(jié)果。軟件缺陷的例子有:數(shù)組下標(biāo)不對、循環(huán)變量初值設(shè)置有誤、異常處理方法有誤等。
所謂的缺陷模式,是指程序中經(jīng)常發(fā)生的錯誤或缺陷所呈現(xiàn)出的特定規(guī)律。缺陷模式通常由具有領(lǐng)域程序設(shè)計經(jīng)驗(yàn)的人或者測試人員總結(jié)出來。
下面給出一個缺陷模式分析的例子:缺陷行為:代碼中低效的判斷字符串為空的方法缺陷描述:判斷字符串為空時,不要用equals()方法,而是1ength方法或?qū)傩?,判斷長
度是否為0。代碼圖例:
圖1 缺陷代碼實(shí)例
原因分析:相對于equals(“”)方法,判斷字符串對象長度是否為零的方法速度更快。
解決辦法:應(yīng)該使用str.1ength() ==0來判斷字符串是否為空。
簡言之,缺陷模式匹配的靜態(tài)分析方法就是針對不同的代碼缺陷,總結(jié)并抽象出特定的缺陷模式,具體分析時再將之具體實(shí)現(xiàn)。
本文采用Findbugs開源軟件來作為實(shí)驗(yàn)工具,F(xiàn)indBugs 是一個靜態(tài)分析工具,它檢查類或者JAR文件,將字節(jié)碼與一組缺陷模式進(jìn)行對比以發(fā)現(xiàn)可能的問題。有了靜態(tài)分析工具,就可以在不實(shí)際運(yùn)行程序的情況對軟件進(jìn)行分析。不是通過分析類文件的形式或結(jié)構(gòu)來確定程序的意圖,而是通常使用Visitor模式[5]。下面分為三個步驟來做實(shí)驗(yàn):
1)最重要的一個環(huán)節(jié),根據(jù)常見的軟件缺陷抽象出相應(yīng)模式,來實(shí)現(xiàn)對應(yīng)的檢測器,這里實(shí)現(xiàn)是基于Findbugs源碼,在此基礎(chǔ)上實(shí)現(xiàn)自己用到的檢測器。
2)將實(shí)現(xiàn)的多個檢測器打包,生成Findbugs插件集成在eclipse中。
3)用生成的插件對待測試的一村一品項(xiàng)目源碼進(jìn)行檢測。
整體的實(shí)驗(yàn)流程圖如下所示:
圖2 實(shí)驗(yàn)流程圖
根據(jù)以上實(shí)驗(yàn)步驟,得出實(shí)驗(yàn)結(jié)果,結(jié)果中顯示有23個軟件問題[6],圖中的Scary、Troubling、Of Concern代表的是問題的嚴(yán)重等級,而檢測結(jié)果也有可信度的問題,High confidence即為高可信度,Normal confidence即為一般可信度。下面為實(shí)驗(yàn)的結(jié)果圖:
圖3 實(shí)驗(yàn)結(jié)果圖
然后根據(jù)每個問題的可信度和嚴(yán)重等級進(jìn)行了分類統(tǒng)計,下面的表格就是統(tǒng)計的結(jié)果:
表1 測試結(jié)果分類表
由上面的表格,可以看出,一寸一品項(xiàng)目中存在的代碼缺陷問題,SQL注入[7]和資源未釋放都是比較嚴(yán)重的問題,當(dāng)然其中也有字符串判斷相等時
用了=字符這種可能會引起邏輯錯誤的問題??尚哦仍跍y試的過程中也是比較重要的一個指標(biāo),經(jīng)過人工檢查,高可信的問題中幾乎不存在誤報,而一般可信的問題中有一部分是誤報,因此怎樣降低誤報率也是以后需要完善的。
本文給出了一種基于缺陷模式匹配的靜態(tài)源碼分析研究方法,并做實(shí)驗(yàn)驗(yàn)證了這種方法的可行性與正確性,實(shí)驗(yàn)中通過發(fā)現(xiàn)軟件缺陷本身及其產(chǎn)生遵循一定的規(guī)律,抽象出存在的一些缺陷模式,并借助開源軟件實(shí)現(xiàn)了檢測器[8],利用開源軟件集成實(shí)現(xiàn)的檢測器來對項(xiàng)目進(jìn)行了檢測,檢測出了一些軟件常見的質(zhì)量問題,但同時也發(fā)現(xiàn)了一些不足之處,比如發(fā)現(xiàn)的問題中有一些是誤報的,解決誤報問題將會是以后的重點(diǎn)。
[1] 中央網(wǎng)絡(luò)安全和信息化領(lǐng)導(dǎo)小組成立: 中國從網(wǎng)絡(luò)大國加速邁向網(wǎng)絡(luò)強(qiáng)國[J]. 信息安全與通信保密, 2014, 03: 12-13.
[2] 楊洪路, 宮云戰(zhàn), 高文齡, 白哥樂. 軟件安全靜態(tài)檢測技術(shù)與工具[J]. 信息化縱橫, 2009, 09: 70-72.
[3] 牛婷芝. 一種Java源代碼安全分析系統(tǒng)的設(shè)計與實(shí)現(xiàn)[D].北京郵電大學(xué), 2009.
[4] 霍志鵬. 基于靜態(tài)分析的PHP代碼缺陷檢測[D]. 北京郵電大學(xué) 2015.
[5] 張林, 曾慶凱. 軟件安全漏洞的靜態(tài)檢測技術(shù)[J]. 計算機(jī)工程. 2008(34): 157-159.
[6] 古樂, 史九林. 軟件測試技術(shù)概述[M]. 北京: 清華大學(xué)出版社, 2004.
[7] 趙瑞蓮. 軟件測試方法研究: [博士學(xué)位論文]. 北京: 中國科學(xué)院計算技術(shù)研究所, 2001.
[8] 萬成鋮. 一種基于符號執(zhí)行的Java缺陷檢測工具的設(shè)計與實(shí)現(xiàn)[D]. 北京大學(xué), 2012.
Research on Static Source Analysis Technology Based on Defect Pattern Matching
KONG Jun, WU Wei-ming, GU Yong-hao
(School of Computer Science, Beijing University of Posts and Telecommunications, Beijing 100876, China)
With the rapid development of information technology, the application software continues to expand the scale of software security issues more and more frequent, so how to guarantee and improve the quality of software has become a problem of concern. Research shows that the cost of correcting errors in the testing phase is 10 times more than that of the code, so the quality of the software can be greatly reduced by static analysis. Software testing based on defect pattern is a technique developed in recent years, the source code static analysis, mainly for software defect detection and prevention automatically or semi automatically, this kind of defect detection tool due to the characteristics of high efficiency and simple to use, has been widely used in software testing. The so-called defect mode, is refers to the procedure often occurs the mistake or the flaw place presents the specific rule. Defect modes are often summed up by people or testers who are experienced in the field of program design. In this paper, the use of open source software as an experimental tool, the use of static analysis of the relevant theory, the definition of the software test software project to do some of the existing problems.
Software testing; Static code; Defect pattern; Detector
TP314
A
10.3969/j.issn.1003-6970.2016.11.032
孔軍(1991-),男,研究生,主要研究方向:現(xiàn)代網(wǎng)絡(luò)管理、網(wǎng)絡(luò)安全;吳偉明,女,教授,主要研究方向:現(xiàn)代網(wǎng)絡(luò)管理、網(wǎng)絡(luò)安全;谷勇浩,男,講師,主要研究方向:網(wǎng)絡(luò)安全、移動互聯(lián)網(wǎng)技術(shù)
吳偉明,教授,主要研究方向:現(xiàn)代網(wǎng)絡(luò)管理、網(wǎng)絡(luò)安全。