《電子技術應用》
您所在的位置:首頁 > 測試測量 > 業(yè)界動態(tài) > 軟件安全靜態(tài)檢測技術與工具

軟件安全靜態(tài)檢測技術與工具

2009-07-16
作者:楊洪路1,2,宮云戰(zhàn)2,高文齡1

  摘 要: 提出了一種軟件安全漏洞的檢測方法,重點介紹了靜態(tài)測試。對當前基于源碼分析的軟件安全測試工具進行了分類并加以分析。
??? 關鍵詞: 軟件安全;漏洞;安全測試;靜態(tài)分析;測試工具

?

??? 隨著Internet的迅速普及和社會信息化程度的不斷加深,信息系統(tǒng)面臨著越來越多的安全威脅,信息安全問題日益突出。研究表明,相當數(shù)量的安全問題都是由于軟件自身的安全漏洞引起的[1]。軟件漏洞的產生,既有內因也有外因。內因方面:設計人員在架構階段沒有明確用戶對安全性方面的需求,在設計上也沒有考慮安全性,因此,使得軟件本身存在著缺陷和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)分析方法可能產生一定的漏報(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)約束分析
  約束分析方法將程序分析過程分為約束產生和約束求解2個階段,前者利用約束產生規(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ù)流和控制流進行分析,然后產生非常人性化的錯誤報告,告訴用戶發(fā)生錯誤的類型、位置并提出改正的建議,幫助用戶改進軟件質量。
??? 軟件安全測試的工具種類很多,根據(jù)保護程序或者保護軟件系統(tǒng)安全的方式和途徑,對基于源碼分析的軟件安全測試工具進行了分類,主要分為:詞匯語法分析類工具、約束分析類工具、擴展編譯類工具、基于模型測試工具等。
2.1?詞匯語法分析類工具
??? 詞匯語法分析類工具是安全測試工具中最簡單的工具,通過程序的詞法和語法分析,對源代碼進行靜態(tài)分析,通過模式匹配找出特定的函數(shù)中可能導致安全問題的缺陷。
??? 詞匯語法分析類工具使用簡單、快速,易于實現(xiàn),通常嵌入到程序編譯器中,在軟件開發(fā)的過程中發(fā)揮重要作用。但其局限性比較大,很難檢測出比較復雜的安全問題,同時此類工具的誤報率比較高。
??? 詞匯語法分析類工具主要有:ITS4、Flawfinder、RATS和PScan等。
2.2?約束分析類工具
??? 約束分析類工具通常利用解析樹產生的約束(也可以利用代碼中添加注釋),對源代碼進行分析,檢查出可能導致安全問題的缺陷。
??? 相比于詞匯語法類的分析工具,此類工具能夠更好地分析函數(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ù)一席之地,隨著軟件安全測試技術和工具的不斷發(fā)展,已經不再只注重于測試安全方面的漏洞,而是綜合了更多方面的測試[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.

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。