◆劉嘉熹
?
一種基于靜態(tài)分析的漏洞分類方案
◆劉嘉熹
(云南大學(xué)軟件學(xué)院 云南 650500)
本文通過(guò)對(duì)漏洞挖掘技術(shù)的發(fā)展現(xiàn)狀進(jìn)行分析和研究,在對(duì)大量簡(jiǎn)單程序進(jìn)行漏洞分析和對(duì)前人提出的漏洞挖掘軟件的學(xué)習(xí)基礎(chǔ)上,提出了一種通過(guò)IDA反匯編,進(jìn)行靜態(tài)分析的漏洞分類方案。
漏洞挖掘;分類;靜態(tài)分析;IDA
在信息技術(shù)發(fā)展的歷史上,漏洞一直是難以逃避的話題。隨著互聯(lián)網(wǎng)的普及,在越來(lái)越多的人接觸到計(jì)算機(jī)科學(xué)技術(shù)的同時(shí),基于現(xiàn)代操作系統(tǒng)的技術(shù)也使漏洞對(duì)于用戶的影響變得越來(lái)越大。當(dāng)系統(tǒng)漏洞被黑客利用時(shí),用戶的個(gè)人信息和財(cái)產(chǎn)安全會(huì)受到不同程度的潛在威脅。2018年初,兩組新型CPU漏洞CVE-2017-5754-Meltdown和CVE-2017-5753/CVE-2017-5715-Spectre被公開(kāi),使得用戶本地操作系統(tǒng)底層的信息及用戶的賬號(hào)、密碼、郵箱等個(gè)人隱私信息都面臨被泄露的風(fēng)險(xiǎn)[1]。
漏洞的存在不僅給企業(yè)帶來(lái)了巨大的損失,也使用戶的個(gè)人設(shè)備遭到入侵和控制的風(fēng)險(xiǎn)大大增加。因此,在信息安全領(lǐng)域,漏洞的挖掘和修復(fù)一直是備受關(guān)注的議題。一般情況下安全人員會(huì)使用靜態(tài)和動(dòng)態(tài)兩種漏洞檢測(cè)方式,其中靜態(tài)檢測(cè)主要是依靠安全人員的經(jīng)驗(yàn),在沒(méi)有源代碼的情況下,首先對(duì)存在漏洞的程序進(jìn)行反匯編處理,通過(guò)對(duì)代碼的分析發(fā)現(xiàn)漏洞,這種基于經(jīng)驗(yàn)的處理方式以及大量的重復(fù)工作與漏洞數(shù)目與日俱增的現(xiàn)狀并不相符。因此,本文提出了一種基于靜態(tài)分析的漏洞分類方案。
對(duì)快速大量的漏洞挖掘的需求催生了漏洞自動(dòng)化挖掘技術(shù),這也是漏洞挖掘分類方案的一個(gè)重要的應(yīng)用方向。在漏洞自動(dòng)化挖掘發(fā)展的過(guò)程中,Automatic Exploit Generation(AEG)[2]首先提出了自動(dòng)化漏洞挖掘的方法。近年來(lái),越來(lái)越多的研究人員為漏洞的自動(dòng)化挖掘提出了改進(jìn)方案,在漏洞利用自動(dòng)化的發(fā)展過(guò)程中,為了提高漏洞挖掘效率,開(kāi)發(fā)人員在棧緩沖區(qū)溢出漏洞,堆緩沖區(qū)溢出漏洞,格式化字符串漏洞,整數(shù)溢出漏洞四種類型的基礎(chǔ)上對(duì)漏洞分類進(jìn)行了嘗試。如在360冰刃實(shí)驗(yàn)室的科研成果Digtool[3]中,作者把漏洞分為:
(1)OOB越界訪問(wèn)漏洞。
(2)UAF釋放后使用漏洞。
(3)Time-Of-Check-To-Time-Of-Use(TOCTTOU)漏洞。
(4)參數(shù)未檢查漏洞。
(5)信息泄露。
(6)競(jìng)爭(zhēng)條件型漏洞。這里指多線程訪問(wèn)共享內(nèi)存,而最后的結(jié)果取決于線程運(yùn)行的精確時(shí)導(dǎo)致的錯(cuò)誤[4]。
Digtool軟件的分類較之以往的分類方案更加細(xì)化,有利于直接根據(jù)最顯著特點(diǎn)找到漏洞。由此可見(jiàn),根據(jù)漏洞的特點(diǎn)對(duì)漏洞進(jìn)行分類的方式可以提高漏洞查找的效率,減少漏洞自動(dòng)化挖掘的誤報(bào)率。
基于對(duì)目前漏洞自動(dòng)化挖掘過(guò)程中對(duì)漏洞分類方案的分析,本文提出了一種新的分類方案,使用該方案對(duì)使用IDA反匯編后的程序進(jìn)行分析,為自動(dòng)化漏洞挖掘程序的編寫提供了一種新的分類思路。
在對(duì)存在漏洞的程序或文件進(jìn)行分析時(shí),為了拿到shell,在一些情況下,可以使用system()函數(shù)執(zhí)行指定的字符串的內(nèi)容獲得目標(biāo)主機(jī)的shell。因此在沒(méi)有程序源碼的條件下,使用IDA對(duì)程序進(jìn)行反匯編,直接進(jìn)行字符串搜索即可查找程序中是否存在system()函數(shù)的調(diào)用,若程序中調(diào)用了system()函數(shù),則通過(guò)對(duì)程序的邏輯分析,找到調(diào)用system()的子函數(shù)的地址,利用程序中的漏洞劫持程序流使程序執(zhí)行位置定位到調(diào)用system()的子函數(shù)處,從而獲得目標(biāo)主機(jī)的shell。該方式可以很快定位到shell需要執(zhí)行的子函數(shù)的地址,從而利用?;蚨岩绯雎┒唇俪殖绦蚩刂屏鞯侥繕?biāo)地址,執(zhí)行對(duì)應(yīng)的子函數(shù)獲得shell。
其基本邏輯如下:
If(”system()”exsit){
search the address of the function calls “system()”;
execute that function;
get shell;
}
2003年Cheers Halvar發(fā)布的開(kāi)源的二進(jìn)制漏洞分析工具BugScam可以基于IDA Pro的反匯編結(jié)果進(jìn)行匯編級(jí)的漏洞分析。BugScam采用的全部是函數(shù)模型,它總共包含8個(gè)函數(shù)(strcpy、strcat、sprintf、lstrcpyA、lstrcatA、wsprintfA、sprintf.
MultiByteToWideChar),通過(guò)對(duì)這些函數(shù)進(jìn)行漏洞特征的提取進(jìn)行函數(shù)特征匹配來(lái)分析文件中可能出現(xiàn)漏洞的位置[5]。
BugScam是一個(gè)輕量級(jí)的漏洞檢測(cè)工具,用于較簡(jiǎn)單模式的漏洞,它通過(guò)針對(duì)可能導(dǎo)致緩沖區(qū)溢出和格式化字符串的庫(kù)函數(shù)進(jìn)行檢查來(lái)確定程序中是否存在安全隱患[6],本文在這個(gè)基礎(chǔ)上,又提出了結(jié)合參數(shù)和邏輯進(jìn)行漏洞檢測(cè)的思路。
本文提出的分類方法針對(duì)較簡(jiǎn)單的程序模式,因此在進(jìn)行分析和測(cè)試時(shí)使用的均為簡(jiǎn)單的漏洞程序。對(duì)于堆溢出漏洞,BugScam工具中的函數(shù)模型沒(méi)有考慮到函數(shù)參數(shù)之外的size、length等與分配內(nèi)存大小有關(guān)的變量名,所以在對(duì)于邏輯性更強(qiáng)的堆溢出漏洞的檢測(cè)中沒(méi)有很好地表現(xiàn)。通過(guò)對(duì)大量程序的檢測(cè)和分析可以看出,對(duì)于堆溢出漏洞,在對(duì)危險(xiǎn)函數(shù)進(jìn)行建模檢測(cè)的基礎(chǔ)上再對(duì)size、length、strdup()函數(shù)等與內(nèi)存分配大小有關(guān)的變量及函數(shù)等進(jìn)行檢測(cè),會(huì)得到更好的漏洞點(diǎn)定位結(jié)果。如果程序中存在size或length等變量名,則檢查程序中是否把用戶自定義的變量大小與為其分配的緩沖區(qū)大小進(jìn)行了比較,不存在比較則存在堆溢出漏洞。同時(shí)內(nèi)存分配函數(shù)如strdup()等則會(huì)由于64位下16位對(duì)齊的原因?qū)е露训刂返囊绯觥_@一方案對(duì)堆溢出漏洞進(jìn)行了檢測(cè)和定位,加快了漏洞檢測(cè)速度。
結(jié)合庫(kù)函數(shù)在程序中的出現(xiàn)頻率和庫(kù)函數(shù)的實(shí)參進(jìn)行漏洞檢測(cè)是另一種分類方案。
同樣對(duì)存在漏洞的程序和文件進(jìn)行分析和測(cè)試,在對(duì)漏洞程序的分析中,首先統(tǒng)計(jì)了使用IDA反匯編后程序中庫(kù)函數(shù)被調(diào)用的次數(shù),由于較為完善的程序中同一庫(kù)函數(shù)應(yīng)該不會(huì)大量存在漏洞,故而被調(diào)用次數(shù)少的函數(shù)存在問(wèn)題導(dǎo)致程序漏洞的概率較大。因此完成調(diào)用次數(shù)統(tǒng)計(jì)之后把庫(kù)函數(shù)按照被調(diào)用次數(shù)升序排列,并檢查庫(kù)函數(shù)的參數(shù),比較實(shí)參中buf和size的大小,如果size數(shù)組的范圍超過(guò)了buf大小,則判斷該函數(shù)存在棧溢出漏洞。
在統(tǒng)計(jì)中發(fā)現(xiàn),這種判斷方法對(duì)于棧溢出漏洞的判斷比較準(zhǔn)確,非常適用于對(duì)棧溢出漏洞的分析。
本文提出了一種匯編級(jí)的漏洞靜態(tài)分類方案,并提出了一種提高漏洞挖掘效率,減少漏洞挖掘人員工作負(fù)擔(dān)的思路。未來(lái)將把這一分類方案通過(guò)代碼或軟件編寫實(shí)現(xiàn),使其具有實(shí)現(xiàn)意義,同時(shí)還要不斷完善程序,保證漏洞分類的正確率,減少誤報(bào)和漏報(bào)。
[1]https://www.leiphone.com/news/201801/TIV0ThWMtqMsy.
[2]Avgerinos T, Sang K C, Hao B L T, et al. AEG: Automatic Exploit Generation[J]. Internet Society, 2011.
[3]Digtool: A Virtualization-Based Framework for Detecting Kernel Vulnerabilities. J Pan,G Yan,IS Lab,X Fan; USENIX Security 2017-VANCOUVER, BC, CANADA.
[4]http://tech.ifeng.com/a/20170823/44667365_0.shtml.
[5]劉波,文偉平,孫惠平等. ClearBug一種改進(jìn)的自動(dòng)化漏洞分析工具[J].信息網(wǎng)絡(luò)安全,2009.
[6]http://www.nsfocus.net/index.php?act=magazine&do=view&mid=2096.