摘 要: 提出了一種軟件安全漏洞的檢測方法,,重點介紹了靜態(tài)測試,。對當前基于源碼分析的軟件安全測試工具進行了分類并加以分析。
??? 關鍵詞: 軟件安全,;漏洞,;安全測試;靜態(tài)分析;測試工具
?
??? 隨著Internet的迅速普及和社會信息化程度的不斷加深,,信息系統(tǒng)面臨著越來越多的安全威脅,,信息安全問題日益突出。研究表明,,相當數(shù)量的安全問題都是由于軟件自身的安全漏洞引起的[1],。軟件漏洞的產(chǎn)生,既有內因也有外因,。內因方面:設計人員在架構階段沒有明確用戶對安全性方面的需求,,在設計上也沒有考慮安全性,因此,,使得軟件本身存在著缺陷和Bug,。外因方面,軟件的運行環(huán)境不安全,,容易被植入惡意代碼,,遭到黑客攻擊,利用軟件漏洞傳播已成為時下惡意代碼最為常用的手段之一,。
1?軟件安全漏洞檢測方法
1.1?手工分析
??? 手工分析是目前大部分安全研究人員仍在采用的方法,。針對開源軟件,手工分析人員一般是通過諸如SourceInsight之類的源碼閱讀工具來加速源碼檢索和查詢的速度,。比如,,對C或C++程序最簡單的分析一般都是先對系統(tǒng)中gets、strcpy之類不安全的函數(shù)調用進行審查,,進一步的審核安全庫函數(shù)和循環(huán)的使用,。閉源軟件的審查與開源軟件不同,閉源軟件難以獲得源代碼,,因此反匯編引擎和調試器扮演了最重要的角色,,通常在反匯編得到的匯編代碼基礎上進行分析,其難度要遠遠高于源代碼閱讀,。由此造成對程序的理解和對程序的逆向工程等很多困難,。
??? 因此,不論采用什么方法進行手工分析,,都要求安全分析人員既對軟件安全漏洞的原理有深入的了解,,同時還要熟悉軟件本身的結構和功能。即便軟件開發(fā)人員懂得軟件安全漏洞檢測技術,,手工進行漏洞檢測仍然是一件費時耗力的事情,。但由于完全自動化的軟件安全漏洞檢測還沒有實現(xiàn),所以,,人工的參與是必不可少的,。比如,,對靜態(tài)程序分析結果的確認、動態(tài)程序分析數(shù)據(jù)的構造等,。
1.2?動態(tài)測試
軟件動態(tài)測試是通過運行軟件來檢驗軟件的動態(tài)行為和運行結果的正確性,。目前,動態(tài)測試也是軟件測試工作的主要方式,。
動態(tài)測試需要通過程序的執(zhí)行來完成,,有別于靜態(tài)測試得到程序每次執(zhí)行都不變的特性。動態(tài)分析得到程序一次或多次執(zhí)行的信息,,根據(jù)這些信息對特定的漏洞模式進行檢測,,從而完成軟件的安全分析。程序測試和剖析是最常見的標準動態(tài)測試,,因為動態(tài)測試沒有對程序進行抽象處理,,所以其分析結果是十分準確的,如:程序的哪條路徑被執(zhí)行,,程序計算的數(shù)據(jù)值是什么,,程序使用了多少內存或是程序執(zhí)行了多長時間等等。
??? 但動態(tài)測試的結果是不完整的,,一次程序的執(zhí)行情況并不能代表程序以后的可能執(zhí)行情況,。也就是說,一個測試輸入數(shù)據(jù)集不可能保證程序的所有可能執(zhí)行路徑,,僅僅依靠一次或多次的程序執(zhí)行情況有可能無法發(fā)現(xiàn)軟件的安全漏洞,,而這些安全漏洞卻是真實存在的,關鍵是如何設計有良好分支覆蓋和狀態(tài)覆蓋的測試,。
1.3?靜態(tài)測試
靜態(tài)測試作為一種高效的程序分析方法,,受到越來越多的重視。當用戶給出語言的抽象語義后,,該類方法能夠自動發(fā)現(xiàn)滿足所有可能執(zhí)行狀態(tài)的軟件屬性,。靜態(tài)測試方法具有自動化程度高、分析速度快的優(yōu)點,。在實際使用中,,靜態(tài)測試比動態(tài)測試更有效率,并能快速找到缺陷(發(fā)現(xiàn)30%~70%的邏輯設計和編碼缺陷),。盡管靜態(tài)分析方法可能產(chǎn)生一定的漏報(false negatives)或誤報(false positives),,但仍然是當今最實用、最有效的安全漏洞檢測方法之一[2],。
靜態(tài)測試使用靜態(tài)分析技術,直接分析程序的源代碼,,通過詞法分析,、語法分析和靜態(tài)語義分析,,檢測程序中潛在的安全漏洞。目前,,靜態(tài)分析主要有類型推斷,、數(shù)據(jù)流分析和約束分析3種方法。
(1)類型推斷
程序語言的類型系統(tǒng)包括一種定義類型的機制,,有關類型等價,、類型相容和類型推理的規(guī)則。在將運算符作用于運算對象,、執(zhí)行賦值,,或者把實際參數(shù)傳遞給子程序時,都存在著類型是否合適的問題,。類型推斷是一個處理過程,,其目的是保證每個操作都是針對一組數(shù)目正確、類型合適的對象進行,,以保證操作的有效性,。
類型推斷可以檢查類型錯誤,選擇合適的操作,,根據(jù)情況確定必要的類型轉換,。類型推斷方法具有簡單、高效的特點,,非常適合軟件安全漏洞的快速檢測,。采用類型推斷方法檢測的安全漏洞主要有C程序中的格式化字符串漏洞、操作系統(tǒng)內核中的權限檢查[3],,以及操作系統(tǒng)內核中不安全的指針使用[4]等,。
(2)數(shù)據(jù)流分析
數(shù)據(jù)流分析是一項編譯時使用的技術,它能從程序代碼中收集程序的語義信息并通過代數(shù)的方法在編譯時確定變量的定義和使用,。數(shù)據(jù)流分析被用于解決編譯優(yōu)化,、程序驗證、調試,、測試,、并行、向量化和串行編程環(huán)境等問題,。數(shù)據(jù)流分析是通過對變量構造定義實現(xiàn)的,。
數(shù)據(jù)流分析在安全檢測中有著廣泛的用途。應用數(shù)據(jù)流分析技術,,可以檢測C程序中的數(shù)組越界漏洞[5]等多種程序中的安全漏洞,。
(3)約束分析
約束分析方法將程序分析過程分為約束產(chǎn)生和約束求解2個階段,前者利用約束產(chǎn)生規(guī)則建立變量類型或分析狀態(tài)之間的約束系統(tǒng),,后者對這些約束系統(tǒng)進行求解,。
約束系統(tǒng)可以分為等式約束,、集合約束和混合約束3種形式。等式約束的約束項之間只存在相等關系,。集合約束把每個程序變量看成一個值集,,變量賦值被解釋為集合表達式之間的包含關系?;旌霞s束系統(tǒng)由部分等式約束和部分集合約束組成,。
約束分析在安全檢測中的應用也很廣泛。比如,,可以利用集合約束方法檢測C程序中的緩沖區(qū)溢出漏洞,。
(4)3種主要靜態(tài)分析方法的比較
以上介紹的3種主要靜態(tài)分析方法都是通過解釋程序的抽象語義,建立程序屬性的數(shù)學模型,,再通過求解這個數(shù)學模型確定程序的屬性,。相比較而言,約束分析具有最強的檢測能力和最慢的檢測速度,,適合進行軟件的安全檢測,;數(shù)據(jù)流分析具有較強和較快的檢測速度,適合需要考慮控制流信息,,變量屬性之間的操作簡單的靜態(tài)分析問題,;類型推斷則具有最弱的檢測能力和最快的檢測速度,適合檢查屬性域有限,、與控制流無關的安全屬性,。
2?軟件安全靜態(tài)測試工具?
??? 靜態(tài)分析技術通過發(fā)現(xiàn)源代碼中的安全漏洞防止入侵攻擊。靜態(tài)分析程序時不需要執(zhí)行所測試的程序,,它掃描所測試程序的正文,,并對程序的數(shù)據(jù)流和控制流進行分析,然后產(chǎn)生非常人性化的錯誤報告,,告訴用戶發(fā)生錯誤的類型,、位置并提出改正的建議,幫助用戶改進軟件質量,。
??? 軟件安全測試的工具種類很多,,根據(jù)保護程序或者保護軟件系統(tǒng)安全的方式和途徑,對基于源碼分析的軟件安全測試工具進行了分類,,主要分為:詞匯語法分析類工具,、約束分析類工具、擴展編譯類工具,、基于模型測試工具等,。
2.1?詞匯語法分析類工具
??? 詞匯語法分析類工具是安全測試工具中最簡單的工具,通過程序的詞法和語法分析,對源代碼進行靜態(tài)分析,,通過模式匹配找出特定的函數(shù)中可能導致安全問題的缺陷,。
??? 詞匯語法分析類工具使用簡單,、快速,,易于實現(xiàn),通常嵌入到程序編譯器中,,在軟件開發(fā)的過程中發(fā)揮重要作用,。但其局限性比較大,很難檢測出比較復雜的安全問題,,同時此類工具的誤報率比較高,。
??? 詞匯語法分析類工具主要有:ITS4、Flawfinder,、RATS和PScan等,。
2.2?約束分析類工具
??? 約束分析類工具通常利用解析樹產(chǎn)生的約束(也可以利用代碼中添加注釋),對源代碼進行分析,,檢查出可能導致安全問題的缺陷,。
??? 相比于詞匯語法類的分析工具,此類工具能夠更好地分析函數(shù)的安全性,,可以更全面地檢查特定的一些安全漏洞,,通過對解析樹的分析,確定缺陷的位置,。但因其對安全問題檢查是根據(jù)約束完成的,,所以檢查缺陷范圍比較有限。
??? 約束分析類工具主要有:BOON,、CQUAL,、Splint、UNO以及ESC/JAVA,。
2.3?擴展編譯類工具
??? 擴展編譯類工具是通過程序員根據(jù)對安全規(guī)則的理解,,把規(guī)則和注釋寫入到源程序中傳播。同時對編譯器進行擴展,,并對編譯后的程序進行分析,。
??? 擴展編譯類的工具把特殊域合并到編譯過程中,使應用的編寫者不需要懂得內部的編譯方式,,減少了程序員對于編譯的了解,,可以進行系統(tǒng)級的規(guī)則檢查;隱藏執(zhí)行過程中不容易理解的規(guī)則,;降低了誤報率和測試的開銷,。但是這類工具不能檢測多線程類的錯誤。
??? 擴展編譯類工具主要有:xg+,、MC,。
2.4? 基于模型測試的工具
??? 基于模型測試類工具一般是對程序構造出有限狀態(tài)模型,,再檢查其是否存在違反特定安全規(guī)則的問題。
??? 不同于前面工具的是,,模型檢查會為程序建模,,檢查的對象變成抽象化的模型。首先構建程序的有限狀態(tài)模型,,使用形式化方法表示需要檢查的安全屬性,,設計分析算法檢測模型中存在的缺陷。但是現(xiàn)存的模型檢測工具一般針對有限狀態(tài)模型進行分析,,對于模型構建復雜的系統(tǒng),,測試增加了難度。模型的統(tǒng)一形式化表示也是這方面研究的重點,。
??? 模型檢測類的工具有:SLAM,、BLAST、Banera,、MOPS,、The Boop Toolkit、ESP以及FindingBugs等工具,。
??? 對軟件測試工具進行的對比如表1所示,。
?
??? 隨著由軟件安全漏洞引起的信息安全問題日益突出,人們越來越重視軟件安全測試的重要性,。對源代碼進行分析的靜態(tài)測試是保證軟件安全的一個重要方法,,它與動態(tài)測試的檢測方法互為補充,但不可互相替換,。軟件安全靜態(tài)測試工具也已經(jīng)在測試工具中占據(jù)一席之地,,隨著軟件安全測試技術和工具的不斷發(fā)展,已經(jīng)不再只注重于測試安全方面的漏洞,,而是綜合了更多方面的測試[6],,在實際應用中將更加可靠實用。
參考文獻
[1] 劉海燕,,楊洪路,,王崛.C源代碼靜態(tài)安全檢查技術[J].計算機工程,2004,,30(2):28-30.
[2] 夏一民,,羅軍,張民選.基于靜態(tài)分析的安全漏洞檢測技術研究[J].計算機科學,,2006,,33(10):279-282.
[3] ZHANG Xiao Lan,EDWARDS A.Using CQUAL for static analysis of authorization hook[C].Usenix security symposium,USA,,2002.
[4] JOHNSON R,, WAGNER D.Finding user/kernel pointer bugs with type inference[C].Usenix security symposium,2004.
[5] XIE Yi Chen,,CHOU A,,ARCHER E D.Using symbolic pathsensitive analysis to detect memory access errors[C].ESEC/FSE’03,helsinki,,finland,,Sep 2003.
[6] 白哥樂,宮云戰(zhàn),楊朝紅.基于源碼分析的軟件安全測試工具綜述[C].第五屆中國測試學術會議,,2008.