[摘 要] 軟件測試過程就是一個尋找bug的過程。基于安全性的bug即是漏洞。本文簡單分析了一下漏洞的概念,并著重講述了漏洞挖掘技術(shù)的兩種方法——Fuzz測試和對源代碼的靜態(tài)分析。
[關(guān)鍵詞] 漏洞挖掘 Fuzz測試 靜態(tài)分析
隨著現(xiàn)代軟件工業(yè)的發(fā)展,軟件規(guī)模不斷擴大,軟件內(nèi)部的邏輯也變得異常復(fù)雜。為了保證軟件的質(zhì)量,測試成了極為重要的一環(huán)。人們花費了大量的資源對軟件進行測試。即便如此,不論從理論上還是工程上都沒有任何人敢聲稱能夠徹底消滅軟件中所有的邏輯缺陷——bug。
在形形色色的軟件邏輯缺陷中,有一部分能夠引起非常嚴(yán)重的后果。人們把那種能夠引起軟件做一些“超出設(shè)計范圍的事情”的bug稱為漏洞(vulnerability)。
常見的漏洞包括軟件中的緩沖區(qū)溢出漏洞、網(wǎng)站中的跨站腳本漏洞(XSS)、SQL注入漏洞等。
一、利用漏洞進行攻擊的方法
利用漏洞進行攻擊可以大致分為漏洞挖掘、漏洞分析、漏洞利用三個步驟。這三部分所用的技術(shù)有相同之處,比如都需要精通系統(tǒng)底層知識、逆向工程等;同時也有一定的差異。
1.漏洞挖掘。安全性漏洞往往不會對軟件本身功能造成很大影響,因此很難被QA工程師的功能性測試發(fā)現(xiàn),對于進行“正常操作”的普通用戶來說,更難體會到軟件中的這類邏輯瑕疵了。
2.漏洞分析。一般情況下,我們需要調(diào)試二進制級別的程序,以便進行漏洞分析。在分析漏洞時,可以使用調(diào)試器或者補丁比較器,以及一些反匯編工具(如IDA Pro)來進行。
漏洞分析需要扎實的逆向基礎(chǔ)和調(diào)試技術(shù),除此以外還要精通各種場景下的漏洞利用方法。這種技術(shù)更多依靠的是經(jīng)驗,很難總結(jié)出通用的條款。
3.漏洞利用。漏洞利用技術(shù)已經(jīng)應(yīng)用于多種主流的操作系統(tǒng)和編譯環(huán)境下,主要利用內(nèi)存漏洞(堆棧溢出)和Web應(yīng)用漏洞(腳本注入)等來進行。
二、漏洞挖掘技術(shù)解析
作為攻擊者,除了精通各種漏洞利用技術(shù)之外,要想實施有效的攻擊,還必須掌握一些未公布的0day漏洞;作為安全專家,他們的本職工作就是搶在攻擊者之前盡可能多地挖掘出軟件中的漏洞。
由于安全性漏洞往往有極高的利用價值,例如,導(dǎo)致計算機被非法遠程控制,數(shù)據(jù)庫數(shù)據(jù)泄漏等,所以會引起很多攻擊者的注意,并愿意花費精力去搜尋漏洞。
尋找漏洞的人并非全是攻擊者。大型的軟件企業(yè)也會雇用一些安全專家來測試自已產(chǎn)品中的漏洞。
從技術(shù)角度講,漏洞挖掘?qū)嶋H上是一種高級的測試(QA)。學(xué)術(shù)界一直熱衷于使用靜態(tài)分析的方法尋找源代碼中的漏洞;而在工程界,不管是安全專家還是攻擊者,普遍采用的漏洞挖掘方法是fuzz,這是一種黑盒測試。另外,還有一種靜態(tài)分析方法也比較常用。
三、Fuzz測試
Fuzz測試與基于功能性的測試有所不同,F(xiàn)uzz的主要目的是“crash”、“break”、“destroy”。
Fuzz的測試用例往往是帶有攻擊性的畸形數(shù)據(jù),用以觸發(fā)各種類型的漏洞。Fuzz往往可以觸發(fā)一個緩沖區(qū)溢出漏洞,但卻不能實現(xiàn)有效的exploit,測試人員需要實時地捕捉目標(biāo)程序拋出的異常、發(fā)生的崩潰和寄存器等信息,綜合判斷這些錯誤是不是真正的可利用漏洞。
Fuzz測試最早是由Barton Miller、Lars Fredriksen和Bryan So在一次偶然的情況下想到的。富有經(jīng)驗的測試人員能夠用這種方法crash大多數(shù)程序。
Fuzz的優(yōu)點是迅速、準(zhǔn)確,基本上不會出現(xiàn)錯報;缺點是Fuzz不保證能夠找出系統(tǒng)里所有的漏洞。
File Fuzz就是這種利用“畸形文件”測試軟件魯棒性的方法。您可以在Internet 上找到許多用于File Fuzz的工具,拋開界面、運行平臺等因素不管,一個File Fuzz工具大體的工作流程包括以下幾步。
1.以一個正常的文件模板為基礎(chǔ),按照一定規(guī)則產(chǎn)生一批畸形文件。
2.將畸形文件逐一送入軟件進行解忻,并監(jiān)視軟件是否會拋出異常。
3.記錄軟件產(chǎn)生的錯誤信息,如寄存器狀態(tài)、棧狀態(tài)等。
4.用日志或其他UI形式向測試人員展示異常信息,以進一步鑒定這些錯誤是否能被利用。
四、靜態(tài)分析方法
對于攻擊者來說,他們非常熱衷于使用fuzz工具,因為他們只要找到漏洞就可以了。
研究安全問題的學(xué)者則不同,他們更關(guān)心如何能夠檢測出所有的漏洞(盡管這是不可能的)。因此,學(xué)術(shù)界偏向于對源代碼進行靜態(tài)分析,直接在程序的邏輯上尋找漏洞。這方面的方法和理論有很多,比如數(shù)據(jù)流分析、類型驗證系統(tǒng)、邊界檢驗系統(tǒng)、狀態(tài)機系統(tǒng)等。
目前,已經(jīng)出現(xiàn)了一些通過審計源代碼來檢測漏洞的產(chǎn)品,如:
1.Fortify在編譯階段掃描若干種安全風(fēng)險。
2.Rough Auditing Tool for Security(R.A.T.S)用于分析C/C++語言的語法樹,尋找存在潛在安全問題的函數(shù)調(diào)用。
3.BEAM(Bugs Errors And Mistakes)IBM研究院研發(fā)出的靜態(tài)代碼分析工具使用數(shù)據(jù)流分析的方法,分析源代碼的所有可執(zhí)行路徑,以檢測代碼中潛在的bug。
4.SLAM使用先進的算法,用于檢測驅(qū)動中的bug。
5.Flaw Finder用Python語言開發(fā)的代碼分析工具。
6.Prexis可以審計多種語言的源代碼,審計的漏洞類型超過30種。
靜態(tài)分析方法實際上是一種白盒測試。
靜態(tài)代碼分析技術(shù)有一個缺點,那就是經(jīng)常會產(chǎn)生大量的誤報。使用白盒測試方法的以QA工程師居多。
參考文獻:
[1]王 清:0day安全:軟件漏洞分析技術(shù).北京:電子工業(yè)出版社,2008
[2]軟件加密技術(shù)內(nèi)幕.北京:電子工業(yè)出版社,2004