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