本發(fā)明涉及網(wǎng)絡(luò)安全技術(shù)領(lǐng)域,尤其涉及一種基于隱式污點傳播的漏洞分析方法。
背景技術(shù):
當前軟件漏洞分析主要采用污點傳播分析方法,但傳統(tǒng)的污點傳播通常針對于數(shù)據(jù)依賴進行分析,對于文件類漏洞分析效果較好,但無法追蹤javascript等腳本引發(fā)的瀏覽器漏洞,其原因是此類腳本程序通常采用解析執(zhí)行,在程序邏輯上表現(xiàn)為輸入數(shù)據(jù)產(chǎn)生控制依賴影響程序執(zhí)行的隱式污點傳播過程。因此,提高針對控制依賴的隱式污點傳播分析能力十分必要。
當前基于顯式污點傳播的分析技術(shù),通常使用如下幾種方法:
1、攔截接收外部輸入數(shù)據(jù)的函數(shù),當數(shù)據(jù)被讀入到系統(tǒng)中時,給數(shù)據(jù)所在的內(nèi)存控件打上污點標記。
目前的顯式污點傳播分析方法,主要攔截操作系統(tǒng)中讀取文件、接收網(wǎng)絡(luò)數(shù)據(jù)、讀取注冊表等函數(shù),當函數(shù)返回時,其返回值中的緩沖區(qū)即為讀取到的數(shù)據(jù),可將該緩沖區(qū)數(shù)據(jù)標記為污點。
2、攔截程序執(zhí)行的每一條指令,追蹤污點數(shù)據(jù)使用情況。
監(jiān)控系統(tǒng)的執(zhí)行指令主要方式是使用調(diào)試器附加到目標進程上,或者使用虛擬機從虛擬cpu層面監(jiān)控程序執(zhí)行的每一條指令,分析指令的操作數(shù),如果操作數(shù)引用了污點數(shù)據(jù),則將計算結(jié)果也標記為污點,依該規(guī)則迭代,直到程序執(zhí)行完成或用戶停止該分析過程。
現(xiàn)有軟件漏洞分析中的污點傳播分析方法代表性工作包括bitblaze系統(tǒng)、panda平臺、decaf平臺等,這些系統(tǒng)主要針對于數(shù)據(jù)依賴產(chǎn)生的顯式污點傳播實現(xiàn)。當前瀏覽器大量使用javascript技術(shù),漏洞攻擊代碼使用javascript控制內(nèi)存布局、覆蓋控制流轉(zhuǎn)移地址,這些操作都通過腳本解析引擎對輸入的腳本字符串進行解析實現(xiàn),輸入的腳本內(nèi)容并不與程序產(chǎn)生直接的數(shù)據(jù)依賴關(guān)系,現(xiàn)有漏洞分析方法基于顯式污點傳播實現(xiàn),只根據(jù)指令和輸入數(shù)據(jù)之間的數(shù)據(jù)依賴關(guān)系展開分析,當分析腳本類漏洞時,會產(chǎn)生分析過程中止的情況,無法達到分析效果。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是提供一種基于隱式污點傳播的漏洞分析方法,通過該分析方法能夠快速確定是哪些輸入數(shù)據(jù)影響了漏洞的控制流劫持點,實現(xiàn)對腳本類程序引發(fā)的漏洞分析中控制依賴引起的污點傳播過程的監(jiān)控。
針對上述目的,本發(fā)明所采用的技術(shù)方案為:
一種基于隱式污點傳播的漏洞分析方法,其步驟包括:
1)提取待分析程序的控制流圖(cfg,controlflowgraph);
2)計算上述控制流圖中每一條指令的前后必經(jīng)節(jié)點的控制依賴關(guān)系;
3)啟動上述程序并監(jiān)控該程序執(zhí)行的每一條指令;
4)將監(jiān)控到的該程序調(diào)用的讀數(shù)據(jù)操作函數(shù)的返回值加入到污點記錄中;
5)追蹤程序執(zhí)行的指令,計算正向污點傳播過程,直到程序出現(xiàn)異常或中止分析過程;
6)如果僅有步驟5)中計算得到的顯式污點傳播路徑,則從程序中存在的控制流劫持點為起點開始逆向回溯,若出現(xiàn)回溯中斷,則采用隱式污點傳播;所述隱式污點傳播包括以下步驟:
a)確定污點在逆向回溯傳播過程中出現(xiàn)回溯中斷的指令i;
b)分析步驟2)中得到的控制依賴關(guān)系,尋找指令i所依賴的指令j;
c)將指令j作為新起點加入到回溯路徑中;
d)由指令j開始繼續(xù)向前回溯,直到到達原始的污點數(shù)據(jù)。
進一步地,該方法步驟還包括:當逆向回溯到達原始的污點數(shù)據(jù)時輸出污點回溯結(jié)果。
更進一步地,所述污點回溯結(jié)果是指回溯得到的指令序列、回溯到達的原始輸入數(shù)據(jù)。
進一步地,步驟1)中使用idapro對待分析程序進行靜態(tài)分析得到該程序的控制流圖。
進一步地,步驟3)中所述程序在操作系統(tǒng)中使用調(diào)試工具或插裝工具啟動和監(jiān)控,且啟動時攔截該程序的文件讀寫、網(wǎng)絡(luò)接收、注冊表查詢函數(shù)。
進一步地,步驟4)中所述污點是指監(jiān)控到的該程序調(diào)用的文件讀寫、網(wǎng)絡(luò)接收、注冊表查詢函數(shù)的返回值。
進一步地,步驟5)中所述正向污點傳播是指分析每一條指令的源操作數(shù)和目的操作數(shù),根據(jù)現(xiàn)有的顯式污點傳播規(guī)則進行計算,直至程序執(zhí)行出現(xiàn)異常或中止分析過程;其中所述中止分析過程是指研究人員根據(jù)自身經(jīng)驗認為漏洞已經(jīng)觸發(fā)進而中止分析的過程。
進一步地,步驟6)中所述控制流劫持點是指程序發(fā)生異常時控制流轉(zhuǎn)移的指令,且被劫持的目標地址通常是攻擊者通過構(gòu)造輸入數(shù)據(jù)寫入。
進一步地,步驟6)還包括:當通過隱式污點傳播連接斷開的傳播過程,連接上的指令在顯式污點傳播路徑上時,則以該指令為起點繼續(xù)逆向回溯。
本發(fā)明的有益效果在于:本發(fā)明提供一種基于隱式污點傳播的漏洞分析方法,通過將靜態(tài)分析和動態(tài)分析結(jié)果相結(jié)合,實現(xiàn)對漏洞分析中控制依賴引起的污點傳播過程的監(jiān)控,進而解決動態(tài)污點傳播方法針對腳本類程序引發(fā)的漏洞分析能力不足的問題,達到污點傳播過程中對漏洞完整、準確分析的目的,且相對于現(xiàn)有的基于顯式污點傳播的漏洞分析方法,具有更高的準確度和更好的分析能力。
附圖說明
圖1為本發(fā)明一種基于隱式污點傳播的漏洞分析方法流程圖。
具體實施方式
為使本發(fā)明的上述特征和優(yōu)點能更明顯易懂,下文特舉實施例,并配合所附圖作詳細說明如下。
本發(fā)明提供一種基于隱式污點傳播的漏洞分析方法,其流程圖如圖1所示,包括以下步驟:
1)使用idapro對待分析程序進行靜態(tài)分析得到該程序的控制流圖,計算該控制流圖中每一條指令的前后必經(jīng)節(jié)點的控制依賴關(guān)系,并將該控制依賴關(guān)系存入磁盤文件中;其中該文件格式可由用戶自定義,能夠準確描述控制依賴關(guān)系即可。
本發(fā)明采用編寫idapro插件的方式,從軟件可執(zhí)行程序的入口點開始,首先構(gòu)造程序的控制流圖,構(gòu)造控制流圖已有很成熟的算法,此處不再贅述。通過分析程序的控制流圖,計算其中每一條指令的前后必經(jīng)節(jié)點,根據(jù)前后必經(jīng)節(jié)點的關(guān)系,確定每一條指令的控制依賴范圍,其中前后必經(jīng)節(jié)點的計算方法和控制依賴范圍計算也基于現(xiàn)有的成熟算法實現(xiàn)。在計算得到控制依賴范圍后,將節(jié)點的控制依賴關(guān)系保存到磁盤文件中。
2)啟動上述程序并監(jiān)控該程序執(zhí)行的每一條指令;其中所述啟動和監(jiān)控該程序可以通過ollydbg、windbg等調(diào)試工具或pin等插裝工具實現(xiàn)。
本發(fā)明采用編寫windbg插件的方式,通過windbg啟動程序,且啟動的同時攔截該程序的文件讀寫、網(wǎng)絡(luò)接收、注冊表查詢函數(shù),并監(jiān)控程序的api調(diào)用和運行指令。
3)將監(jiān)控到的該程序調(diào)用的讀數(shù)據(jù)操作函數(shù)(如readfile、mapviewoffile等)的返回值加入到污點記錄中,即輸入到程序的數(shù)據(jù)被標記為污點。
所述污點是指監(jiān)控到的該程序調(diào)用的文件讀寫、網(wǎng)絡(luò)接收、注冊表查詢函數(shù)的返回值。例如,攔截系統(tǒng)中的readfile、recv等輸入函數(shù),獲取函數(shù)的返回值和傳出參數(shù),通常情況下,這些函數(shù)的返回值和傳出參數(shù)標識了系統(tǒng)從外部得到的額外數(shù)據(jù),將該部分數(shù)據(jù)作為污點進行標記并加入到污點記錄中。
4)追蹤程序執(zhí)行的指令,根據(jù)現(xiàn)有的顯式污點傳播規(guī)則計算正向污點傳播過程,直到程序出現(xiàn)異?;蛑兄狗治鲞^程。其中所述中止分析過程是指研究人員根據(jù)自身經(jīng)驗認為漏洞已經(jīng)觸發(fā)進而中止分析的過程。
所述正向污點傳播是指分析每一條指令的源操作數(shù)和目的操作數(shù),根據(jù)現(xiàn)有的顯式污點傳播規(guī)則進行計算,直至程序執(zhí)行出現(xiàn)異?;蛑兄狗治鲞^程。例如,分析指令的操作數(shù),如果操作數(shù)引用了污點,那么該指令作為污點傳播指令被記錄,指令執(zhí)行后影響的寄存器、內(nèi)存也被標記為污點。
5)針對腳本引發(fā)的漏洞,如果僅有步驟4)中根據(jù)現(xiàn)有的顯式污點傳播規(guī)則計算得到的顯式污點傳播路徑,則從程序中存在的控制流劫持點為起點開始逆向回溯,若出現(xiàn)回溯中斷的情況,即尚未回溯到原始的污點數(shù)據(jù),但指令的操作數(shù)和前面的污點數(shù)據(jù)不發(fā)生關(guān)聯(lián)(即指令不在顯式污點傳播路徑上)。此時采用隱式污點傳播分析方法分析漏洞,使回溯過程能夠繼續(xù)進行。
所述控制流劫持點是指程序發(fā)生異常時控制流轉(zhuǎn)移的指令,被劫持的目標地址通常是攻擊者通過構(gòu)造輸入數(shù)據(jù)寫入。例如棧溢出漏洞,函數(shù)返回的ret指令為其控制流劫持點,則從ret指令開始逆向回溯,首先能夠看到的是ret引用了堆棧中的返回地址,根據(jù)返回地址向上尋找修改了堆棧中內(nèi)容的指令。
當通過隱式污點傳播連接斷開的傳播過程,連接上的指令在顯示污點傳播路徑上時,則以該指令為起點繼續(xù)逆向回溯;當指令不在顯示污點傳播路徑上(即出現(xiàn)回溯中斷)時采取如下步驟:
a)確定污點在逆向回溯傳播過程中不在污點傳播路徑上的指令,即污點逆向回溯過程中當前狀態(tài)下的最后一條指令,將其設(shè)為i;
b)分析步驟1)中得到的控制依賴關(guān)系,尋找指令i所依賴的指令,將其設(shè)為j;
c)由于指令j直接影響到了指令i的賦值,將指令j作為新起點加入到逆向回溯路徑中;
d)由指令j開始繼續(xù)向前回溯,直到到達原始的污點數(shù)據(jù),若出現(xiàn)指令不在顯示污點傳播路徑上時則繼續(xù)執(zhí)行步驟a)至步驟d)。
6)當逆向回溯到達原始的污點數(shù)據(jù)時輸出污點回溯結(jié)果。所述污點回溯結(jié)果是指回溯得到的指令序列、回溯到達的原始輸入數(shù)據(jù)。
下面為一按照本發(fā)明方法各步驟進行漏洞分析的實施例的具體過程:
假設(shè)存在如下的腳本代碼:
假設(shè)在該腳本代碼中,對象b引發(fā)了程序漏洞。在程序中實際上是由于‘create_obj’引發(fā)了對象b的創(chuàng)建,在顯式污點傳播中,輸入數(shù)據(jù)的顯式污點正向傳播到varinput=‘create_obj’指令為止。在顯示污點傳播分析中,將以控制流劫持點為起點,根據(jù)現(xiàn)有的顯式污點傳播規(guī)則,逆向計算污點傳播的過程實施回溯,控制流劫持點逆向回溯到達objectb=newobject()指令會中止。此時,通過采用隱式污點傳播分析方法,可以知道objectb=newobject()指令實際控制依賴于varinput=‘create_obj’指令,此時,回溯路徑成功接上,可繼續(xù)向前回溯一直達到最初輸入的javascript腳本。
本發(fā)明提出的基于隱式污點傳播的漏洞分析方法,對于本領(lǐng)域的技術(shù)人員而言,可以根據(jù)需要自己配置所要監(jiān)控的接口,從而全面分析漏洞機理。
以上實施僅用以說明本發(fā)明的技術(shù)方案而非對其進行限制,本領(lǐng)域的普通技術(shù)人員可以對本發(fā)明的技術(shù)方案進行修改或者等同替換,而不脫離本發(fā)明的精神和范圍,本發(fā)明的保護范圍應(yīng)以權(quán)利要求書所述為準。