專利名稱:二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種程序在遭受內(nèi)存腐爛攻擊的時(shí)的實(shí)時(shí)檢測方法和工具,特別是在 沒有源代碼的二進(jìn)制級(jí)別基礎(chǔ)上,通過對(duì)二進(jìn)制程序進(jìn)行運(yùn)行時(shí)的動(dòng)態(tài)分析和跟蹤的 二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng)。
背景技術(shù):
幾乎所有的軟件安全漏洞問題都是由內(nèi)存相關(guān)的程序漏洞所導(dǎo)致的。據(jù) US-CERT(美國應(yīng)急響應(yīng)小組)的統(tǒng)計(jì)數(shù)據(jù)表明,現(xiàn)有的絕大多數(shù)漏洞安全相關(guān)問題,都 是通過內(nèi)存腐爛攻擊(即內(nèi)存的錯(cuò)誤讀寫所導(dǎo)致的攻擊)來實(shí)現(xiàn)的,因此,對(duì)于內(nèi)存 腐爛攻擊的實(shí)時(shí)檢測技術(shù)的研究和開發(fā),就顯得尤為重要。
目前,已有很多針對(duì)內(nèi)存腐爛攻擊的方法被提出,但是這些方法都是從以下幾個(gè) 方面來進(jìn)行考慮的(1)使用安全增強(qiáng)的語言,如CCured; (2)安全靜態(tài)掃描工具,如 PScan; (3)編譯器增強(qiáng)技術(shù),如StackGuard; (4)安全庫檢査技術(shù)。如Libsafe。但是 這些方法通常只針對(duì)某一種具體的攻擊類型,但隨著安全漏洞和攻擊手段多樣化,需 要一種更為通用的攻擊檢測方法。
針對(duì)內(nèi)存腐爛攻擊的實(shí)時(shí)檢測工作一直是軟件安全領(lǐng)域的熱點(diǎn)。目前,已經(jīng)有一 系列的相關(guān)工作。但是這些已有的工作都至少存在如下中的某個(gè)缺點(diǎn)(1)需要源代碼; (2)只針對(duì)某一類型的攻擊;(3)需要特殊的硬件機(jī)制支持;(4)存在較大的誤報(bào)率和 漏報(bào)率。
發(fā)明內(nèi)容
發(fā)明目的本發(fā)明所要解決的技術(shù)問題是針對(duì)現(xiàn)有技術(shù)的不足,提供一種在二進(jìn) 制級(jí)別的針對(duì)內(nèi)存腐爛攻擊的實(shí)時(shí)檢測方法,本發(fā)明通過對(duì)程序"染色"的方法,動(dòng) 態(tài)監(jiān)控外部輸入數(shù)據(jù)在程序中的執(zhí)行軌跡;通過對(duì)指針數(shù)據(jù)訪問內(nèi)存的時(shí)候進(jìn)行攻擊 檢測,這樣檢測的攻擊類型更為通用。
技術(shù)方案本發(fā)明公開了一種二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),包括以 下部分代碼轉(zhuǎn)換單元、程序內(nèi)部數(shù)據(jù)染色單元、程序運(yùn)行時(shí)監(jiān)控單元以及攻擊檢測 單元;
所述代碼轉(zhuǎn)換單元用于將二進(jìn)制級(jí)別的代碼轉(zhuǎn)換成Valgrind中間代碼形式VEX;
所述程序內(nèi)部數(shù)據(jù)染色單元包括指針類型數(shù)據(jù)識(shí)別部分和指針類型數(shù)據(jù)染色部 分,用于根據(jù)程序運(yùn)行時(shí)執(zhí)行到的VEX指令,并掃描和査找VEX指令,當(dāng)識(shí)別出是 指針類型的數(shù)據(jù)時(shí),對(duì)指針類型的數(shù)據(jù)染色;
所述程序運(yùn)行時(shí)監(jiān)控單元用于對(duì)靜態(tài)指針和動(dòng)態(tài)指針數(shù)據(jù)進(jìn)行識(shí)別,并對(duì)靜態(tài)指針和動(dòng)態(tài)指針以及靜態(tài)指針和動(dòng)態(tài)指針對(duì)應(yīng)的內(nèi)存區(qū)域染上相同的顏色;
所述攻擊檢測單元用于截獲外部輸入數(shù)據(jù)的操作,對(duì)外來的輸入數(shù)據(jù)進(jìn)行染色, 并在程序的執(zhí)行過程中,動(dòng)態(tài)的對(duì)外來的數(shù)據(jù)進(jìn)行監(jiān)控,并進(jìn)行顏色的動(dòng)態(tài)傳播。本 發(fā)明中所述截獲,是指對(duì)那些系統(tǒng)提供的輸入函數(shù)做一些修改,使得可以對(duì)輸入的數(shù) 據(jù)進(jìn)行染色。例如,對(duì)于sprintf(buffer,...)等輸入操作,在實(shí)現(xiàn)其原有功能"讀入數(shù)據(jù)" 的基礎(chǔ)上,給這些讀入數(shù)據(jù)添加額外的標(biāo)記符,這個(gè)標(biāo)記符可以理解為顏色。 本發(fā)明中,所述指針類型數(shù)據(jù)識(shí)別部分包括以下步驟
步驟S100,在Valgrind生成的中間代碼VEX中查找操作碼Add32,即提取32位 的地址;
步驟S200,如果存在操作碼Add32,則跳到步驟S300;否則跳至步驟S600; 步驟S300,在VEX中,査找在操作碼Add32后的操作碼;
步驟S400,如果操作碼Add32后為操作碼STle,則跳至步驟S500;否則跳至步驟
S600;
步驟S500,對(duì)程序內(nèi)部的指針類型的數(shù)據(jù)染色; 步驟S600,程序運(yùn)行時(shí)監(jiān)控。
本發(fā)明中,步驟S500所述指針類型數(shù)據(jù)染色部分包括以下步驟 步驟S501,如果指針為靜態(tài)指針,則跳至步驟S502;否則跳至步驟S503; 步驟S502,將在操作碼STle中的地址取出,并將該地址處的變量染色; 步驟S503,截獲malloc()族函數(shù)以及非系統(tǒng)函數(shù)調(diào)用;malloc()族函數(shù)是系統(tǒng)函數(shù),
所述非系統(tǒng)函數(shù)調(diào)用,比如自己定義的任意函數(shù)fonc(),就是指一般的函數(shù)調(diào)用。
步驟S504,對(duì)動(dòng)態(tài)分配的指針類型的數(shù)據(jù),包括指針本身和相應(yīng)的內(nèi)存區(qū)域,進(jìn)
行染色;
步驟S600,程序運(yùn)行時(shí)監(jiān)控。
本發(fā)明中,所述步驟S600程序運(yùn)行時(shí)監(jiān)控由程序運(yùn)行時(shí)監(jiān)控單元進(jìn)行,包括以下 步驟
步驟S601,如果是數(shù)據(jù)輸入函數(shù)scanf()族函數(shù),則跳至步驟S602;否則跳至步驟 S603;
步驟S602,將外部輸入數(shù)據(jù)的數(shù)據(jù)染色;
步驟S603,在VEX中間代碼中,查找傳播指令,例如數(shù)據(jù)移動(dòng)指令和算術(shù)運(yùn)算指 令,如果為傳播指令,則跳至步驟S604;否則跳至步驟S700; 步驟S604,動(dòng)態(tài)的進(jìn)行顏色的傳播; 步驟S700,進(jìn)行攻擊檢測。
本發(fā)明中,所述步驟S700進(jìn)行攻擊檢測由所述攻擊檢測單元進(jìn)行,包括以下步驟:步驟S701 ,在VEX中間代碼中查找操作指令LOAD,如果存在操作指令LOAD, 則跳至步驟S702;否則跳至步驟S800; 步驟S702,提取出指針的顏色;
步驟S703,檢測指針是否被污染,如果指針被污染,則跳至步驟S706;否則跳至 步驟S704;
步驟S704,提取出指針要訪問的內(nèi)存區(qū)域的顏色;
步驟S705,對(duì)步驟S702中提取的指針顏色以及步驟S704中提取的指針要訪問內(nèi) 存的顏色進(jìn)行比對(duì),如果兩者顏色相同,跳至步驟S800;否則跳至步驟S706;所謂顏
色對(duì)比就是將指針本身的顏色的數(shù)值和指針指向的內(nèi)存區(qū)域的顏色數(shù)值進(jìn)行比較。
例如使用指針buffer訪問內(nèi)存時(shí),要判斷buffer指針本身的顏色和buffer欲訪問的內(nèi)存 的顏色是否相同。
步驟S706,檢測到內(nèi)存腐爛攻擊;
步驟S800,沒有檢測到攻擊,程序繼續(xù)運(yùn)行。
本發(fā)明中代碼轉(zhuǎn)換單將二進(jìn)制可執(zhí)行程序轉(zhuǎn)換到另一種中間代碼指令VEX, VEX 指令集包括10種語句(statement)類型,12種表達(dá)式(expression)類型。由于VEX是一種 類RISC的指令集,所以它為本發(fā)明的代碼動(dòng)態(tài)轉(zhuǎn)換提供了方便。代碼轉(zhuǎn)換的基本單位 是基本塊。
內(nèi)存腐爛攻擊的首要目標(biāo)是污染指針類型的數(shù)據(jù),所以本發(fā)明需要對(duì)程序內(nèi)部指 針類型的數(shù)據(jù)進(jìn)行保護(hù)。通過對(duì)基本塊中中間代碼的分析,本發(fā)明識(shí)別出程序內(nèi)部指 針類型的數(shù)據(jù),其中指針類型的數(shù)據(jù)包括靜態(tài)的指針類型和動(dòng)態(tài)的指針類型數(shù)據(jù)。識(shí) 別出指針類型數(shù)據(jù)后,本發(fā)明進(jìn)行染色,由此每個(gè)指針只能訪問和它具有相同顏色的 內(nèi)存區(qū)域。所以在這個(gè)單元需要兩個(gè)具體的功能(1)靜態(tài)和動(dòng)態(tài)的指針數(shù)據(jù)的識(shí)別; (2)給靜態(tài)的和動(dòng)態(tài)的指針以及它們對(duì)應(yīng)的內(nèi)存區(qū)域染上相同的顏色。
內(nèi)存腐爛攻擊,通常都是由于外來的惡意輸入所導(dǎo)致的。所以在程序的運(yùn)行時(shí)刻, 本發(fā)明需要監(jiān)控程序的外來輸入的數(shù)據(jù)。本發(fā)明對(duì)從外來的輸入數(shù)據(jù)進(jìn)行染色,并在 程序的運(yùn)行過程中,進(jìn)行"顏色"的動(dòng)態(tài)傳播。所以在這個(gè)單元需要兩個(gè)具體的功能 (1)截獲外部輸入數(shù)據(jù)的操作,對(duì)外來的輸入數(shù)據(jù)進(jìn)行染色;(2)在程序的執(zhí)行過程中, 動(dòng)態(tài)的對(duì)外來的數(shù)據(jù)進(jìn)行監(jiān)控,并進(jìn)行"顏色"的動(dòng)態(tài)傳播。
幾乎所有的內(nèi)存腐爛攻擊,都是通過指針的非法劫持來實(shí)現(xiàn)的。所以在指針進(jìn)行 內(nèi)存訪問時(shí),本發(fā)明進(jìn)行惡意攻擊的實(shí)時(shí)檢測。攻擊的實(shí)時(shí)檢測,包括兩個(gè)步驟(1)首 先對(duì)要進(jìn)行內(nèi)存訪問的指針本身進(jìn)行檢測,檢測其是否被外來數(shù)據(jù)所污染;如果是, 則判定是一個(gè)惡意攻擊;否則進(jìn)行下一個(gè)步驟的檢測;(2)對(duì)指針本身和其想要訪問的 內(nèi)存區(qū)域進(jìn)行"顏色"的比對(duì),如果相同,則是一次合法的內(nèi)存訪問操作;否則,就是一次攻擊。
本發(fā)明的工作流程可以分為四個(gè)步驟首先由代碼轉(zhuǎn)換單元將二進(jìn)制代碼轉(zhuǎn)換成 VEX形式的中間代碼。代碼轉(zhuǎn)換單元是由X86/Linux平臺(tái)下的動(dòng)態(tài)二進(jìn)制代碼分析框 架Valgrind完成的;其次,由程序內(nèi)部數(shù)據(jù)染色單元21對(duì)指針類型的數(shù)據(jù)進(jìn)行染色, 將指針和其指向的內(nèi)存區(qū)域染上相同的顏色;再次,在程序運(yùn)行時(shí)監(jiān)控單元,對(duì)外來 輸入的數(shù)據(jù)進(jìn)行染色,并進(jìn)行顏色的動(dòng)態(tài)傳播;最后,在攻擊檢測單元進(jìn)行實(shí)時(shí)的攻 擊檢測,檢測點(diǎn)在指針訪問內(nèi)存時(shí)刻。
本發(fā)明使用了動(dòng)態(tài)二進(jìn)制代碼轉(zhuǎn)換和分析工具Valgrind及其插件Flayer。其中, Valgrind主要實(shí)現(xiàn)二進(jìn)制級(jí)別的代碼轉(zhuǎn)換成VEX的中間代碼形式;而Flayer則是提供 顏色的傳播功能機(jī)制。系統(tǒng)中的其他功能則由本發(fā)明自己來實(shí)現(xiàn)。
總體而言,本發(fā)明提出了一種在二進(jìn)制級(jí)別的針對(duì)內(nèi)存腐爛攻擊的實(shí)時(shí)檢測方法,
通過對(duì)程序"染色"的方法,動(dòng)態(tài)監(jiān)控外部輸入數(shù)據(jù)在程序中的執(zhí)行軌跡;通過對(duì)指 針數(shù)據(jù)訪問內(nèi)存的時(shí)候進(jìn)行攻擊檢測,這樣檢測的攻擊類型更為通用。
有益效果與己有的內(nèi)存腐爛攻擊系統(tǒng)相比,本發(fā)明有以下幾個(gè)優(yōu)點(diǎn)(1) 二進(jìn)制 級(jí)別,無需源碼;(2)攻擊檢測范圍擴(kuò)大;(3)實(shí)時(shí)檢測,且攻擊檢測準(zhǔn)確;(4)實(shí)現(xiàn)
相對(duì)簡單;(5)移植性比較好。為更好證明本發(fā)明的優(yōu)點(diǎn),本發(fā)明選取了一些具有代表
性的軟件來對(duì)本發(fā)明進(jìn)行測試。實(shí)驗(yàn)的主要目的是評(píng)價(jià)本發(fā)發(fā)明針對(duì)內(nèi)存腐爛攻擊的
實(shí)時(shí)檢測的有效性。實(shí)驗(yàn)平臺(tái)2.40GHZ Intel XeonCPU, 1G的RAM,內(nèi)核版本是2.6.18 的Debian系統(tǒng)。本發(fā)明選擇了如下的軟件來對(duì)系統(tǒng)的針對(duì)內(nèi)存腐爛攻擊的實(shí)時(shí)檢測能 力進(jìn)行有效性的評(píng)測tar-1.16, gzip-1.3.5, bzip2-1.0.5, grep-2.5.1, apache-2.0.40, ccrypt-1.7和proftp-1.2.10等。在這些程序中,都存在著與內(nèi)存相關(guān)的漏洞。圖2是有 效性測試的結(jié)果??梢钥闯觯景l(fā)明可以在上述測試程序遭受內(nèi)存腐爛攻擊時(shí),成功 的檢測出這些惡意攻擊。本發(fā)明同樣對(duì)于具有指針越界訪問的程序漏洞具有檢測能力。 在源程序級(jí)別,對(duì)于指針的越界訪問錯(cuò)誤,有比較多的工作,如Bounds-check;但是 對(duì)于針對(duì)二進(jìn)制級(jí)別的指針越界訪問錯(cuò)誤,工作幾乎沒有,因?yàn)樵诙M(jìn)制級(jí)別,很多 相關(guān)的語意信息都已經(jīng)無法獲取。因此,在二進(jìn)制級(jí)別進(jìn)行指針的越界訪問檢測具有 重要意義。
下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明做更進(jìn)一步的具體說明,本發(fā)明的上述和/ 或其他方面的優(yōu)點(diǎn)將會(huì)變得更加清楚。 圖1是本發(fā)明的系統(tǒng)結(jié)構(gòu)示意圖。 圖2是本發(fā)明的有效性測試結(jié)果。 圖3是VEX指令集構(gòu)成圖。圖4是本發(fā)明的指針類型數(shù)據(jù)識(shí)別示意圖。 圖5是本發(fā)明的將指針類型數(shù)據(jù)進(jìn)行染色的示意圖。 圖6是本發(fā)明的對(duì)程序進(jìn)行動(dòng)態(tài)監(jiān)控的示意圖。 圖7是本發(fā)明的檢測內(nèi)存腐爛攻擊的示意圖。 圖8是本發(fā)明中實(shí)施例的示意圖。
具體實(shí)施例方式
本發(fā)明是建立在Valgrind及其插件Flayer上的。
如圖1所示,本發(fā)明所述二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng)10包括代碼 轉(zhuǎn)換單元20,程序內(nèi)部數(shù)據(jù)染色單元21,程序運(yùn)行時(shí)監(jiān)控單元22和攻擊檢測單元23。
所述代碼轉(zhuǎn)換單元20用于將二進(jìn)制級(jí)別的代碼轉(zhuǎn)換成Valgrind中間代碼形式 VEX,所述VEX是一種精簡指令集。VEX指令集的語句有10種。表達(dá)式有12種。 如圖3所示,VEX指令集分為語句和表達(dá)式。語句和表達(dá)式的區(qū)別是語句修改寄存 器/內(nèi)存/臨時(shí)變量,而表達(dá)式僅使用寄存器/內(nèi)存/臨時(shí)變量的值。在VEX指令集中數(shù)據(jù) 對(duì)象分為四類寄存器,內(nèi)存,臨時(shí)變量,常量。對(duì)寄存器的讀寫指令為Ist—Put,Iex—Get; 對(duì)內(nèi)存的讀寫指令為1st—Store, Iex_Load;對(duì)臨時(shí)變量的讀寫指令為1st—tmp, lex—tmp; 對(duì)常量的讀寫指令為lex—Const。
中間代碼VEX的操作指令集分成三類(1)數(shù)據(jù)移動(dòng)指令。比如LOAD, STORE, MOVE, PUSH, POP; (2)算術(shù)運(yùn)算指令。比如ADD, SUB, XOR; (3)無操作指 令NOP, JMP。
所述程序內(nèi)部數(shù)據(jù)染色單元21根據(jù)程序運(yùn)行時(shí)執(zhí)行到的VEX指令,并掃描和査 找VEX指令,當(dāng)識(shí)別出是指針類型的數(shù)據(jù)時(shí),給指針類型的數(shù)據(jù)染色。因?yàn)閮?nèi)存腐爛 攻擊的首要目標(biāo)就是污染指針類型的數(shù)據(jù),所以本發(fā)明需要識(shí)別出指針類型的數(shù)據(jù), 并染色進(jìn)行完整性保護(hù)。這些功能都分別是由指針類型數(shù)據(jù)識(shí)別211和指針類型數(shù)據(jù) 染色212兩個(gè)模塊完成。
所述指針類型數(shù)據(jù)識(shí)別211模塊是建立在Valgrind上的,在將二進(jìn)制級(jí)別的程序 轉(zhuǎn)換成中間代碼形式VEX后,根據(jù)VEX的RISC指令特點(diǎn),識(shí)別書指針類型的數(shù)據(jù), 并記錄下來。
所述指針類型數(shù)據(jù)染色212模塊在識(shí)別指針指針類型的基礎(chǔ)上,并且區(qū)分靜態(tài)指 針和動(dòng)態(tài)指針類型數(shù)據(jù),最后為這些指針類型的數(shù)據(jù)染色,從而提供完整性保護(hù)。
所述程序運(yùn)行時(shí)監(jiān)控單元22是在程序運(yùn)行時(shí)刻,截獲外來輸入函數(shù)操作,并對(duì)外 部輸入數(shù)據(jù)染色,然后監(jiān)控外來數(shù)據(jù)在程序內(nèi)部運(yùn)行時(shí)的傳播過程,把與外來數(shù)據(jù)有 數(shù)據(jù)依賴關(guān)系的其他數(shù)據(jù)染上和外來數(shù)據(jù)相同的顏色。這些功能分別是由外部輸入數(shù) 據(jù)染色221和染色數(shù)據(jù)的動(dòng)態(tài)傳播222兩個(gè)模塊完成。所述外部輸入數(shù)據(jù)染色221模塊需要截獲外部輸入函數(shù)操作,因?yàn)閮?nèi)存腐爛攻擊 都是由外部惡意輸入數(shù)據(jù)所導(dǎo)致的。這個(gè)模塊將玩不輸入的數(shù)據(jù)染上特殊的顏色,代 表了這個(gè)數(shù)據(jù)是來自外部的,是不可信任的。
所述染色數(shù)據(jù)的動(dòng)態(tài)傳播222模塊,是在程序運(yùn)行過程中,監(jiān)控外來數(shù)據(jù)在程序 中的傳播過程。外來輸入的數(shù)據(jù)在程序運(yùn)行過程中,將會(huì)有程序中的其他數(shù)據(jù)與之發(fā) 生間接的或者直接的依賴關(guān)系,同樣需要把與外來輸入數(shù)據(jù)有依賴關(guān)系的數(shù)據(jù)染上和 它相同的顏色。
所述攻擊檢測單元23模塊是實(shí)時(shí)檢測內(nèi)存腐爛攻擊的模塊。它的攻擊檢測點(diǎn)是在 指針方位內(nèi)存時(shí)刻,因?yàn)榻^大多數(shù)的內(nèi)存腐爛攻擊都是由指針的非法劫持所導(dǎo)致的。 在每次指針訪問內(nèi)存操作時(shí),首先要檢測指針本身有沒有被外部數(shù)據(jù)所污染,其次要 檢測指針本身和它欲訪問的內(nèi)存之間的顏色是否相同。這些功能分別是由指針本身完
整性檢測231和指針和內(nèi)存顏色對(duì)比232兩個(gè)模塊完成。
所述指針本身完整性檢測231模塊,是在指針訪問內(nèi)存操作時(shí),首先檢測指針本 身有沒有被外部數(shù)據(jù)所污染,也就是指針本身的完整性檢測。如果已經(jīng)被污染,則認(rèn) 為是檢測到攻擊了,否則將繼續(xù)下一個(gè)模塊的檢測工作。
所述指針和內(nèi)存顏色對(duì)比232模塊,是在指針本身沒有被外來數(shù)據(jù)污染的基礎(chǔ)上, 繼續(xù)的檢測工作。在這個(gè)模塊中,將會(huì)比對(duì)指針本身的顏色和該指針欲訪問的內(nèi)存的 顏色,如果這兩者的顏色是相同的話,這是一個(gè)合法的指針訪問操作;否則,這是一 個(gè)非法的指針越界方位操作。
如圖4所示,指針類型數(shù)據(jù)包括指針本身和指針指向的內(nèi)存區(qū)域的識(shí)別部分具體 包括如下步驟
步驟S100在Valgrind生成的中間代碼VEX中査找操作碼Add32。
步驟S200,判斷在VEX中是否找到了一個(gè)操作碼Add32,如果查找到,跳至步
驟S300;否則跳至步驟S600。
步驟S300,在VEX中,査找到了操作碼Add32后,需要繼續(xù)査找在Add32后,
是否有操作碼STle,因?yàn)橹羔樀囊粋€(gè)特點(diǎn),就是在使用時(shí)必須被初始化。
步驟S400,判斷是否在Add32后面緊跟著的是否是操作碼STle,如果是,跳至步
驟S500;否則,跳至步驟S600。
步驟S500,是在識(shí)別指針的基礎(chǔ)上,對(duì)程序內(nèi)部的指針類型的數(shù)據(jù)染色。
步驟S600,需要對(duì)程序在運(yùn)行時(shí)刻,動(dòng)態(tài)監(jiān)控外來數(shù)據(jù)流程。
如圖5所示,指針類型數(shù)據(jù)的染色部分即將指針本身和其指向的內(nèi)存區(qū)域打上顏
色標(biāo)簽具體包括如下步驟
步驟S500,實(shí)在圖4識(shí)別出指針的基礎(chǔ)上,開始對(duì)指針類型的數(shù)據(jù)進(jìn)行染色。步驟S501,因?yàn)橹羔樣袃煞N類型,包括動(dòng)態(tài)的和靜態(tài)的,所以需要對(duì)指針的具體 類型做出判斷。如果該指針是靜態(tài)指針的話,跳至步驟S502;否則,跳至步驟S503。
步驟S502,將在操作碼STle中的地址取出,并將這個(gè)地址處的變量染色,這個(gè)步 驟就是對(duì)靜態(tài)指針類型數(shù)據(jù)的染色。
步驟S503,表示的是識(shí)別出來的是動(dòng)態(tài)生成的指針數(shù)據(jù)。動(dòng)態(tài)指針類型的數(shù)據(jù), 一般都是通過malloc()族函數(shù)來進(jìn)行分配的。本發(fā)明截獲這些內(nèi)存分配函數(shù),然后至步 驟S504。
步驟S504,表示在得到動(dòng)態(tài)分配的指針類型的數(shù)據(jù)后,進(jìn)行染色,因?yàn)橹羔橆愋?的數(shù)據(jù)是與安全敏感相關(guān)的。
步驟S600,表示在對(duì)指針類型的數(shù)據(jù)進(jìn)行染色后,動(dòng)態(tài)監(jiān)控程序的運(yùn)行。
圖6是程序運(yùn)行時(shí)監(jiān)控單元22模塊的具體實(shí)施流程示意圖,即監(jiān)控顏色的動(dòng)態(tài)傳 播,其中又包括兩個(gè)子模塊外部輸入數(shù)據(jù)染色221和染色數(shù)據(jù)的動(dòng)態(tài)傳播222。
步驟S600,是在圖4和圖5的基礎(chǔ)上進(jìn)行的,在程序動(dòng)態(tài)運(yùn)行的時(shí)候,需要對(duì)外 來輸入的數(shù)據(jù)進(jìn)行染色跟蹤,并對(duì)顏色進(jìn)行傳播。
步驟S601,截獲外來數(shù)據(jù)的輸入函數(shù)。因?yàn)閮?nèi)存腐爛攻擊,都通常是來自外界的 惡意數(shù)據(jù)輸入,所以,本發(fā)明需要對(duì)這部分?jǐn)?shù)據(jù)進(jìn)行染色跟蹤。如果是數(shù)據(jù)輸入函數(shù), 則跳至步驟S602;否則,跳至步驟S603。
步驟S602,在截獲外來數(shù)據(jù)輸入函數(shù)后,將外來輸入的數(shù)據(jù)染色。
步驟S603,在VEX中間代碼中,査找數(shù)據(jù)移動(dòng)指令和算術(shù)運(yùn)算指令,比如STORE, ADD等,這些都是和顏色傳播相關(guān)的指令。如果是這些傳播指令的話,跳至步驟S604; 否則,跳至步驟S700。
步驟S604,在程序運(yùn)行時(shí)刻,動(dòng)態(tài)的進(jìn)行顏色的傳播。對(duì)于數(shù)據(jù)移動(dòng)指令,將源 數(shù)據(jù)的顏色,傳播到目的數(shù)據(jù);對(duì)于算術(shù)運(yùn)算指令,如果操作數(shù)中有一個(gè)被外來數(shù)據(jù) 污染,則目的操作數(shù)也被污染。
步驟S700,是在顏色動(dòng)態(tài)傳播的基礎(chǔ)上,當(dāng)指針訪問內(nèi)存時(shí),進(jìn)行攻擊檢測。
圖7是攻擊檢測單元23模塊的具體實(shí)施流程示意圖,其中又包括兩個(gè)子模塊指針 本身完整性檢測231和指針和內(nèi)存顏色對(duì)比232。
步驟S700,在圖6的基礎(chǔ)上,在指針訪問內(nèi)存時(shí),進(jìn)行具體的攻擊檢測行為的判
n>「 斷。
步驟S701,在VEX中間代碼中查找操作指令LOAD,指針訪問內(nèi)存時(shí),通常都 要從寄存器中先去取地址的,所以,以LOAD指令作為指針訪問內(nèi)存的標(biāo)志性動(dòng)作。 如果是LOAD,則跳至步驟S702;否則,跳至步驟S800。
步驟S702,在步驟S701的基礎(chǔ)上,提取出指針的顏色。步驟S703,在步驟S702提取出指針本身顏色的基礎(chǔ)上,檢測指針本身是否被污 染。如果指針本身是被污染了,則跳至步驟S706;否則,跳至步驟S704。
步驟S704,在指針本身沒有被污染的基礎(chǔ)上,提取出指針欲訪問的內(nèi)存區(qū)域的顏色。
步驟S705,在步驟S702的基礎(chǔ)上提取出指針本身的顏色,在步驟S704的基礎(chǔ)上 提取出指針欲訪問內(nèi)存的顏色,兩者顏色進(jìn)行比對(duì)。如果兩者顏色相同的話,跳至步 驟S800;否則,跳至步驟S706。
步驟S706,表示檢測到一個(gè)內(nèi)存腐爛攻擊。
步驟S800,表示沒有檢測到攻擊,程序繼續(xù)運(yùn)行。
本發(fā)明中,污染、染色、提取顏色等操作,在國內(nèi)的計(jì)算機(jī)領(lǐng)域現(xiàn)在還沒有規(guī)范 化的術(shù)語名稱,國外的計(jì)算機(jī)領(lǐng)域統(tǒng)稱為taint。
所謂染色使用某一個(gè)影子內(nèi)存(shadowmemory)來對(duì)某個(gè)變量進(jìn)行的說明,指示 該變量是不是已經(jīng)被初始化了,是不是其值來源于某另外一個(gè)變量,等等,簡單的說, 就是用一個(gè)標(biāo)記來指示該變量的某些性質(zhì)。影子內(nèi)存可以使用一個(gè)bit,或者是一個(gè)byte 來指示該變量的性質(zhì)。本發(fā)明使用了一個(gè)bit就足夠了。
所謂顏色傳播是指將一個(gè)變量的顏色(實(shí)際就是在影子內(nèi)存中的該變量的標(biāo)記) 傳播給與這個(gè)變量具有數(shù)據(jù)依賴關(guān)系的另一個(gè)變量。數(shù)據(jù)依賴關(guān)系可以是賦值運(yùn)算, 算術(shù)運(yùn)算等。例如在函數(shù)f(a)中,a變量的顏色標(biāo)記是tagl,在語句b:a中,將a的 顏色傳播給b,所以b的顏色也變成tagl?;\統(tǒng)的,就是將右邊的操作數(shù)的顏色傳遞給 左邊的操作數(shù)。
污染是指某個(gè)變量的值來源于一個(gè)外來輸入的數(shù)據(jù)。那么該變量就被外來數(shù)據(jù) 污染了。
提取顏色就是抽取出某個(gè)變量的指示標(biāo)記(顏色)。
int f(int a)//假設(shè)變量a來自外來輸入,其顏色為tagl intb;
b=2*a; //算術(shù)運(yùn)算,a的顏色被傳播,b的顏色為tagl
returnb; //由于b的值來源于外來輸入數(shù)據(jù)a,故b是被污染的
如圖8所示,具體的使用本發(fā)明進(jìn)行攻擊檢測的詳細(xì)例子如下 實(shí)例函數(shù)dynamic—attack()中存在一個(gè)指針越界訪問的錯(cuò)誤。 在程序的第5行,i<=n,是一個(gè)程序員經(jīng)常會(huì)寫錯(cuò)的語句,導(dǎo)致當(dāng)i=n時(shí),第6 行的指針buffer將訪問一個(gè)未經(jīng)動(dòng)態(tài)函數(shù)malloc()分配的內(nèi)存空間,就會(huì)出現(xiàn)越界訪問攻擊。
使用本發(fā)明,可以把這個(gè)內(nèi)存訪問錯(cuò)誤檢測出來。具體檢測細(xì)節(jié)如下。
在第3行使用malloc()進(jìn)行動(dòng)態(tài)內(nèi)存分配時(shí)(假設(shè)這里n=3),將分配到的內(nèi)存區(qū) 域和返回值buffer都染上相同的顏色,如圖8所示,內(nèi)存區(qū)域buffer,和三個(gè),a, 都使用了相同的顏色進(jìn)行標(biāo)記。
使用相同的顏色,使得指針只能訪問和他本身相同顏色的內(nèi)存區(qū)域。故當(dāng)Kn時(shí), 指針buffer訪問時(shí),是合法的。
當(dāng)ia時(shí),指針buffer將訪問一個(gè)顏色和buffer本身顏色不同的內(nèi)存區(qū)域,此 時(shí),指針buffer指向的區(qū)域在動(dòng)態(tài)分配的內(nèi)存之外,該欲訪問的內(nèi)存區(qū)域在malloc() 分配內(nèi)存時(shí)沒有使用和指針buffer相同的顏色進(jìn)行標(biāo)記,所以顏色的對(duì)比是不同的, 這次指針訪問內(nèi)存的動(dòng)作是非法的。
程序如下 void dynamic—attack(n)
l,inti;
2, char* buffer^
3, buffer=(char*)malloc(n);
4, if(buffer==NULL) return;
5, for(i=0;i<=n;i++)
6, *(bufferH)=,a,;
7, printf(buffer);
8, free(buffer);
本發(fā)明提供了一種二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng)的思路及方法,具體 實(shí)現(xiàn)該技術(shù)方案的方法和途徑很多,以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出, 對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若
干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。本實(shí)施例中未明確的各 組成部份均可用現(xiàn)有技術(shù)加以實(shí)現(xiàn)。
權(quán)利要求
1、一種二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),其特征在于,包括以下部分代碼轉(zhuǎn)換單元(20)、程序內(nèi)部數(shù)據(jù)染色單元(21)、程序運(yùn)行時(shí)監(jiān)控單元(22)以及攻擊檢測單元(23);所述代碼轉(zhuǎn)換單元(20)用于將二進(jìn)制級(jí)別的代碼轉(zhuǎn)換成Valgrind中間代碼形式VEX;所述程序內(nèi)部數(shù)據(jù)染色單元(21)包括指針類型數(shù)據(jù)識(shí)別部分(211)和指針類型數(shù)據(jù)染色部分(212),用于根據(jù)程序運(yùn)行時(shí)執(zhí)行到的VEX指令,并掃描和查找VEX指令,當(dāng)識(shí)別出是指針類型的數(shù)據(jù)時(shí),對(duì)指針類型的數(shù)據(jù)染色;所述程序運(yùn)行時(shí)監(jiān)控單元(22)用于對(duì)靜態(tài)指針和動(dòng)態(tài)指針數(shù)據(jù)進(jìn)行識(shí)別,并對(duì)靜態(tài)指針和動(dòng)態(tài)指針以及靜態(tài)指針和動(dòng)態(tài)指針對(duì)應(yīng)的內(nèi)存區(qū)域染上相同的顏色;所述攻擊檢測單元(23)用于截獲外部輸入數(shù)據(jù)的操作,對(duì)外來的輸入數(shù)據(jù)進(jìn)行染色,并在程序的執(zhí)行過程中,動(dòng)態(tài)的對(duì)外來的數(shù)據(jù)進(jìn)行監(jiān)控,并進(jìn)行顏色的動(dòng)態(tài)傳播。
2、 根據(jù)權(quán)利要求1所述的二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),其特征在于, 所述指針類型數(shù)據(jù)識(shí)別部分(211)包括以下步驟步驟S100,在Valgrind生成的中間代碼VEX中査找操作碼Add32; 步驟S200,如果存在操作碼Add32,則跳到步驟S300;否則跳至步驟S600; 步驟S300,在VEX中,査找在操作碼Add32后的操作碼;步驟S400,如果操作碼Add32后的為操作碼STle,則跳至步驟S500;否則跳至步 驟S600;步驟S500,用指針類型數(shù)據(jù)染色部分(212)對(duì)程序內(nèi)部的指針類型的數(shù)據(jù)染色; 步驟S600,程序運(yùn)行時(shí)監(jiān)控。
3、 根據(jù)權(quán)利要求2所述的二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),其特征在于, 步驟S500所述指針類型數(shù)據(jù)染色部分(212)包括以下步驟步驟S501,如果指針為靜態(tài)指針,則跳至步驟S502;否則跳至步驟S503; 步驟S502,將在操作碼STle中的地址取出,并將該地址處的變量染色; 步驟S503,截獲malloc()族函數(shù)以及非系統(tǒng)函數(shù)調(diào)用; 步驟S504,對(duì)動(dòng)態(tài)分配的指針類型的數(shù)據(jù)進(jìn)行染色; 步驟S600,程序運(yùn)行時(shí)監(jiān)控。
4、 根據(jù)權(quán)利要求3所述的二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),其特征在于, 所述步驟S600程序運(yùn)行時(shí)監(jiān)控由程序運(yùn)行時(shí)監(jiān)控單元(22)進(jìn)行,包括以下步驟步驟S601,如果是數(shù)據(jù)輸入函數(shù)scanf()族函數(shù),則跳至步驟S602;否則跳至步驟S603;步驟S602,將外來輸入函數(shù)的數(shù)據(jù)染色;步驟S603,在VEX中間代碼中,査找是否存在傳播指令,如果存在傳播指令,則 跳至步驟S604;否則跳至步驟S700; 步驟S604,動(dòng)態(tài)的進(jìn)行顏色的傳播; 步驟S700,進(jìn)行攻擊檢測。
5、根據(jù)權(quán)利要求4所述的二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),其特征在于, 所述步驟S700進(jìn)行攻擊檢測由所述攻擊檢測單元(23)進(jìn)行,包括以下步驟步驟S701 ,在VEX中間代碼中査找操作指令LOAD,如果存在操作指令LOAD, 則跳至步驟S702;否則跳至步驟S800;步驟S702,提取出指針的顏色;步驟S703,檢測指針是否被污染,如果指針被污染,則跳至步驟S706;否則跳至 步驟S704;步驟S704,提取出指針要訪問的內(nèi)存區(qū)域的顏色;步驟S705,對(duì)步驟S702中提取的指針顏色以及步驟S704中提取的指針要訪問內(nèi) 存的顏色進(jìn)行比對(duì),如果兩者顏色相同,跳至步驟S800;否則跳至步驟S706; 步驟S706,檢測到內(nèi)存腐爛攻擊; 步驟S800,沒有檢測到攻擊,程序繼續(xù)運(yùn)行。
全文摘要
本發(fā)明公開了二進(jìn)制程序內(nèi)存腐爛攻擊的實(shí)時(shí)檢測系統(tǒng),包括代碼轉(zhuǎn)換單元用于將二進(jìn)制級(jí)別的代碼轉(zhuǎn)換成Valgrind中間代碼形式VEX;程序內(nèi)部數(shù)據(jù)染色單元包括指針類型數(shù)據(jù)識(shí)別部分和指針類型數(shù)據(jù)染色部分,用于根據(jù)程序運(yùn)行時(shí)執(zhí)行到的VEX指令,并掃描和查找VEX指令,當(dāng)識(shí)別出是指針類型的數(shù)據(jù)時(shí),對(duì)指針類型的數(shù)據(jù)染色;程序運(yùn)行時(shí)監(jiān)控單元用于對(duì)靜態(tài)指針和動(dòng)態(tài)指針數(shù)據(jù)進(jìn)行識(shí)別,并對(duì)靜態(tài)指針和動(dòng)態(tài)指針以及靜態(tài)指針和動(dòng)態(tài)指針對(duì)應(yīng)的內(nèi)存區(qū)域染上相同的顏色;攻擊檢測單元用于截獲外部輸入數(shù)據(jù)的操作,對(duì)外來的輸入數(shù)據(jù)進(jìn)行染色,并動(dòng)態(tài)的對(duì)外來的數(shù)據(jù)進(jìn)行監(jiān)控,并進(jìn)行顏色的動(dòng)態(tài)傳播。本發(fā)明實(shí)時(shí)檢測,且攻擊檢測準(zhǔn)確。
文檔編號(hào)G06F21/00GK101539976SQ200910026449
公開日2009年9月23日 申請(qǐng)日期2009年4月23日 優(yōu)先權(quán)日2009年4月23日
發(fā)明者磊 王, 兵 茅, 立 謝, 平 陳 申請(qǐng)人:南京大學(xué)