孔 軍,吳偉明,谷勇浩
(北京郵電大學 計算機學院,北京 100876)
基于缺陷模式匹配的靜態源碼分析技術研究
孔 軍,吳偉明,谷勇浩
(北京郵電大學 計算機學院,北京 100876)
隨著信息技術的飛速發展,應用軟件的規模不斷擴大,越來越多的軟件安全問題頻頻出現,因此如何保證和提高軟件質量日益成為一個備受關注的問題。研究表明,在測試階段修正錯誤所付出的成本比代碼編寫階段多出10倍,因此以靜態分析的方式來檢測軟件質量能大大降低投入成本。基于缺陷模式的軟件測試是近些年發展起來的一種程序源代碼靜態分析技術,主要用于自動或者半自動的軟件缺陷檢測及預防,此類缺陷檢測工具由于效率高和使用簡單等特點在高可信軟件測試中得到了廣泛應用。所謂的缺陷模式,是指程序中經常發生的錯誤或缺陷所呈現出的特定規律。缺陷模式通常由具有領域程序設計經驗的人或者測試人員總結出來。本文通過利用開源軟件為實驗工具,運用靜態分析的相關理論,自定義檢測器對軟件項目做測試得出了一些存在的問題。
軟件測試;靜態代碼;缺陷模式;檢測器
本文著錄格式:孔軍,吳偉明,谷勇浩. 基于缺陷模式匹配的靜態源碼分析技術研究[J]. 軟件,2016,37(11):146-149
隨著信息技術的發展,軟件的規模不斷擴大,越來越多的軟件安全問題頻頻出現,因此如何保證和提高軟件質量在互聯網中成為一個備受關注的問題。根據Boehm的統計,在軟件開發總成本中,用在測試上的開銷要占30%到50%,對于某些關系人類生命安全的關鍵軟件[1],其測試費用甚至高達所有其他軟件工程階段費用總和的三到五倍。因此,提高軟件測試的有效性和測試效率,降低軟件開發成本已成為迫切需要解決的任務。
檢測軟件安全質量,通常從兩個方面進行:動態分析與靜態分析。在動態分析中,需要根據實際狀況,設計多組極限測試數據,并實際的執行被測
程序;靜態分析則是掃描源程序,從中找出可能導致錯誤的結構異常,控制流異常及數據流異常。靜態分析較動態而言,成本低,容易實現,能覆蓋所有路徑且不依賴于特定的運行環境。根據McConnell所著《Code Complete》中提供的數據,在測試階段修正錯誤所付出的成本比代碼編寫階段多出10倍。因此采用靜態分析的方式來檢測軟件質量能大大降低成本。
如何保證軟件產品的可靠性,一直都是任何軟件項目致力解決的問題。影響軟件可靠性的因素很多,而軟件缺陷是度量軟件可靠性的一個重要的指標,減少軟件缺陷才能保證軟件可靠性。
隨著計算機處理速度的飛速提高,以及內存和外存容量的快速增加,軟件在整個系統中的重要性變得越來越高,軟件的規模和復雜性急劇增加,軟件的可靠性面臨著危機。軟件測試在這一階段承受了挑戰,許多測試理論和測試方法相繼誕生,逐漸形成了一套體系,本文的研究便是基于這些理論和方法。
1.1 代碼安全問題
1.1.1 SQL注入
SQL注入是一種常見的針對web應用程序的攻擊,這是通過構建特殊的輸入作為參數傳入Web應用程序,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程序沒有細致地過濾用戶輸入的數據,致使非法數據侵入系統。
1.1.2 XSS攻擊
XSS (Cross Site Script) 即為跨站腳本攻擊[2]。它指的是惡意攻擊者往Web頁面里插入惡意腳本代碼,而程序對于用戶輸入內容未過濾,當用戶瀏覽該頁之時,嵌入其中Web里面的腳本代碼會被執行,從而達到惡意攻擊用戶的特殊目的。
1.2 代碼質量問題
1.1.1 空指針引用
空指針(Null Pointer)引用,是程序設計語言中一類常見的動態內存錯誤。指針變量可以指向堆地址、靜態變量和空地址單元,當引用指向空地址單元的指針變量時,就會產生空指針引用故障,有可能產生不可預見的錯誤,導致軟件系統崩。
1.1.2 系統資源未釋放
軟件開發過程中有很多調用系統或處理器資源的情況,比如文件流和字符流、數據庫連接等等,如果開發者在開發軟件時疏忽沒有意識到這個問題,或者是由于代碼問題沒有釋放資源,就有可能導致系統負載越來越重,嚴重的會引起系統崩潰,應當重視資源的回收問題。
2.1 靜態分析技術
代碼靜態分析是指在不運行代碼的方式下,通過詞法分析、語法分析、控制流、數據流分析等技術對程序代碼進行掃描[3],驗證代碼是否滿足規范性、安全性、可靠性、可維護性等指標的一種代碼分析技術。目前靜態分析技術向模擬執行的技術發展以能夠發現更多傳統意義上動態測試才能發現的缺陷,例如符號執行、抽象解釋、值依賴分析等等并采用數學約束求解工具進行路徑約減或者可達性分析以減少誤報增加效率。以下為后續實驗所需要的具體分析理論。
2.1.1 詞法分析生成token流
詞法分析階段是編譯過程的第一個階段,是編譯的基礎。這個階段的任務是從左到右一個字符一個字符地讀入源程序,即對構成源程序的字符流進行掃描然后根據構詞規則識別單詞(也稱單詞符號或符號)。詞法分析程序可以使用Lex等工具自動生成。
詞法分析是編譯程序的第一個階段且是必要階段;詞法分析的核心任務是掃描、識別單詞且對識別出的單詞給出定性、定長的處理;實現詞法分析程序的常用途徑:自動生成,手工生成。
2.1.2 語法分析生成抽象語法樹
語法分析是編譯過程的一個邏輯階段。語法分析的任務是在詞法分析的基礎上將單詞序列組合成各類語法短語,如“程序”,“語句”,“表達式”等等。語法分析程序判斷源程序在結構上是否正確,源程序的結構由上下文無關文法描述。
2.1.3 語義分析
語義分析也是編譯過程的一個邏輯階段,語義分析的任務是對結構上正確的源程序進行上下文有關性質的審查,進行類型審查。語義分析是審查源程序有無語義錯誤,為代碼生成階段收集類型信息。比如語義分析的一個工作是進行類型審查,審查每個算符是否具有語言規范允許的運算對象,當不符合語言規范時,編譯程序應報告錯誤[4]。如有的編譯程序要對實數用作數組下標的情況報告錯誤。又
比如某些某些程序規定運算對象可被強制,那么當二目運算施于一整型和一實型對象時,編譯程序應將整型轉換為實型而不能認為是源程序的錯誤。
2.2 缺陷模式
軟件缺陷是存在于軟件中的、不期望的或不可接受的偏差,其結果是當軟件運行于某一特定條件時將出現軟件故障,軟件缺陷以一種靜態的形式存在于軟件的內部,是軟件開發過程中人為錯誤的結果。軟件缺陷的例子有:數組下標不對、循環變量初值設置有誤、異常處理方法有誤等。
所謂的缺陷模式,是指程序中經常發生的錯誤或缺陷所呈現出的特定規律。缺陷模式通常由具有領域程序設計經驗的人或者測試人員總結出來。
下面給出一個缺陷模式分析的例子:缺陷行為:代碼中低效的判斷字符串為空的方法缺陷描述:判斷字符串為空時,不要用equals()方法,而是1ength方法或屬性,判斷長
度是否為0。代碼圖例:

