◆劉嘉熹
?
一種基于靜態分析的漏洞分類方案
◆劉嘉熹
(云南大學軟件學院 云南 650500)
本文通過對漏洞挖掘技術的發展現狀進行分析和研究,在對大量簡單程序進行漏洞分析和對前人提出的漏洞挖掘軟件的學習基礎上,提出了一種通過IDA反匯編,進行靜態分析的漏洞分類方案。
漏洞挖掘;分類;靜態分析;IDA
在信息技術發展的歷史上,漏洞一直是難以逃避的話題。隨著互聯網的普及,在越來越多的人接觸到計算機科學技術的同時,基于現代操作系統的技術也使漏洞對于用戶的影響變得越來越大。當系統漏洞被黑客利用時,用戶的個人信息和財產安全會受到不同程度的潛在威脅。2018年初,兩組新型CPU漏洞CVE-2017-5754-Meltdown和CVE-2017-5753/CVE-2017-5715-Spectre被公開,使得用戶本地操作系統底層的信息及用戶的賬號、密碼、郵箱等個人隱私信息都面臨被泄露的風險[1]。
漏洞的存在不僅給企業帶來了巨大的損失,也使用戶的個人設備遭到入侵和控制的風險大大增加。因此,在信息安全領域,漏洞的挖掘和修復一直是備受關注的議題。一般情況下安全人員會使用靜態和動態兩種漏洞檢測方式,其中靜態檢測主要是依靠安全人員的經驗,在沒有源代碼的情況下,首先對存在漏洞的程序進行反匯編處理,通過對代碼的分析發現漏洞,這種基于經驗的處理方式以及大量的重復工作與漏洞數目與日俱增的現狀并不相符。因此,本文提出了一種基于靜態分析的漏洞分類方案。
對快速大量的漏洞挖掘的需求催生了漏洞自動化挖掘技術,這也是漏洞挖掘分類方案的一個重要的應用方向。在漏洞自動化挖掘發展的過程中,Automatic Exploit Generation(AEG)[2]首先提出了自動化漏洞挖掘的方法。近年來,越來越多的研究人員為漏洞的自動化挖掘提出了改進方案,在漏洞利用自動化的發展過程中,為了提高漏洞挖掘效率,開發人員在棧緩沖區溢出漏洞,堆緩沖區溢出漏洞,格式化字符串漏洞,整數溢出漏洞四種類型的基礎上對漏洞分類進行了嘗試。如在360冰刃實驗室的科研成果Digtool[3]中,作者把漏洞分為:
(1)OOB越界訪問漏洞。
(2)UAF釋放后使用漏洞。
(3)Time-Of-Check-To-Time-Of-Use(TOCTTOU)漏洞。
(4)參數未檢查漏洞。
(5)信息泄露。
(6)競爭條件型漏洞。這里指多線程訪問共享內存,而最后的結果取決于線程運行的精確時導致的錯誤[4]。
Digtool軟件的分類較之以往的分類方案更加細化,有利于直接根據最顯著特點找到漏洞。由此可見,根據漏洞的特點對漏洞進行分類的方式可以提高漏洞查找的效率,減少漏洞自動化挖掘的誤報率。
基于對目前漏洞自動化挖掘過程中對漏洞分類方案的分析,本文提出了一種新的分類方案,使用該方案對使用IDA反匯編后的程序進行分析,為自動化漏洞挖掘程序的編寫提供了一種新的分類思路。
在對存在漏洞的程序或文件進行分析時,為了拿到shell,在一些情況下,可以使用system()函數執行指定的字符串的內容獲得目標主機的shell。因此在沒有程序源碼的條件下,使用IDA對程序進行反匯編,直接進行字符串搜索即可查找程序中是否存在system()函數的調用,若程序中調用了system()函數,則通過對程序的邏輯分析,找到調用system()的子函數的地址,利用程序中的漏洞劫持程序流使程序執行位置定位到調用system()的子函數處,從而獲得目標主機的shell。該方式可以很快定位到shell需要執行的子函數的地址,從而利用棧或堆溢出漏洞劫持程序控制流到目標地址,執行對應的子函數獲得shell。
其基本邏輯如下:
If(”system()”exsit){
search the address of the function calls “system()”;
execute that function;
get shell;
}
2003年Cheers Halvar發布的開源的二進制漏洞分析工具BugScam可以基于IDA Pro的反匯編結果進行匯編級的漏洞分析。BugScam采用的全部是函數模型,它總共包含8個函數(strcpy、strcat、sprintf、lstrcpyA、lstrcatA、wsprintfA、sprintf.
MultiByteToWideChar),通過對這些函數進行漏洞特征的提取進行函數特征匹配來分析文件中可能出現漏洞的位置[5]。
BugScam是一個輕量級的漏洞檢測工具,用于較簡單模式的漏洞,它通過針對可能導致緩沖區溢出和格式化字符串的庫函數進行檢查來確定程序中是否存在安全隱患[6],本文在這個基礎上,又提出了結合參數和邏輯進行漏洞檢測的思路。
本文提出的分類方法針對較簡單的程序模式,因此在進行分析和測試時使用的均為簡單的漏洞程序。對于堆溢出漏洞,BugScam工具中的函數模型沒有考慮到函數參數之外的size、length等與分配內存大小有關的變量名,所以在對于邏輯性更強的堆溢出漏洞的檢測中沒有很好地表現。通過對大量程序的檢測和分析可以看出,對于堆溢出漏洞,在對危險函數進行建模檢測的基礎上再對size、length、strdup()函數等與內存分配大小有關的變量及函數等進行檢測,會得到更好的漏洞點定位結果。如果程序中存在size或length等變量名,則檢查程序中是否把用戶自定義的變量大小與為其分配的緩沖區大小進行了比較,不存在比較則存在堆溢出漏洞。同時內存分配函數如strdup()等則會由于64位下16位對齊的原因導致堆地址的溢出。這一方案對堆溢出漏洞進行了檢測和定位,加快了漏洞檢測速度。
結合庫函數在程序中的出現頻率和庫函數的實參進行漏洞檢測是另一種分類方案。
同樣對存在漏洞的程序和文件進行分析和測試,在對漏洞程序的分析中,首先統計了使用IDA反匯編后程序中庫函數被調用的次數,由于較為完善的程序中同一庫函數應該不會大量存在漏洞,故而被調用次數少的函數存在問題導致程序漏洞的概率較大。因此完成調用次數統計之后把庫函數按照被調用次數升序排列,并檢查庫函數的參數,比較實參中buf和size的大小,如果size數組的范圍超過了buf大小,則判斷該函數存在棧溢出漏洞。
在統計中發現,這種判斷方法對于棧溢出漏洞的判斷比較準確,非常適用于對棧溢出漏洞的分析。
本文提出了一種匯編級的漏洞靜態分類方案,并提出了一種提高漏洞挖掘效率,減少漏洞挖掘人員工作負擔的思路。未來將把這一分類方案通過代碼或軟件編寫實現,使其具有實現意義,同時還要不斷完善程序,保證漏洞分類的正確率,減少誤報和漏報。
[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].信息網絡安全,2009.
[6]http://www.nsfocus.net/index.php?act=magazine&do=view&mid=2096.