一.技術(shù)領(lǐng)域
本發(fā)明提供一種基于內(nèi)存保護(hù)類(lèi)型監(jiān)控的惡意代碼跟蹤識(shí)別方法,它涉及漏洞防御,惡意代碼檢測(cè)識(shí)別方法,屬于信息安全領(lǐng)域。
二.
背景技術(shù):
隨著電子設(shè)備的普及,計(jì)算機(jī)技術(shù)不斷發(fā)展,整個(gè)社會(huì)對(duì)于互聯(lián)網(wǎng)及計(jì)算機(jī)的依賴(lài)持續(xù)增長(zhǎng),此時(shí)信息安全已成為不容忽視的問(wèn)題,而軟件漏洞的檢測(cè)識(shí)別及防御技術(shù)顯得尤為重要。根據(jù)專(zhuān)利申請(qǐng)者的統(tǒng)計(jì),近年來(lái)漏洞攻擊技術(shù)中,代碼復(fù)用攻擊(codereuseattacks)占主要地位,漏洞攻擊者通常會(huì)通過(guò)攻擊虛函數(shù)表或返回地址執(zhí)行系統(tǒng)接口函數(shù)修改惡意代碼所在內(nèi)存保護(hù)屬性,而現(xiàn)有針對(duì)這種攻擊手段的防護(hù)方式如微軟提供的執(zhí)行流保護(hù)(cfgcontrolflowguard)有下列缺點(diǎn):保護(hù)覆蓋面積小,兼容性低,通常需要在應(yīng)用程序編譯時(shí)開(kāi)發(fā)環(huán)境提供支持,且運(yùn)行于windows10以上的高系統(tǒng)版本,兩種條件缺一不可,導(dǎo)致目前有大量的應(yīng)用程序并無(wú)法使用該類(lèi)保護(hù)方案。
三.
技術(shù)實(shí)現(xiàn)要素:
1.發(fā)明目的
本發(fā)明公開(kāi)了一種基于內(nèi)存保護(hù)類(lèi)型監(jiān)控的惡意代碼跟蹤識(shí)別方法,目的在于精確檢測(cè)出發(fā)生的漏洞攻擊技術(shù)以及惡意代碼威脅,從而快速進(jìn)行相應(yīng)的防御反應(yīng),保護(hù)沙箱環(huán)境所在網(wǎng)絡(luò)中的計(jì)算機(jī)系統(tǒng)的安全。
2.技術(shù)方案
本發(fā)明為一種基于內(nèi)存保護(hù)類(lèi)型監(jiān)控的惡意代碼跟蹤識(shí)別方法,其步驟如下:
步驟1:將技術(shù)人員開(kāi)發(fā)的動(dòng)態(tài)鏈接庫(kù)注入到目標(biāo)進(jìn)程中;
步驟2:在目標(biāo)進(jìn)程中申請(qǐng)向量化異常處理函數(shù),用于接管目標(biāo)進(jìn)程中所發(fā)出的異常并對(duì)該異常環(huán)境進(jìn)行分析,分析流程包含以下步驟;
步驟2-1:等待當(dāng)前進(jìn)程發(fā)生的異常事件,過(guò)濾訪問(wèn)違規(guī)之外的異常信息,并與收集的參數(shù)環(huán)境比對(duì)異常信息;
步驟2-2:如果步驟2-1比對(duì)信息成功,備份保留此段內(nèi)存,并在此內(nèi)存范圍內(nèi)做靜態(tài)規(guī)則匹配;
步驟2-3:若靜態(tài)規(guī)則匹配失敗,則從異常發(fā)生的地址動(dòng)態(tài)模擬解析并執(zhí)行該段內(nèi)存代碼,做動(dòng)態(tài)行為分析;
步驟2-4:根據(jù)步驟2-3的返回結(jié)果,最終輸出本次的檢測(cè)結(jié)論,如果為惡意代碼,給出提示并退出執(zhí)行過(guò)程;
步驟3:獲取系統(tǒng)指定動(dòng)態(tài)鏈接庫(kù)中針對(duì)與修改內(nèi)存保護(hù)屬性的接口函數(shù)地址,劫持其執(zhí)行流程到技術(shù)人員開(kāi)發(fā)的動(dòng)態(tài)鏈接庫(kù)中;
步驟4:在保護(hù)程序的運(yùn)行周期中監(jiān)控所有關(guān)于此接口的調(diào)用流程,初步檢測(cè)調(diào)用的合法性,如果不合法,進(jìn)入步驟9;
步驟5:通過(guò)初步的合法性檢測(cè)后,判斷參數(shù)中是否包含執(zhí)行屬性標(biāo)志;
步驟6:針對(duì)修改內(nèi)存保護(hù)屬性為可執(zhí)行屬性的接口函數(shù)調(diào)用,清除可執(zhí)行保護(hù)標(biāo)志位;
步驟7:記錄本次接口函數(shù)調(diào)用的參數(shù)環(huán)境;
步驟8:調(diào)用原始接口函數(shù),使程序正常運(yùn)行;
步驟9:報(bào)告發(fā)現(xiàn)漏洞攻擊(exploit)。
其中,步驟1中所述的“目標(biāo)進(jìn)程”,它是指受到本發(fā)明保護(hù)的進(jìn)程。
其中,步驟1中所述的“將技術(shù)人員開(kāi)發(fā)的動(dòng)態(tài)鏈接庫(kù)注入到目標(biāo)進(jìn)程中”,其作法如下:其中的注入方法是本領(lǐng)域的常見(jiàn)技術(shù)。
其中,步驟2中所述的“在目標(biāo)進(jìn)程中申請(qǐng)向量化異常處理函數(shù),用于接管目標(biāo)進(jìn)程中所發(fā)出的異?!保渥鞣ㄈ缦拢赫{(diào)用操作系統(tǒng)接口函數(shù)addvectoredexceptionhandler,注冊(cè)一個(gè)處理函數(shù),用于處理進(jìn)程中發(fā)生的異常中斷。
其中,步驟2-1中所述的“等待當(dāng)前進(jìn)程發(fā)生的異常事件,過(guò)濾訪問(wèn)違規(guī)之外的異常信息,并與收集的參數(shù)環(huán)境比對(duì)異常信息”,其作法如下:當(dāng)進(jìn)程環(huán)境發(fā)生異常中斷后,會(huì)被步驟2中申請(qǐng)的向量化異常處理函數(shù)所接管,過(guò)濾掉exceptioncode為status_access_violation之外的異常消息,將其發(fā)生異常的地址(exceptionaddress)同步驟7中記錄的信息做對(duì)比,判斷這次異常發(fā)生的地址是否位于記錄的區(qū)間中。
其中,步驟2-2、步驟2-3中所述的“靜態(tài)規(guī)則匹配”,它是指符合惡意代碼(shellcode)形態(tài)的指令模式匹配。
其中,步驟2-2中所述的“如果步驟2-1比對(duì)信息成功,備份保留此段內(nèi)存,并在此內(nèi)存范圍內(nèi)做靜態(tài)規(guī)則匹配”,其作法如下:如果異常發(fā)生的地址位于記錄的數(shù)據(jù)區(qū)間中,保留(dump)本段內(nèi)存到本地,并對(duì)該段內(nèi)存數(shù)據(jù)進(jìn)行符合惡意代碼(shellcode)模式的靜態(tài)搜索,其中的搜索方法是本領(lǐng)域的常見(jiàn)技術(shù),其中的dump方法是本領(lǐng)域的常見(jiàn)技術(shù)。
其中,步驟2-3中所述的“若靜態(tài)規(guī)則匹配失敗,則從異常發(fā)生的地址動(dòng)態(tài)模擬解析并執(zhí)行該段內(nèi)存代碼,做動(dòng)態(tài)行為分析”,其作法如下:動(dòng)態(tài)模塊將步驟2-1中dump下來(lái)的數(shù)據(jù)塊載入內(nèi)存中,從異常發(fā)生地址處偏移建立執(zhí)行流程,記錄其對(duì)系統(tǒng)接口函數(shù)的訪問(wèn)情況,是否存在動(dòng)態(tài)獲取系統(tǒng)接口函數(shù)地址并執(zhí)行敏感接口函數(shù)的行為。
其中,步驟3中所述的“獲取系統(tǒng)指定動(dòng)態(tài)鏈接庫(kù)中針對(duì)與修改內(nèi)存保護(hù)屬性的接口函數(shù)地址,劫持其執(zhí)行流程到技術(shù)人員開(kāi)發(fā)的動(dòng)態(tài)鏈接庫(kù)中”,其作法如下:獲取ntdll模塊中,zwprotectvirtualmemory接口函數(shù)的地址,hook其執(zhí)行流程。其中hook方法是本領(lǐng)域的常見(jiàn)技術(shù)。
其中,步驟4中所述的“在保護(hù)程序的運(yùn)行周期中監(jiān)控所有關(guān)于此接口的調(diào)用流程,初步檢測(cè)調(diào)用的合法性”,其做法如下:檢測(cè)要改變保護(hù)屬性的內(nèi)存基址是否位于當(dāng)前線程信息塊中所保存的棧地址的起始范圍內(nèi)。
其中,步驟5中所述的“判斷參數(shù)中是否包含執(zhí)行屬性標(biāo)志”,其做法如下:檢測(cè)本次zwprotectvirtualmemory調(diào)用參數(shù)的newaccessprotection中是否包含執(zhí)行標(biāo)志。
其中,步驟6中所述的“清除可執(zhí)行保護(hù)標(biāo)志位”,其作法如下:該方法是本領(lǐng)域的常見(jiàn)技術(shù)。
其中,步驟7中所述的“記錄本次接口函數(shù)調(diào)用的參數(shù)環(huán)境”,其作法如下:記錄ntdll模塊中,newzwprotectvirtualmemory接口函數(shù)調(diào)用時(shí)的baseaddress參數(shù),numberofbytestoprotect參數(shù),oldaccessprotection參數(shù)。
其中,步驟8中所述的“調(diào)用原始接口函數(shù),使程序正常運(yùn)行”,其做法如下:該方法是本領(lǐng)域的常見(jiàn)技術(shù)。
通過(guò)以上步驟,本發(fā)明達(dá)到了識(shí)別漏洞攻擊過(guò)程中惡意代碼(shellcode)執(zhí)行的效果,解決了現(xiàn)有技術(shù)保護(hù)覆蓋面積小,兼容性低的問(wèn)題。
3.優(yōu)點(diǎn)
本發(fā)明通過(guò)劫持修改內(nèi)存保護(hù)屬性的系統(tǒng)接口函數(shù),判斷調(diào)用參數(shù)是否位于棧地址空間,并記錄包含可執(zhí)行屬性的調(diào)用參數(shù),清除可執(zhí)行標(biāo)志位,導(dǎo)致受保護(hù)的應(yīng)用程序因任何原因跳轉(zhuǎn),執(zhí)行到屬性修改過(guò)的內(nèi)存塊時(shí),對(duì)于異常的地址進(jìn)行向高地址反匯編,并根據(jù)反匯編結(jié)果進(jìn)行的靜態(tài)掃描及加載異常內(nèi)存塊,模擬執(zhí)行的動(dòng)態(tài)行為進(jìn)行漏洞攻擊,惡意代碼的識(shí)別判斷。
針對(duì)目前常見(jiàn)的漏洞攻擊利用手段,通過(guò)攻擊虛函數(shù)表,調(diào)用修改內(nèi)存屬性的接口函數(shù)修改通過(guò)腳本所布置的惡意代碼段所在的內(nèi)存屬性,并通過(guò)攻擊虛表劫持中央處理器(cpu)的指令指針寄存器執(zhí)行到惡意代碼等代碼復(fù)用攻擊(codereuseattacks),目前操作系統(tǒng)擁有的漏洞保護(hù)方案:地址空間布局隨機(jī)化,數(shù)據(jù)執(zhí)行保護(hù)通常無(wú)法檢測(cè),而與windows10操作系統(tǒng)上才默認(rèn)開(kāi)啟,由微軟提供的執(zhí)行流保護(hù)(cfgcontrolflowguard)這一保護(hù)方案相比,本發(fā)明有以下優(yōu)點(diǎn):保護(hù)覆蓋面積廣,兼容性高,執(zhí)行流保護(hù)只能被windows最新版本所支持,并且需要在編譯時(shí)開(kāi)啟這一保護(hù)方案,而非最新操作系統(tǒng)或者受保護(hù)程序在編譯時(shí)沒(méi)有開(kāi)啟這一保護(hù)策略,則無(wú)法使用這種保護(hù),導(dǎo)致市面上大多數(shù)的軟件不支持這種防護(hù)方式,而本發(fā)明不存在這種問(wèn)題,可以在保證準(zhǔn)確度的前提下保護(hù)并支持基本上所有的應(yīng)用程序。
四.附圖說(shuō)明
圖1是本發(fā)明所述方法流程示意圖。
圖2是本發(fā)明方法的異常處理流程示意圖。
五.具體實(shí)施方式:
本發(fā)明通過(guò)劫持修改內(nèi)存保護(hù)屬性的系統(tǒng)接口函數(shù),收集記錄包含可執(zhí)行屬性的調(diào)用參數(shù),做清除可執(zhí)行標(biāo)志位處理,通過(guò)監(jiān)控異常的方式來(lái)攔截目標(biāo)代碼的執(zhí)行,通過(guò)靜態(tài)規(guī)則及動(dòng)態(tài)模擬執(zhí)行的方式高效準(zhǔn)確的識(shí)別漏洞攻擊及惡意代碼。
參見(jiàn)圖1,為本發(fā)明所述方法流程示意圖,具體流程包括:
步驟s101:將本發(fā)明的保護(hù)模塊注入到目標(biāo)進(jìn)程中。
步驟s102:在受保護(hù)的目標(biāo)進(jìn)程中申請(qǐng)向量化異常處理函數(shù),用于接管該進(jìn)程在運(yùn)行中所引發(fā)的異常中斷,處理分析異常環(huán)境,其處理過(guò)程見(jiàn)參考圖2,分為s201-s21010個(gè)步驟,如下:
步驟s201:進(jìn)程運(yùn)行期間發(fā)出異常中斷,并被向量化異常處理所攔截。
步驟s202:判定步驟s201所發(fā)生的異常中斷信息,是否為關(guān)注的異常行為,即“訪問(wèn)違規(guī)”異常(memoryaccessviolationoccurred),對(duì)于其他原因所發(fā)出的異常中斷,此處不做處理,并將異常正常下發(fā)步驟s209。
步驟s203:對(duì)于步驟s202所過(guò)濾下的異常中斷信息,判斷其異常中斷地址(exception-address)是否位于數(shù)據(jù)容器內(nèi),對(duì)于非該范圍內(nèi)的異常地址,執(zhí)行步驟s209。
步驟s204:將異常發(fā)生的內(nèi)存基地址開(kāi)始,地址大小范圍內(nèi)的內(nèi)存?zhèn)浞輳?fù)制下來(lái),并記錄異常發(fā)生地址對(duì)于這段內(nèi)存的偏移地址。
步驟s205:從異常發(fā)生的地址開(kāi)始向下反匯編,將數(shù)據(jù)交由s206處理。
步驟s206:對(duì)于反匯編后的代碼,對(duì)其進(jìn)行靜態(tài)特征代碼塊掃描識(shí)別,對(duì)識(shí)別到特殊惡意指令塊的操作,報(bào)告漏洞攻擊行為步驟s210。
步驟s207:如靜態(tài)模塊掃描識(shí)別沒(méi)有危險(xiǎn)特征,進(jìn)行動(dòng)態(tài)模擬執(zhí)行操作,并將結(jié)果傳遞給步驟s208進(jìn)行行為分析。
步驟s208:分析該異常代碼段的行為結(jié)果,如果命中動(dòng)態(tài)特征規(guī)則,則報(bào)告漏洞攻擊,執(zhí)行步驟s210,否則執(zhí)行步驟s09。
步驟s209:本次異常檢測(cè)結(jié)束,檢測(cè)結(jié)果為非漏洞攻擊。
步驟s210:報(bào)告當(dāng)前進(jìn)程中發(fā)現(xiàn)漏洞攻擊(exploit)。
步驟s103:劫持修改內(nèi)存屬性的系統(tǒng)應(yīng)用程序編程接口(applicationprogramminginterface),在漏洞攻擊過(guò)程中,該函數(shù)常用于修改目標(biāo)即惡意代碼(shellcode)所在內(nèi)存段的內(nèi)存屬性,劫持該接口函數(shù)用于實(shí)現(xiàn)初步漏洞攻擊判定及特定信息參數(shù)的收集。
步驟s104:用于判斷進(jìn)程是否存在通過(guò)該接口函數(shù)修改線程棧所在內(nèi)存的內(nèi)存屬性行為,如果修改保護(hù)屬性的內(nèi)存的地址位于棧地址空間中,報(bào)告漏洞攻擊,執(zhí)行步驟s109。
步驟s105:判定該次調(diào)用的參數(shù)是否帶有可執(zhí)行標(biāo)記位,即是否要將目標(biāo)內(nèi)存設(shè)置為帶有可執(zhí)行屬性的內(nèi)存,此處過(guò)濾不帶有可執(zhí)行標(biāo)志位的調(diào)用,返回執(zhí)行原始接口函數(shù)步驟s108。
步驟s106:通過(guò)步驟s105的處理部分,即說(shuō)明本次接口函數(shù)的調(diào)用參數(shù)中帶有可執(zhí)行標(biāo)記位,將原始的可執(zhí)行標(biāo)志位取消掉。
步驟s107:收集本次調(diào)用的參數(shù)環(huán)境信息,并加入由保護(hù)模塊維護(hù)的數(shù)據(jù)容器中。
步驟s108:內(nèi)存設(shè)置完畢,調(diào)用原始函數(shù)不打斷進(jìn)程的正常執(zhí)行流程,并等待該進(jìn)程所發(fā)出的異常中斷信息。
步驟s109:報(bào)告當(dāng)前進(jìn)程中發(fā)現(xiàn)漏洞攻擊(exploit)。