圖1 缺陷代碼實例
原因分析:相對于equals(“”)方法,判斷字符串對象長度是否為零的方法速度更快。
解決辦法:應該使用str.1ength() ==0來判斷字符串是否為空。
簡言之,缺陷模式匹配的靜態分析方法就是針對不同的代碼缺陷,總結并抽象出特定的缺陷模式,具體分析時再將之具體實現。
本文采用Findbugs開源軟件來作為實驗工具,FindBugs 是一個靜態分析工具,它檢查類或者JAR文件,將字節碼與一組缺陷模式進行對比以發現可能的問題。有了靜態分析工具,就可以在不實際運行程序的情況對軟件進行分析。不是通過分析類文件的形式或結構來確定程序的意圖,而是通常使用Visitor模式[5]。下面分為三個步驟來做實驗:
1)最重要的一個環節,根據常見的軟件缺陷抽象出相應模式,來實現對應的檢測器,這里實現是基于Findbugs源碼,在此基礎上實現自己用到的檢測器。
2)將實現的多個檢測器打包,生成Findbugs插件集成在eclipse中。
3)用生成的插件對待測試的一村一品項目源碼進行檢測。
整體的實驗流程圖如下所示:

圖2 實驗流程圖
根據以上實驗步驟,得出實驗結果,結果中顯示有23個軟件問題[6],圖中的Scary、Troubling、Of Concern代表的是問題的嚴重等級,而檢測結果也有可信度的問題,High confidence即為高可信度,Normal confidence即為一般可信度。下面為實驗的結果圖:

