侯海燕 符志鵬
摘要:該文闡述了網(wǎng)絡(luò)軟件安全檢測(cè)的重要性,介紹了現(xiàn)有的主要檢測(cè)方法,包括形式化安全測(cè)試、基于模型的安全功能測(cè)試、語法測(cè)試、基于故障注入的安全測(cè)試、基于屬性的測(cè)試、模糊測(cè)試、基于風(fēng)險(xiǎn)的安全性測(cè)試、基于故障樹的安全性測(cè)試以及基于滲透的安全性測(cè)試。
關(guān)鍵詞:安全性檢測(cè);功能測(cè)試;漏洞測(cè)試;安全測(cè)試方法
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)25-5847-05
Survey of Software Security Test Technology
HOU Hai-yan, FU Zhi-peng
(College of Medical Technology and Engineering, Henan University of Science and Technology, Luoyang 471000, China)
Abstract: The importance of software security test is described in this paper and the main software security test method is introduced such as model based method, Grammar-based method, Syntax-based method, defects threat tree modeling method and so on.
Key words: security test; functional test; vulnerability test; security test method
在互聯(lián)網(wǎng)普及之前,單機(jī)應(yīng)用程序軟件安全問題并不突出。但是自從互聯(lián)網(wǎng)普及后,軟件安全問題愈加顯加突顯,使得軟件安全性測(cè)試的重要性上升到一個(gè)前所未有的高度。同時(shí),隨著軟件的廣泛應(yīng)用和其規(guī)模、復(fù)雜度的不斷提高,軟件安全性問題日益突出。軟件安全性測(cè)試是保證軟件安全和質(zhì)量、降低軟件安全風(fēng)險(xiǎn)的重要手段。
軟件安全性測(cè)試分為安全功能測(cè)試(Security Functional Testing)和安全漏洞測(cè)試(Security Vulnerability Testing)兩個(gè)方面,如表1所示。
表1 安全功能測(cè)試和安全漏洞測(cè)試
1 軟件安全測(cè)試的主要方法
1.1 形式化安全測(cè)試
建立軟件的數(shù)學(xué)模型,利用形式化規(guī)格說明語言對(duì)其進(jìn)行說明[1],形式規(guī)格說明語言主要包括以下幾類[2]:
基于模型的Z、VDM和B語言;
基于有限狀態(tài)語言,如有限狀態(tài)自動(dòng)機(jī)、SDI;
代數(shù)語言,如OBJ;
基于行為的CSP、CCS、Petri Nets等語言;
混合語言,如離散和連續(xù)數(shù)學(xué)的規(guī)格說明語言;
狀態(tài)圖
形式化安全測(cè)試方法分為定理證明和模型檢測(cè)兩類,如表2所示。
表2 形式化安全測(cè)試方法分類
[定理證明\&模型檢測(cè)\&將程序轉(zhuǎn)換為邏輯公式,然后使用公理和規(guī)則證明程序是否是一個(gè)合法的定理\&運(yùn)用狀態(tài)遷移系統(tǒng)描述軟件行為,運(yùn)用時(shí)序邏輯、計(jì)算樹邏輯等表示軟件執(zhí)行所必須滿足的性質(zhì),通過自動(dòng)搜索遷移系統(tǒng)中不滿足公式或邏輯的狀態(tài)來發(fā)現(xiàn)軟件漏洞\&]
形式化安全測(cè)試的特點(diǎn)是數(shù)學(xué)基礎(chǔ)完備,對(duì)系統(tǒng)理解深入。但,開發(fā)成本高,維護(hù)困難。
1.2 基于模型的安全功能測(cè)試
基于模型的安全性測(cè)試是通過對(duì)軟件的行為和結(jié)構(gòu)進(jìn)行建模,生成測(cè)試模型,繼而由測(cè)試模型生成測(cè)試用例,當(dāng)前主要的軟件測(cè)試模型有馬爾科夫模型、有限狀態(tài)自動(dòng)機(jī)模型、UML模型[3,4]等。
Nahid Shahmehri等[5]提出一種基于模型的方法,用以檢測(cè)和跟蹤運(yùn)行中的軟件所存在的漏洞,這是一種被動(dòng)測(cè)試技術(shù)。開發(fā)者可以很容易的確切的知道工具所針對(duì)的漏洞類型,并且當(dāng)新的漏洞被發(fā)現(xiàn)時(shí)可以通過添加新的方法將工具進(jìn)行擴(kuò)展。
檢測(cè)模型是基于安全目標(biāo)模型SGMs的,它可以顯示產(chǎn)生漏洞的潛在原因,以及各種原因之間的相互關(guān)系。SGMs和威脅樹模型非常類似,后者是將引發(fā)某種威脅的所有因素用樹狀結(jié)構(gòu)描述,前者則是將引起漏洞的所有可能原因用樹狀結(jié)構(gòu)描述。
Mark Blackburn等[6]提出一種基于模型的軟件安全自動(dòng)檢測(cè)方法,該方法提供了一種端對(duì)端的模型構(gòu)造、分析、自動(dòng)測(cè)試用例生成、自動(dòng)執(zhí)行測(cè)試以及結(jié)果分析的綜合技術(shù)手段,該方法適用于各種環(huán)境。該檢測(cè)方法的基礎(chǔ)是對(duì)安全函數(shù)說明進(jìn)行建模,利用Oracle和Interbase數(shù)據(jù)庫引擎自動(dòng)生成模型并進(jìn)行測(cè)試。
1.3 語法測(cè)試
所謂語法就是定義了軟件接受的輸入的數(shù)據(jù)類型和格式。語法測(cè)試是根據(jù)被測(cè)軟件的功能接口的語法生成測(cè)試輸入,檢測(cè)被測(cè)軟件對(duì)各類輸入的響應(yīng),通過觀察被測(cè)軟件輸入與相應(yīng)之間的關(guān)系做出安全性分析[7]。其流程如下:
語法測(cè)試適合對(duì)組件進(jìn)行黑盒測(cè)試[8],根據(jù)組件接口的語法特征,正則表達(dá)可以產(chǎn)生正常和非正常輸入,進(jìn)而觸發(fā)各種安全問題。但是其缺點(diǎn)是測(cè)試樣例的數(shù)量巨大,很難保證測(cè)試覆蓋全面性。
Patrice Godefroid等[9]研究了輸入結(jié)構(gòu)復(fù)雜應(yīng)用程序,利用基于語法的方法對(duì)非法輸入進(jìn)行描述,以提高白盒測(cè)試的效果,提出了一種新的動(dòng)態(tài)測(cè)試用例生成算法。
1.4 基于故障注入的安全測(cè)試
用戶輸入、文件系統(tǒng)、環(huán)境變量、網(wǎng)絡(luò)接口等應(yīng)用程序與環(huán)境之間的交互引起的故障均可作為注入的故障。人為主動(dòng)的將故障引入系統(tǒng),可以加速系統(tǒng)失效,同時(shí)也加速了對(duì)安全問題進(jìn)行排查。具體的方法包括仿真注入、硬件注入、軟件注入等。
Binbin Qu等[10]提出了一種基于客戶機(jī)-服務(wù)器模式的錯(cuò)誤注入測(cè)試方法,用于軟件組件的安全性測(cè)試。作者設(shè)計(jì)了了一種基于API Hooking的錯(cuò)誤注入工具,該工具GCDEFI是基于客戶機(jī)-服務(wù)器模式的,由一個(gè)服務(wù)端和多個(gè)客戶組成。服務(wù)器控制客戶機(jī),收集反饋信息并與客戶機(jī)交互;客戶機(jī)管理API攔截、錯(cuò)誤信息和目標(biāo)組件信息??蛻魴C(jī)注入到測(cè)試驅(qū)動(dòng),處于驅(qū)動(dòng)的地址范圍。GCDEFI運(yùn)行后,控制器從用戶得到錯(cuò)誤類型信息,該信息被保存在客戶機(jī)的錯(cuò)誤管理模塊??刂破饔|發(fā)Activator,將目標(biāo)組件信息送入目標(biāo)組件信息管理器。每當(dāng)API被攔截,調(diào)用者的信息將被獲取,我們查找堆棧和目標(biāo)組件列表,看是否有匹配的組件,如果沒有就返回,如果有就進(jìn)入替代代碼,進(jìn)而執(zhí)行注入的錯(cuò)誤??蛻魴C(jī)中的替代函數(shù)可以與服務(wù)器通信。該工具通用性不好,只在特定的環(huán)境對(duì)特定的組件具有較好的檢測(cè)效果。
Jinfu Chen[11]設(shè)計(jì)了一種典型的COM組件安全性測(cè)試工具——CSTS,該工具具有獲取并分析COM組件、靜態(tài)分析組件漏洞、自動(dòng)生成測(cè)試腳本、生成測(cè)試驅(qū)動(dòng)、注入環(huán)境錯(cuò)誤、引導(dǎo)組建運(yùn)行,記錄安全隱患并寫入日志、安全評(píng)級(jí)等功能。測(cè)試流程如下:
A.創(chuàng)建測(cè)試工程
B.選擇測(cè)試組件
C.分析接口信息
D.生成測(cè)試文件
E.編譯測(cè)試裝置
F.運(yùn)行測(cè)試驅(qū)動(dòng)
G.引導(dǎo)運(yùn)行過程
H.注入環(huán)境錯(cuò)誤
I.開始錯(cuò)誤注入測(cè)試
J.結(jié)束并保存
但是該方法的風(fēng)險(xiǎn)評(píng)級(jí)標(biāo)準(zhǔn)并不明確,有待于進(jìn)一步細(xì)化和明確。
1.5 基于屬性的測(cè)試
基于屬性的安全測(cè)試方法[12]是將確定的程序編寫規(guī)則進(jìn)行編碼,將其作為安全屬性,以此為依據(jù)驗(yàn)證程序代碼是否符合規(guī)則。
1.6 模糊測(cè)試
模糊測(cè)試是一種基于黑盒的隨機(jī)性測(cè)試,通過隨機(jī)地變異正常的程序輸入進(jìn)而檢測(cè)程序響應(yīng),以發(fā)現(xiàn)軟件中存在的漏洞,可用語法規(guī)則生成正常輸入,也可用試探法指導(dǎo)輸入變量的產(chǎn)生。模糊測(cè)試的最大問題在于代碼覆蓋率很低。
Patrice Godefroid等[13]提出了一種白盒模糊測(cè)試方法,這種方法受動(dòng)態(tài)測(cè)試用例生成方法和象征性執(zhí)行方法的啟發(fā):
A.記錄程序在正常狀態(tài)下的運(yùn)行情況;
B.標(biāo)記程序運(yùn)行軌跡、收集輸入的限制條件;
C.將限制條件逐一取消產(chǎn)生新輸入,執(zhí)行不同控制路徑;
D.在啟發(fā)式高代碼覆蓋率方法的輔助下重復(fù)上述過程,完成測(cè)試過程。
該方法的不足之處在于有限的樣本尺寸限制了代碼覆蓋率。
1.7基于風(fēng)險(xiǎn)的安全性測(cè)試
風(fēng)險(xiǎn)即錯(cuò)誤發(fā)生的可能性以及造成的危害程度。基于風(fēng)險(xiǎn)的安全測(cè)試的出發(fā)點(diǎn)和依據(jù)是軟件安全風(fēng)險(xiǎn),把風(fēng)險(xiǎn)分析與管理、安全測(cè)試以及軟件開發(fā)過程系統(tǒng)化。該方法具有在軟件開發(fā)的各個(gè)階段可以把有風(fēng)險(xiǎn)的安全漏洞考慮在內(nèi),將安全測(cè)試與軟件開發(fā)同步進(jìn)行的優(yōu)點(diǎn)[14]。
Brad Arkin、Gary McGraw等人[15]研究了基于風(fēng)險(xiǎn)的安全測(cè)試方法,在軟件開發(fā)的各個(gè)階段進(jìn)行異常場(chǎng)景、誤用模式、風(fēng)險(xiǎn)分析以及滲透測(cè)試等,其實(shí)質(zhì)是將安全測(cè)試相關(guān)過程集成到軟件開發(fā)的整個(gè)生命周期中。
1.8 基于故障樹的安全性測(cè)試
基于故障樹的安全測(cè)試技術(shù)[16-20]是利用故障分析樹和故障樹來生成安全性測(cè)試用例的方法,故障樹(威脅樹)[21]實(shí)際上是一種將系統(tǒng)故障(威脅)形成原因由上到下柱層細(xì)化的過程。
Huang Song[22,23]等選擇了CERT/CC的TOP 10瑕疵用來建立威脅樹以生成測(cè)試序列。
1.8.1 威脅樹
威脅樹由威脅節(jié)點(diǎn)構(gòu)成,根節(jié)點(diǎn)為待檢測(cè)瑕疵,將其向下分解,生成子節(jié)點(diǎn)(即須要實(shí)現(xiàn)父節(jié)點(diǎn)的必要步驟),子節(jié)點(diǎn)繼續(xù)向下分解直到無可分解)。節(jié)點(diǎn)分與節(jié)點(diǎn)和或節(jié)點(diǎn)兩種,如圖2所示。
圖2 節(jié)點(diǎn)類型
以SQL注入為例,其威脅樹和測(cè)試序列生成方法如下:
1.8.2 威脅樹生成方法
A.選擇一種典型瑕疵(待測(cè)瑕疵)作為根節(jié)點(diǎn);
B.分析該節(jié)點(diǎn),并將其作為父節(jié)點(diǎn),將其所對(duì)應(yīng)的所有情況作為子節(jié)點(diǎn);標(biāo)記父節(jié)點(diǎn)位與節(jié)點(diǎn)或者或節(jié)點(diǎn);
C.分解子節(jié)點(diǎn);
D.重復(fù)A-C,直到無可分解。
1.8.3 生成測(cè)試序列
圖3為SQL的注入威脅樹,其中SQL injection為與節(jié)點(diǎn),其五個(gè)子節(jié)點(diǎn)為與關(guān)系,其中第四個(gè)節(jié)點(diǎn)為或節(jié)點(diǎn),則其子節(jié)點(diǎn)為或關(guān)系。其測(cè)試序列為:a-b-c-e-d和a-b-c-f-d。
目前該方法還是手動(dòng)進(jìn)行的,工作量較大,需要設(shè)計(jì)自動(dòng)化的方法才有更大的應(yīng)用價(jià)值。
1.9基于滲透的安全性測(cè)試
這是一種評(píng)估網(wǎng)絡(luò)安全性和主機(jī)系統(tǒng)的模擬攻擊過程,安全工程師可以通過這種方式深入探測(cè)目標(biāo)的安全性。滲透測(cè)試分兩類:被動(dòng)攻擊和主動(dòng)攻擊,被動(dòng)攻擊不直接進(jìn)入目標(biāo)系統(tǒng),而主動(dòng)攻擊則要直接侵入目標(biāo)系統(tǒng)。滲透測(cè)試步驟[24]如下所示:
Shu Xiao[25]等設(shè)計(jì)了一種用于網(wǎng)絡(luò)協(xié)議安全測(cè)試的解決方案,建立了一套完整的協(xié)議代碼健壯性評(píng)估環(huán)境。該環(huán)境的核心測(cè)試系統(tǒng)包括多功能測(cè)試引擎和PDU(協(xié)議數(shù)據(jù)單元)生成工具兩部分。
其中測(cè)試引擎工作流程為,首先由預(yù)定義資源或者命令行參數(shù)來決定內(nèi)部功能模塊的屬性,這些內(nèi)部功能模塊包括發(fā)送接收模塊、反饋模塊、測(cè)試樣本庫模塊;然后,發(fā)送模塊從測(cè)試樣本庫獲取一個(gè)測(cè)試樣本,發(fā)送給指定的后處理單元(TCP/UDP或IP套接字),數(shù)據(jù)被封裝;之后封裝的數(shù)據(jù)傳遞給虛擬網(wǎng)絡(luò)接口,由它發(fā)送給特定的目的單元。與此同時(shí),發(fā)送模塊還會(huì)通知接收單元接收同步響應(yīng)消息,并將其放入響應(yīng)池,然后接收模塊調(diào)用反饋模塊分析返回包,根據(jù)其做出相應(yīng)的修正,來決定下一個(gè)測(cè)試樣本。如此循環(huán),如圖3所示。
PDU(協(xié)議數(shù)據(jù)單元)生成工具由Perl編寫,可以由PDU模版獲取規(guī)則,由此而生成所有的測(cè)試樣本。該系統(tǒng)在發(fā)現(xiàn)一般軟件漏洞以及對(duì)于網(wǎng)絡(luò)協(xié)議漏洞引起的問題的異常處理是十分有效的。適用于現(xiàn)代網(wǎng)絡(luò)產(chǎn)業(yè)環(huán)境中的自動(dòng)檢測(cè)。該系統(tǒng)也支持同步接口錯(cuò)誤注入。作為一種非傳統(tǒng)測(cè)試方法,有助于生產(chǎn)更安全的軟件產(chǎn)品。
該方法具有較大的局限性,僅對(duì)TCP/IP協(xié)議漏洞檢測(cè)有效,對(duì)于其他的協(xié)議和網(wǎng)絡(luò)通訊軟件的測(cè)試還無能為力。
Csaba Nagy[26]等提出的基于輸入相關(guān)錯(cuò)誤的靜態(tài)安全性分析方法是基于這樣一個(gè)思想:輸入數(shù)據(jù)是沿著一定的路徑傳遞的,而錯(cuò)誤可以出現(xiàn)在任何地方,但是當(dāng)錯(cuò)誤出現(xiàn)在該路徑上,它就會(huì)成為一個(gè)安全漏洞。該方法的步驟如下:
A.找到數(shù)據(jù)輸入點(diǎn)
B.得到程序中的輸入點(diǎn)集
C.列出危險(xiǎn)(輸入相關(guān)函數(shù))函數(shù)列表
D.自動(dòng)檢測(cè)
該方法技術(shù)上采用了程序依存圖和系統(tǒng)依存圖來進(jìn)行分析,通過輸入覆蓋指標(biāo)和輸入距離指標(biāo)來衡量數(shù)據(jù)距離原始輸入的距離以及輸入相關(guān)函數(shù)得到輸入的位置,這兩個(gè)指標(biāo)可以告訴我們哪些函數(shù)是和用戶輸入相關(guān)的。得到這些函數(shù)后就可以進(jìn)行自動(dòng)錯(cuò)誤檢測(cè)了。
1.10其他分類方法
此外,根據(jù)測(cè)試對(duì)象的不同,軟件安全測(cè)試還可分為應(yīng)用程序安全測(cè)試、操作系統(tǒng)安全測(cè)試、數(shù)據(jù)庫安全測(cè)試、IIS服務(wù)器安全測(cè)試、網(wǎng)絡(luò)環(huán)境安全測(cè)試。具體如表3所示:
2 總結(jié)
軟件安全測(cè)試的實(shí)現(xiàn)有諸多的困難,需要測(cè)試工程師擁有高效的工具,豐富的經(jīng)驗(yàn)、全面的技能,這是一個(gè)相互聯(lián)系的整體。豐富的經(jīng)驗(yàn)包括對(duì)軟件安全漏洞,以及各種黑客攻擊手段的充分了解;全面的技能包括掌握編程、網(wǎng)絡(luò)、數(shù)據(jù)庫等知識(shí);在此基礎(chǔ)上方能開發(fā)出高效的軟件安全測(cè)試工具。
參考文獻(xiàn):
[1] 魏懷鑒,鮑皖蘇. 形式化方法和測(cè)試技術(shù)及其在安全中的應(yīng)用[J].微計(jì)算機(jī)信息, 2006, 22(11): 55-57.
[2] Chen H, Wagner D. MOPS: an infrastructure for examining security properties of software[C]//Proceedings of the 9th ACM conference on Computer and communications security. ACM, 2002: 235-244.
[3] Lodderstedt T, Basin D, Doser J. SecureUML: A UML-based modeling language for model-driven security[M]//? UML? 2002—The Unified Modeling Language. Springer Berlin Heidelberg, 2002: 426-441.
[4] Sheng Q Z, Benatallah B. ContextUML: a UML-based modeling language for model-driven development of context-aware web services[C]//Mobile Business, 2005. ICMB 2005. International Conference on. IEEE, 2005: 206-212.
[5] Shahmehri N, Mammar A, Montes de Oca E, et al. An advanced approach for modeling and detecting software vulnerabilities[J]. Information and Software Technology, 2012, 54(9): 997-1013.
[6] Blackburn M, Busser R, Nauman A, et al. Model-based approach to security test automation[J]. Proccedings of Quality Week 2001, 2001.
[7] Godefroid P, Kiezun A, Levin M Y. Grammar-based whitebox fuzzing[C]//ACM SIGPLAN Notices. ACM, 2008, 43(6): 206-215.
[8] Tal O, Knight S, Dean T. Syntax-based Vulnerability Testing of Frame-based Network Protocols[C]//PST. 2004: 155-160.
[9] Godefroid P, Kiezun A, Levin M Y. Grammar-based whitebox fuzzing[C]//ACM SIGPLAN Notices. ACM, 2008, 43(6): 206-215.
[10] Qu B, Huang Y, Xie X, et al. A Developed Dynamic Environment Fault Injection Tool for Component Security Testing[C]//Secure Software Integration and Reliability Improvement, 2009. SSIRI 2009. Third IEEE International Conference on. IEEE, 2009: 417-422.
[11] Chen J, Lu Y, Xie X. CSTS: A Prototype Tool for Testing COM Component Security[C]//Hybrid Intelligent Systems, 2009. HIS'09. Ninth International Conference on. IEEE, 2009, 3: 83-88.
[12] Fink G, Bishop M. Property-based testing: a new approach to testing for assurance[J]. ACM SIGSOFT Software Engineering Notes, 1997, 22(4): 74-80.
[13] Godefroid P, Levin M Y, Molnar D A. Automated Whitebox Fuzz Testing[C]//NDSS. 2008, 8: 151-166.
[14] 張澤華,饒若楠,凌君逸.基于風(fēng)險(xiǎn)測(cè)試揭錯(cuò)能力分析[J]. 計(jì)算機(jī)工程, 2004, 30(B12): 72-73.
[15] Brad Arkin, Scott Stender, Gary McGraw: Software Penetration Testing. IEEE Security & Privacy, 2005, 3(1): 84-87.
[16] Myers G J, Sandler C, Badgett T. The art of software testing[M]. John Wiley & Sons, 2011.
[17] Tsipenyuk K, Chess B, McGraw G. Seven pernicious kingdoms: A taxonomy of software security errors[J]. Security & Privacy, IEEE, 2005, 3(6): 81-84.
[18] Firesmith D. Specifying reusable security requirements[J]. Journal of Object Technology, 2004, 3(1): 61-75.
[19]Nancy R, Mead G M G. A portal for software security[J]. IEEE Computer society IEEE Security & Privacy, 2005.
[20] Moberg F. Security analysis of an information system using an attack tree-based methodology[J]. Master's
[21] C.A. Ericson II, Fault tree analysis — a history, in: Proceedings of the 17th International System Safety Conference, 1999.
[22] Song H, Liang W, Changyou Z, et al. A software security testing method based on typical defects[C]//Computer Application and System Modeling (ICCASM), 2010 International Conference on. IEEE, 2010, 5: V5-150-V5-153.
[23] Huang S, Hui Z W, Wang L, et al. A Case Study of Software Security Test Based On Defects Threat Tree Modeling[C]//Multimedia Information Networking and Security (MINES), 2010 International Conference on. IEEE, 2010: 362-365.
[24] 唐秀存,杜德慧.滲透測(cè)試技術(shù)與模型研究[J].計(jì)算機(jī)與信息技術(shù),2007(5):33-35.
[25] Xiao S, Deng L, Li S, et al. Integrated tcp/ip protocol software testing for vulnerability detection[C]//Computer Networks and Mobile Computing, 2003. ICCNMC 2003. 2003 International Conference on. IEEE, 2003: 311-319.
[26] Nagy C, Mancoridis S. Static security analysis based on input-related software faults[C]//Software Maintenance and Reengineering, 2009. CSMR'09. 13th European Conference on. IEEE, 2009: 37-46.