一種針對(duì)虛函數(shù)表劫持攻擊的防御方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于應(yīng)用程序技術(shù)領(lǐng)域,尤其涉及一種針對(duì)虛函數(shù)表劫持攻擊的防御方法。
【背景技術(shù)】
[0002]內(nèi)存破壞漏洞(memory corrupt1n bugs)廣泛存在于使用C/C++等低級(jí)語言編寫的程序中,棧溢出、堆溢出、釋放后重用等漏洞均屬于內(nèi)存破壞漏洞。攻擊者利用此類漏洞,可以控制應(yīng)用程序內(nèi)存中的數(shù)據(jù)、代碼,改變程序行為甚至劫持程序的控制流。
[0003]現(xiàn)有技術(shù)中有以下兩種處理方式:
[0004]VTGuard:VTGuard是部署在IE瀏覽器中的一項(xiàng)虛函數(shù)表保護(hù)技術(shù)。其基本思想是:在每個(gè)虛函數(shù)表中插入一個(gè)私密的cookie,并在虛函數(shù)被調(diào)用時(shí)進(jìn)行檢查,當(dāng)前表中的cookie和對(duì)應(yīng)的cookie是否一致,如果不一致則會(huì)禁止此次調(diào)用。該方案能夠有效減少虛函數(shù)表重用攻擊,但對(duì)虛函數(shù)表破壞和虛函數(shù)表注入攻擊無效。
[0005]SafeDispatch:SafeDispatch是基于編譯器的虛函數(shù)表劫持攻擊防御方案,它首先對(duì)整個(gè)程序的類關(guān)系進(jìn)行分析,推斷出程序中有效的虛函數(shù)表集合及虛函數(shù)集合;接著在虛函數(shù)被調(diào)用時(shí)進(jìn)行安全校驗(yàn),檢查當(dāng)前虛函數(shù)及虛函數(shù)表是否在有效集合中,若不在則禁止此次調(diào)用。對(duì)于虛函數(shù)的檢查,將帶來7%的額外開銷;對(duì)于虛函數(shù)表的檢查,將帶來30%的額外開銷,且對(duì)虛函數(shù)表破壞攻擊無效。
[0006]DieHard:DieHard提供了自定義的內(nèi)存分配器,在進(jìn)行內(nèi)存分配時(shí)實(shí)現(xiàn)隨機(jī)化及隔離。該技術(shù)方案在某種程度上對(duì)虛函數(shù)表劫持攻擊有效,但存在不確定性。
[0007]但是上述方案中,均存在以下缺陷:有效性:VTGuard、SafeDispatch、DIeHard均無法保證對(duì)所有類型的虛函數(shù)表劫持攻擊進(jìn)行有效防護(hù);二進(jìn)制兼容:VTGuard、SafeDispatch以及DieHard均不二進(jìn)制兼容,即需要源代碼。而在實(shí)際中獲取目標(biāo)保護(hù)程序的源碼是極其困難的;系統(tǒng)開銷-SafeDispatch所帶來的系統(tǒng)開銷7與% 30)使其很難應(yīng)用于實(shí)際中。
【發(fā)明內(nèi)容】
[0008]為解決上述問題,本發(fā)明提供一種針對(duì)虛函數(shù)表劫持攻擊的防御方法。本發(fā)明基于二進(jìn)制重寫技術(shù),不需要源碼即可完成部署;且能夠有效防護(hù)程序中的重要對(duì)象,不受虛函數(shù)表劫持攻擊的影響;而本發(fā)明所帶來的系統(tǒng)開銷也在可接受范圍之內(nèi)。
[0009]本發(fā)明的針對(duì)虛函數(shù)表劫持攻擊的防御方法,其包括:
[0010]步驟一、構(gòu)建有效虛函數(shù)表集合和有效虛函數(shù)集合;有效虛函數(shù)表集合用于存儲(chǔ)虛函數(shù)表指針,虛函數(shù)表指針指向虛函數(shù)表;有效虛函數(shù)集合用于存儲(chǔ)虛函數(shù)表,虛函數(shù)表用于存儲(chǔ)虛函數(shù)指針,虛函數(shù)指針指向虛函數(shù);
[0011 ] 步驟二、確定可執(zhí)行程序中可能被虛函數(shù)表劫持攻擊、需要被保護(hù)的對(duì)象和對(duì)象中的虛函數(shù),分析得到虛函數(shù)數(shù)據(jù)的讀取地址和虛函數(shù)的調(diào)用地址;其中,虛函數(shù)數(shù)據(jù)包括:虛函數(shù)表指針和虛函數(shù)表;同一個(gè)對(duì)象的不同虛函數(shù)數(shù)據(jù)采用相同讀取地址,且虛函數(shù)數(shù)據(jù)中的虛函數(shù)表指針和虛函數(shù)表采用相同讀取地址;
[0012]步驟三、在可執(zhí)行程序的運(yùn)行過程中,采用動(dòng)態(tài)二進(jìn)制插裝方式,在虛函數(shù)數(shù)據(jù)的讀取地址處插裝備份回調(diào)函數(shù),在虛函數(shù)的調(diào)用地址處插裝校驗(yàn)回調(diào)函數(shù);
[0013]步驟四、當(dāng)可執(zhí)行程序執(zhí)行到某個(gè)對(duì)象X的虛函數(shù)數(shù)據(jù)對(duì)應(yīng)的備份回調(diào)函數(shù)時(shí),在該備份回調(diào)函數(shù)中,將對(duì)象X的虛函數(shù)表指針及其指向的虛函數(shù)表進(jìn)行備份,其中虛函數(shù)表指針備份到有效虛函數(shù)表集合中,虛函數(shù)表備份到有效虛函數(shù)集合中;
[0014]步驟五、當(dāng)可執(zhí)行程序執(zhí)行到某個(gè)虛函數(shù)對(duì)應(yīng)的校驗(yàn)回調(diào)函數(shù)時(shí),在校驗(yàn)回調(diào)函數(shù)中,檢查被調(diào)用的虛函數(shù)所在的虛函數(shù)表的虛函數(shù)表指針Y是否在有效虛函數(shù)表集合中;
[0015]若虛函數(shù)表指針Y不在有效虛函數(shù)表集合中,則校驗(yàn)失敗、拒絕調(diào)用虛函數(shù),并立即終止該可執(zhí)行程序;
[0016]若虛函數(shù)表指針Y在有效虛函數(shù)表集合中,則根據(jù)備份的有效虛函數(shù)表集合和有效虛函數(shù)集合,找到虛函數(shù)表指針Y指向的虛函數(shù)表Z;判斷被調(diào)用的虛函數(shù)指針是否在虛函數(shù)表Z中,若在則校驗(yàn)成功,運(yùn)行可執(zhí)行程序調(diào)用虛函數(shù),否則校驗(yàn)失敗、拒絕調(diào)用虛函數(shù),并終止該可執(zhí)行程序。
[0017]進(jìn)一步的,步驟四中備份后將備份數(shù)據(jù)所在的內(nèi)存頁的訪問屬性修改為只讀。
[0018]有益效果:
[0019]本發(fā)明通過二進(jìn)制插裝技術(shù),在對(duì)象實(shí)例化時(shí)插裝代碼對(duì)虛函數(shù)表指針及虛函數(shù)表進(jìn)行備份;在對(duì)象的虛函數(shù)被調(diào)用時(shí),依據(jù)當(dāng)前虛函數(shù)表指針和虛函數(shù)指針與原有值進(jìn)行比對(duì)以判斷是否能夠進(jìn)行調(diào)用。通過這種方式,本發(fā)明在二進(jìn)制層面對(duì)虛函數(shù)表進(jìn)行了防護(hù),有效保護(hù)對(duì)象不受虛函數(shù)表劫持攻擊的影響。
【附圖說明】
[0020]圖1(a)為本發(fā)明的針對(duì)虛函數(shù)表劫持攻擊的防御方法示意圖;
[0021]圖1(b)為本發(fā)明的備份數(shù)據(jù)示意圖;
[0022]圖1 (c)為本發(fā)明的校驗(yàn)過程流程圖;
[0023]圖2為可執(zhí)行程序調(diào)用虛函數(shù)的代碼示意圖;
[0024]圖3 (a)為本發(fā)明的實(shí)施例中對(duì)象d的類結(jié)構(gòu);
[0025]圖3(b)為本發(fā)明的實(shí)施例中對(duì)象d的虛函數(shù)表內(nèi)存布局。
【具體實(shí)施方式】
[0026]PE文件中有多個(gè)對(duì)象,其中部分對(duì)象的虛函數(shù)表易受到攻擊者的攻擊,奪取程序的控制流,執(zhí)行危險(xiǎn)代碼,影響系統(tǒng)安全。
[0027]本發(fā)明技術(shù)方案如圖1 (a)所示。首先,對(duì)待保護(hù)的PE文件進(jìn)行預(yù)分析,得到需要保護(hù)對(duì)象的虛函數(shù)表的生成處及虛函數(shù)的調(diào)用處;接下來,在生成處及虛函數(shù)調(diào)用處進(jìn)行插裝,添加對(duì)目標(biāo)程序的防護(hù)。為了對(duì)目標(biāo)程序進(jìn)行插裝,需要通過預(yù)分析得到:1.虛函數(shù)表生成位置,以便進(jìn)行插裝進(jìn)行數(shù)據(jù)備份;2.虛函數(shù)調(diào)用位置,以便進(jìn)行插裝在調(diào)用時(shí)做安全驗(yàn)證。目前有多種針對(duì)二進(jìn)制文件的分析方法可以實(shí)現(xiàn)這個(gè)目標(biāo),包括自動(dòng)分析平臺(tái)、靜態(tài)分析、動(dòng)態(tài)分析等。
[0028]本發(fā)明的針對(duì)虛函數(shù)表劫持攻擊的防御方法,其包括:
[0029]步驟一、構(gòu)建有效虛函數(shù)表集合和有效虛函數(shù)集合;有效虛函數(shù)表集合用于存儲(chǔ)虛函數(shù)表指針,虛函數(shù)表指針指向虛函數(shù)表;有效虛函數(shù)集合用于存儲(chǔ)虛函數(shù)表,虛函數(shù)表用于存儲(chǔ)虛函數(shù)指針,虛函數(shù)指針指向虛函數(shù)。
[0030]步驟二、確定可執(zhí)行程序中可能被虛函數(shù)表劫持攻擊、需要被保護(hù)的對(duì)象和對(duì)象中的虛函數(shù),分析得到虛函數(shù)數(shù)據(jù)的讀取地址和虛函數(shù)的調(diào)用地址;其中,虛函數(shù)數(shù)據(jù)包括:虛函數(shù)表指針和虛函數(shù)表;同一個(gè)對(duì)象的不同虛函數(shù)數(shù)據(jù)采用相同讀取地址,且虛函數(shù)數(shù)據(jù)中的虛函數(shù)表指針和虛函數(shù)表采用相同讀取地址;
[0031]其中獲得虛函數(shù)調(diào)用地址的方式為:
[0032]通過網(wǎng)絡(luò)獲得攻擊代碼,修改攻擊代碼對(duì)虛函數(shù)指針或虛函數(shù)表指針的賦值語句,在可執(zhí)行程序調(diào)用虛函數(shù)且該虛函數(shù)在被修改后的攻擊代碼攻擊時(shí),可執(zhí)行程序報(bào)錯(cuò),則可執(zhí)行程序報(bào)錯(cuò)時(shí)可執(zhí)行程序所執(zhí)行的指令地址即為虛函數(shù)的調(diào)用位置。
[0033]獲得虛函數(shù)數(shù)據(jù)的讀取地址的方式為:
[0034]在可執(zhí)行程序中分析虛函數(shù)調(diào)用時(shí)的代碼,追蹤該虛函數(shù)所屬對(duì)象的數(shù)據(jù)流以確定對(duì)象的虛函數(shù)數(shù)據(jù)的讀取位置。
[0035]步驟三、在可執(zhí)行程序的運(yùn)行過程中,采用動(dòng)態(tài)二進(jìn)制插裝方式,在虛函數(shù)數(shù)據(jù)的讀取地址處插裝備份回調(diào)函數(shù),在虛函數(shù)的調(diào)用地址處插裝校驗(yàn)回調(diào)函數(shù)。
[0036]步驟四、當(dāng)可執(zhí)行程序執(zhí)行到某個(gè)對(duì)象X的虛函數(shù)數(shù)據(jù)對(duì)應(yīng)的備份回調(diào)函數(shù)時(shí),在該備份回調(diào)函數(shù)中,將對(duì)象X的虛函數(shù)表指針及其指向的虛函數(shù)表進(jìn)行備份,其中虛函數(shù)表指針備份到有效虛函數(shù)表集合中,虛函數(shù)表備份到有效虛函數(shù)集合中。
[0037]步驟五、當(dāng)可執(zhí)行程序執(zhí)行到某個(gè)虛函數(shù)對(duì)應(yīng)的校驗(yàn)回調(diào)函數(shù)時(shí),在校驗(yàn)回調(diào)函數(shù)中,檢查被調(diào)用的虛函數(shù)所在的虛函數(shù)表的虛函數(shù)表指針Y是否在有效虛函數(shù)表集合中;
[0038]若虛函數(shù)表指針Y不在有效虛函數(shù)表集合中,則校驗(yàn)失敗、拒絕調(diào)用虛函數(shù),并立即終止該可執(zhí)行程序;
[0039]若虛函數(shù)表指針Y在有效虛函數(shù)表集合中,則根據(jù)備份的有效虛函數(shù)表集合和有效虛函數(shù)集合,找到虛函數(shù)表指針Y指向的虛函數(shù)表Z;判斷被調(diào)用的虛函數(shù)指針是否在虛函數(shù)表Z中,若在則校驗(yàn)成功,運(yùn)行可執(zhí)行程序調(diào)用虛函數(shù),否則校驗(yàn)失敗、拒絕調(diào)用虛函數(shù),并終止該可執(zhí)行程序。
[0040]進(jìn)一步的,步驟四中備份后將備份數(shù)據(jù)所在的內(nèi)存頁的訪問屬性修改