圖3 實驗結果圖
然后根據每個問題的可信度和嚴重等級進行了分類統計,下面的表格就是統計的結果:

表1 測試結果分類表
由上面的表格,可以看出,一寸一品項目中存在的代碼缺陷問題,SQL注入[7]和資源未釋放都是比較嚴重的問題,當然其中也有字符串判斷相等時
用了=字符這種可能會引起邏輯錯誤的問題。可信度在測試的過程中也是比較重要的一個指標,經過人工檢查,高可信的問題中幾乎不存在誤報,而一般可信的問題中有一部分是誤報,因此怎樣降低誤報率也是以后需要完善的。
本文給出了一種基于缺陷模式匹配的靜態源碼分析研究方法,并做實驗驗證了這種方法的可行性與正確性,實驗中通過發現軟件缺陷本身及其產生遵循一定的規律,抽象出存在的一些缺陷模式,并借助開源軟件實現了檢測器[8],利用開源軟件集成實現的檢測器來對項目進行了檢測,檢測出了一些軟件常見的質量問題,但同時也發現了一些不足之處,比如發現的問題中有一些是誤報的,解決誤報問題將會是以后的重點。
[1] 中央網絡安全和信息化領導小組成立: 中國從網絡大國加速邁向網絡強國[J]. 信息安全與通信保密, 2014, 03: 12-13.
[2] 楊洪路, 宮云戰, 高文齡, 白哥樂. 軟件安全靜態檢測技術與工具[J]. 信息化縱橫, 2009, 09: 70-72.
[3] 牛婷芝. 一種Java源代碼安全分析系統的設計與實現[D].北京郵電大學, 2009.
[4] 霍志鵬. 基于靜態分析的PHP代碼缺陷檢測[D]. 北京郵電大學 2015.
[5] 張林, 曾慶凱. 軟件安全漏洞的靜態檢測技術[J]. 計算機工程. 2008(34): 157-159.
[6] 古樂, 史九林. 軟件測試技術概述[M]. 北京: 清華大學出版社, 2004.
[7] 趙瑞蓮. 軟件測試方法研究: [博士學位論文]. 北京: 中國科學院計算技術研究所, 2001.
[8] 萬成鋮. 一種基于符號執行的Java缺陷檢測工具的設計與實現[D]. 北京大學, 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-),男,研究生,主要研究方向:現代網絡管理、網絡安全;吳偉明,女,教授,主要研究方向:現代網絡管理、網絡安全;谷勇浩,男,講師,主要研究方向:網絡安全、移動互聯網技術
吳偉明,教授,主要研究方向:現代網絡管理、網絡安全。