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