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