專利名稱:符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及整形漏洞檢測(cè)定位裝置,特別是一種符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn) 制漏洞檢測(cè)定位裝置。
背景技術(shù):
整形漏洞是著名的軟件安全漏洞之一,在(:或〔++程序中尤為突出。整形漏洞
分為四類(l)輕形下溢出(IntegerUnderflow); (2)整形上溢出(IntegerOverflo w); (3)符號(hào)轉(zhuǎn)換錯(cuò)誤(SignednessError); (4)賦值截?cái)?AssignmentTruncation)。 2006年CVE (CommonVulnerabi 1 ityandExploit)指出緩沖區(qū)溢出漏洞(bufferoverf low)呈下降趨勢(shì),而其他一些漏洞呈上升趨勢(shì),如符號(hào)轉(zhuǎn)換錯(cuò)誤,賦值截?cái)嗟取?目前,雖然已有了一些針對(duì)整形溢出的漏洞檢測(cè)工具,但是針對(duì)符號(hào)轉(zhuǎn)換錯(cuò)誤和 賦值截?cái)嗦┒催€沒有很好的檢測(cè)和定位工具。符號(hào)轉(zhuǎn)換錯(cuò)誤和賦值截?cái)嗦┒赐?會(huì)觸發(fā)很嚴(yán)重的攻擊,如任意代碼執(zhí)行(arbitrarycodeexecution),拒絕服務(wù)攻擊 (denialofservice), 等等。
符號(hào)轉(zhuǎn)換錯(cuò)誤和賦值截?cái)嗦┒匆话闩c程序語義相關(guān),因此很難被檢測(cè)和定位。 程序員經(jīng)常忽視,甚至對(duì)這兩種整形漏洞知之甚少。標(biāo)準(zhǔn)編譯器,如GCC,對(duì)符號(hào) 轉(zhuǎn)換錯(cuò)誤和賦值截?cái)嗦┒匆膊荒芴峁┚婊蝈e(cuò)誤信息。更糟糕的是,這兩種整形 漏洞常常與某些攻擊方法結(jié)合,共同產(chǎn)生內(nèi)存錯(cuò)誤。現(xiàn)有的安全工具幾乎都不能 檢測(cè)并定位符號(hào)轉(zhuǎn)換錯(cuò)誤和賦值截?cái)嗦┒础?br>
此外,與有源代碼的程序相比,二進(jìn)制程序缺少顯式的類型信息,需要從某 些特定的操作和函數(shù)定義中獲得這些信息。
特別是,目前針對(duì)符號(hào)轉(zhuǎn)換錯(cuò)誤和賦值截?cái)嗦┒吹臋z測(cè)工具很少,而且至少 存在如下的缺點(diǎn)之一(1)需要源代碼(2)人工參與(3)不能檢測(cè)和定位符號(hào)轉(zhuǎn)換錯(cuò) 誤和賦值截?cái)嗦┒?。目?在二進(jìn)制程序分析工具中,典型的工具是Valgrind,它 將二進(jìn)制代碼轉(zhuǎn)換成VEX中間代碼,并在此中間代碼上進(jìn)行分析。在Valgrind上, 已經(jīng)出現(xiàn)了許多功能插件,如內(nèi)存錯(cuò)誤分析插件Memcheck,類型引用插件Catchc onv等。本發(fā)明基于Valgrind以及Catchconv,檢測(cè)和定位符號(hào)錯(cuò)誤和賦值截?cái)唷?相關(guān)資料參見N.Nethercote and J". Seward. Valgrind: A framework for heavy weigh t dynamic binary instrumentation. In Proceedings of P1DI 2007, San Diego, Califo rnia, USA, June 2007或者J. Seward and N. Nethercote. Using valgrind to detect un defined value errors with bit-precision. In Proceedings of the USENIX05 Annual Technical Conference, Anaheim,'California"f USA, April 2005或者D. A. Molnar and D.
Wagner. Catchconv: Symbolic execution and run-time type inference for integer c onversion errors. Technical Report UCB/EECS-2007-23, EECS Department, University
of California, Berkeley, February 2007。
發(fā)明內(nèi)容
發(fā)明目的本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提供一種符號(hào)錯(cuò)誤和賦 值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置,對(duì)二進(jìn)制程序進(jìn)行保護(hù)。
技術(shù)方案本發(fā)明公開了一種符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝 置,該裝置包括以下單元
用于將二進(jìn)制代碼轉(zhuǎn)換成VEX中間代碼的代碼轉(zhuǎn)換單元;
信息記錄單元,所述信息記錄單元包括用于記錄變量的類型信息的類型信 息提取模塊;用于記錄變量的最新值的數(shù)值信息提取模塊;用于記錄賦給變量最 新值的指令地址的指令地址提取模塊;
檢測(cè)定位單元,所述檢測(cè)定位單元包括符號(hào)錯(cuò)誤檢測(cè)模塊以及賦值截?cái)鄼z
測(cè)模塊。
本發(fā)明中,優(yōu)選地,所述代碼轉(zhuǎn)換單元通過二進(jìn)制分析工具Valgrind將二進(jìn) 制代碼轉(zhuǎn)換成VEX中間代碼;包括對(duì)寄存器的讀/寫指令、對(duì)內(nèi)存的讀/寫指令、
對(duì)臨時(shí)變量的讀/寫指令、對(duì)常量的讀指令。
本發(fā)明中,優(yōu)選地,所述二進(jìn)制分析工具Valgrind插入類型引用插件 Catchconv后,所述類型信息提取模塊的類型信息通過符號(hào)跳轉(zhuǎn)指令、庫函數(shù)定義 以及操作數(shù)的大小信息獲得。
本發(fā)明中,優(yōu)選地,類型信息提取模塊提取的類型信息包括寬度信息和符號(hào) 信息;所述寬度信息包括8bits、 16bits、 32bits;符號(hào)信息包括有符號(hào)和 無符號(hào)。
本發(fā)明中,優(yōu)選地,所述數(shù)值信息提取模塊將內(nèi)存寫指令所寫的數(shù)值記錄下 來,并且通過內(nèi)存讀指令,寄存器讀寫指令,臨時(shí)變量讀寫指令,將數(shù)值傳遞給 寄存器以及臨時(shí)變量。本發(fā)明為每個(gè)內(nèi)存變量、寄存器以及臨時(shí)變量分配額外的 數(shù)值空間,用來存放它們的最新值。所謂最新值,是指程序執(zhí)行時(shí)刻該操作數(shù)的 值。分兩種情況記錄數(shù)值信息(1)當(dāng)遇到內(nèi)存寫指令時(shí),將所寫的數(shù)值作為該 內(nèi)存變量最新值記錄下來;(2)當(dāng)遇到內(nèi)存、寄存器或臨時(shí)變量讀指令時(shí),先將 讀出的數(shù)值保存,并將該數(shù)值通過寄存器、臨時(shí)變量寫指令,暫時(shí)保存在寄存器 或臨時(shí)變量中,該數(shù)值會(huì)隨著賦值,運(yùn)算等操作傳播。
5本發(fā)明中,優(yōu)選地,所述指令地址提取模塊記錄內(nèi)存寫操作所對(duì)應(yīng)的指令地 址。該地址信息由VEX語句Ist一Imark提供,記錄在該指令對(duì)應(yīng)的操作數(shù)中。本 發(fā)明為每個(gè)內(nèi)存變量、寄存器以及臨時(shí)變量分配額外的地址空間,用來記錄指令 地址。
本發(fā)明的工作流程可以分為三步首先,由代碼轉(zhuǎn)換單元20將二進(jìn)制碼轉(zhuǎn)換 成中間語言VEX,代碼轉(zhuǎn)換單元是由二進(jìn)制分析工具Valgrind完成的。其次,程 序運(yùn)行時(shí),根據(jù)所執(zhí)行的VEX語句和表達(dá)式,由信息記錄單元21提取和記錄相應(yīng) 的信息。最后,由檢測(cè)定位單元22根據(jù)記錄的信息,檢測(cè)和定位漏洞。 本發(fā)明中,優(yōu)選地,所述符號(hào)錯(cuò)誤檢測(cè)模塊包括以下步驟 步驟SIOO,在信息記錄單元提取操作數(shù)的符號(hào)類型信息前,檢査該操作數(shù)已 有的符號(hào)類型信息;
步驟S200,判斷操作數(shù)的符號(hào)類型信息是否有類型沖突;所謂類型沖突是指 某個(gè)操作數(shù)既被用做無符號(hào)數(shù)又被用做有符號(hào)數(shù)。
例如,int a; [1]if(a〉15)." [2]memcpy (buf 1, buf2, a);
當(dāng)執(zhí)行到memcpy這條語句時(shí),a所對(duì)應(yīng)的操作數(shù)的類型有沖突。因?yàn)樵赱l] 處,a被當(dāng)成有符號(hào)數(shù)使用,而在[2]處,由memcpy庫函數(shù)定義,a被當(dāng)成無符號(hào) 數(shù)使用。因此存在符號(hào)類型沖突。
如果操作數(shù)的符號(hào)類型信息有沖突,則執(zhí)行步驟S600;如果操作數(shù)的符號(hào)類 型信息沒有沖突,則執(zhí)行下一步;
步驟S300,由信息記錄單元從二元運(yùn)算中的比較操作以及庫函數(shù)定義中提取 操作數(shù)的符號(hào)類型信息;
步驟S400,判斷操作數(shù)符號(hào)類型信息是否有沖突;即步驟S300提取的符號(hào)類 型信息和步驟S100檢査的操作數(shù)已有的符號(hào)類型信息是否存在類型沖突;
步驟S500,如果操作數(shù)的類型不存在沖突,則根據(jù)步驟S300提取的符號(hào)類型 信息重新設(shè)置并記錄操作數(shù)的類型信息;
步驟S600,如果存在操作數(shù)類型沖突,先記錄該操作數(shù)的類型信息有沖突; 然后根據(jù)信息記錄單元記錄的操作數(shù)最新值判斷是否為負(fù)數(shù);如果為負(fù)數(shù),則判 定是符號(hào)錯(cuò)誤漏洞,執(zhí)行步驟S700;如果為正數(shù),執(zhí)行步驟S800程序正常運(yùn)行; 即如果a是負(fù)數(shù),則檢測(cè)到符號(hào)類型錯(cuò)誤,并定位該漏洞。如果a為正數(shù),則程 序正常運(yùn)行。
步驟S700,根據(jù)信息記錄單元提取的指令地址信息,并由信息記錄單元記錄 該指令地址信息。該地址信息就是符號(hào)轉(zhuǎn)換錯(cuò)誤的定位點(diǎn),報(bào)告該地址,符號(hào)轉(zhuǎn)換錯(cuò)誤的檢測(cè)和定位完成。
步驟S800,指程序沒有檢測(cè)到符號(hào)轉(zhuǎn)換錯(cuò)誤,繼續(xù)正常運(yùn)行。
本發(fā)明中,優(yōu)選地,所述賦值截?cái)鄼z測(cè)模塊包括以下步驟
步驟S900,判斷所執(zhí)行的VEX指令是否為寄存器讀操作lex—GET;
步驟SIOOO,判斷從寄存器讀出的值是否超過寄存器讀所能讀出的最大值;所 述最大值,是指寄存器讀對(duì)應(yīng)的寬度類型(8bits、 16bits、 32bi.ts)所能表示的 最大值。例如,8bits對(duì)應(yīng)的最大值是256。如果超出最大值,執(zhí)行步驟S1100; 否則執(zhí)行步驟S1300繼續(xù)運(yùn)行;
步驟SllOO,判斷是否下一條指令為內(nèi)存寫指令1st—STORE;如果為內(nèi)存寫指 令,則執(zhí)行步驟S1200;
步驟S1200,根據(jù)信息記錄單元提取的指令地址信息,并由信息記錄單元記錄 該指令地址信息。該地址信息就是賦值截?cái)嗟亩ㄎ稽c(diǎn),報(bào)告該地址,賦值截?cái)嗟?檢測(cè)和定位完成。
步驟S1300,指程序沒有檢測(cè)到賦值截?cái)?,繼續(xù)正常運(yùn)行。
有益效果本發(fā)明提出了一種符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝 置,不需要源代碼,全自動(dòng)的運(yùn)行,不需要人工干預(yù),能準(zhǔn)確定位漏洞代碼。本 發(fā)明選取了一些具有代表性的軟件對(duì)本發(fā)明進(jìn)行測(cè)試。實(shí)驗(yàn)的主要目的是評(píng)價(jià)本 發(fā)明檢測(cè)符號(hào)轉(zhuǎn)換錯(cuò)誤和賦值截?cái)噙@兩種整形漏洞的有效性。實(shí)驗(yàn)平臺(tái) IntelPentium(R)DualE21802. OOGHz, 256MBmemory和Linux2, 6. 15kernel。測(cè)試 程序均由gcc-3. 4. 0編譯,以及glibc2. 3. 2連接。
本發(fā)明選擇了如下軟件評(píng)估檢測(cè)漏洞的有效性VLCMediaPlayerO. 8. 6i, OpenSSH2. 1.1, GNURadiusl. 2等。由于整形漏洞很難被模擬,在實(shí)驗(yàn)中,本發(fā)明 從每個(gè)軟件中提取漏洞代碼,加上導(dǎo)致錯(cuò)誤的輸入,轉(zhuǎn)換成相對(duì)較小的,獨(dú)立的 漏洞程序進(jìn)行檢測(cè)。這些程序在本發(fā)明的監(jiān)控下運(yùn)行。
圖8是有效性測(cè)試結(jié)果,值得指出的是,本發(fā)明可以檢測(cè)到GNURadiusl.2中 的符號(hào)轉(zhuǎn)換錯(cuò)誤,這個(gè)漏洞是由指針別名引起的,而由指針別名引起的整形漏洞 一般很難被安全工具檢測(cè)到。
與目前的整形漏洞檢測(cè)工具相比,本發(fā)明至少有五個(gè)的特點(diǎn)(l)二進(jìn)制級(jí) 不需要源代碼。(2)實(shí)時(shí)檢測(cè)程序運(yùn)行時(shí)檢測(cè)整形漏洞。(3)可以檢測(cè)由指針別 名引起的漏洞。(4)低誤報(bào)和漏報(bào)率。(5)能夠準(zhǔn)確定位漏洞代碼。
下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明做更進(jìn)一步的具體說明,本發(fā)明的上述和/或其他方面的優(yōu)點(diǎn)將會(huì)變得更加清楚。
圖1是本發(fā)B月的裝置的系統(tǒng)結(jié)構(gòu)示意圖。
圖2是VEX指令集構(gòu)成圖。
圖3是本發(fā)明類型信息提取模塊的結(jié)構(gòu)示意圖。
圖4是本發(fā)明由比較操作提取符號(hào)類型信息示意圖。
圖5是本發(fā)明由庫函數(shù)定義提取符號(hào)類型信息示意圖。
圖6是本發(fā)明符號(hào)錯(cuò)誤檢測(cè)模塊的實(shí)施流程示意圖。
圖7是本發(fā)明賦值截?cái)鄼z測(cè)模塊的實(shí)施流程示意圖;其中,MaxU表示n位無 符號(hào)整數(shù)的最大值。
圖8是本發(fā)明有效性測(cè)試結(jié)果。
具體實(shí)施例方式
本發(fā)明建立在Valgrind3. 2. 2和CatchconvO. 1的基礎(chǔ)上。 圖l是本發(fā)明的系統(tǒng)結(jié)構(gòu)示意圖。如圖1所示,本發(fā)明所述的符號(hào)錯(cuò)誤和賦
值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置10包括代碼轉(zhuǎn)換單元20,信息記錄單元21,
檢測(cè)定位單元22。
所述代碼轉(zhuǎn)換單元20,利用Valgrind將二進(jìn)制代碼轉(zhuǎn)換成與平臺(tái)無關(guān)的中間 代碼VEX,所述VEX是一種精簡(jiǎn)指令集,VEX指令集的語句有10種,表達(dá)式有12 種。圖2是VEX指令集。如圖2所示,VEX指令集分為語句和表達(dá)式。語句和表達(dá) 式的區(qū)別是,語句修改寄存器/內(nèi)存/臨時(shí)變量,而表達(dá)式僅使用寄存器/內(nèi)存/臨 時(shí)變量的值。在VEX指令集中數(shù)據(jù)對(duì)象分為四類寄存器,內(nèi)存,臨時(shí)變量,常 量。對(duì)寄存器的讀寫指令為1st—Put, lex—Get。對(duì)內(nèi)存的讀寫指令為Ist_Sto re, Iex_Load。對(duì)臨時(shí)變量的讀寫指令為1st—tmp, Iex_tmp。對(duì)常量的讀指令為I sx一Const-
所述信息記錄單元21根據(jù)程序運(yùn)行時(shí)執(zhí)行到的VEX指令,記錄三類信息來檢 測(cè)和定位漏洞(1)變量的類型信息,(2)變量的最新值(3)賦給變量最新值的 指令地址。這四類信息分別由"類型信息提取模塊211","數(shù)值信息提取模塊212" 以及"指令地址提取模塊213"記錄。
所述類型信息提取模塊211是建立在Valgrind插件Catchcorw基礎(chǔ)上。類型 信息可以分為寬度信息和符號(hào)信息。寬度信息可以分為,8bits, 16bits, 32bits. 符號(hào)信息可以分為,有符號(hào)和無符號(hào)。圖3是類型信息提取模塊211的結(jié)構(gòu)示意 圖。如圖3所示,寬度信息可以從寄存器/內(nèi)存/臨時(shí)變量讀寫指令中提取。符號(hào) 信息可以從二元運(yùn)算中的比較操作以及庫函數(shù)定義中提取。圖4是從二元運(yùn)算中的比較操作提取符號(hào)類型信息的示意圖。圖中"〈n〉"可 以取8, 16, 32,分別表示8bits,16bits,32bits。根據(jù)VEX的有符號(hào)比較和無符 號(hào)比較操作,提取符號(hào)類型信息。并將符號(hào)類型信息記錄在比較操作對(duì)應(yīng)的操作 數(shù)上。
圖5是從庫函數(shù)定義提取符號(hào)類型信息的示意圖。本發(fā)明從C庫函數(shù)中選取 了較常用的22個(gè)函數(shù),并且根據(jù)定義的函數(shù)參數(shù)的符號(hào)類型,提取符號(hào)類型信息。 并且記錄在參數(shù)對(duì)應(yīng)的操作數(shù)上。
所述數(shù)值信息提取模塊212,將內(nèi)存寫指令I(lǐng)st_Store所寫的數(shù)值記錄下來, 并且通過內(nèi)存讀指令,寄存器讀寫指令,臨時(shí)變量讀寫指令,將數(shù)值傳遞給寄存 器,臨時(shí)變量。本發(fā)明為每個(gè)內(nèi)存變量、寄存器以及臨時(shí)變量分配額外的數(shù)值空 間,用來存放它們的最新值。所謂最新值,是指程序執(zhí)行時(shí)刻該操作數(shù)的值。分 兩種情況記錄數(shù)值信息(1)當(dāng)遇到內(nèi)存寫指令時(shí),將所寫的數(shù)值作為該內(nèi)存變 量最新值記錄下來;(2)當(dāng)遇到內(nèi)存、寄存器或臨時(shí)變量讀指令時(shí),先將讀出的 數(shù)值保存,并將該數(shù)值通過寄存器、臨時(shí)變量寫指令,暫時(shí)保存在寄存器或臨時(shí) 變量中,該數(shù)值會(huì)隨著賦值,運(yùn)算等操作傳播。
所述地址提取模塊213,將內(nèi)存寫操作1st—Store所對(duì)應(yīng)的指令地址1st—Mar k記錄下來。為后面漏洞的定位提供信息。
所述檢測(cè)定位單元22利用信息記錄單元記錄的信息,制定策略對(duì)兩類整形漏 洞進(jìn)行檢測(cè)和定位。具體包括針對(duì)符號(hào)錯(cuò)誤檢測(cè)和定位的符號(hào)錯(cuò)誤檢測(cè)模塊221, 以及針對(duì)賦值截?cái)鄼z測(cè)和定位的賦值截?cái)鄼z測(cè)模塊222。
圖6是符號(hào)錯(cuò)誤檢測(cè)模塊221的實(shí)施流程示意圖。
如圖6所示,步驟S100,在信息記錄單元21提取操作數(shù)的符號(hào)類型信息前, 檢査該操作數(shù)已有的符號(hào)類型信息。
步驟S200,判斷操作數(shù)符號(hào)類型信息是否有類型沖突。所謂類型沖突是指某 個(gè)操作數(shù)既被用做無符號(hào)數(shù)有被用做有符號(hào)數(shù)。
例如,int a; [1]if(a〉15)…[2]memcpy(buf 1, buf2, a);
當(dāng)執(zhí)行到memcpy這條語句時(shí),a所對(duì)應(yīng)的操作數(shù)的類型有沖突。因?yàn)樵赱l] 處,a被當(dāng)成有符號(hào)數(shù)使用,而在[2]處,由memcpy庫函數(shù)定義,a被當(dāng)成無符號(hào) 數(shù)使用。因此存在符號(hào)類型沖突。
如果操作數(shù)的符號(hào)類型信息有沖突,則執(zhí)行步驟S600,根據(jù)信息記錄單元21 記錄的操作數(shù)最新值判斷是否為負(fù)數(shù)。如果為負(fù)數(shù),則是符號(hào)錯(cuò)誤漏洞,執(zhí)行步 驟S700,根據(jù)信息記錄單元21提取的指令地址信息,定位漏洞。如果為正數(shù),執(zhí)
9行步驟S800繼續(xù)運(yùn)行;如果操作數(shù)的符號(hào)類型信息沒有沖突,則執(zhí)行步驟S300,
由信息記錄單元21從二元運(yùn)算中的比較操作以及庫函數(shù)定義中提取操作數(shù)的符號(hào)
類型信息。
步驟S400,判斷操作數(shù)符號(hào)類型信息是否有沖突。即步驟S300提取的符號(hào)類 型信息和步驟S100檢査的操作數(shù)已有的符號(hào)類型信息是否存在類型沖突。
步驟S500,如果操作數(shù)的類型不存在沖突,則根據(jù)S300提取的符號(hào)類型信息 重新設(shè)置并記錄操作數(shù)的類型信息。
步驟S600,如果發(fā)現(xiàn)操作數(shù)類型沖突,先記錄該操作數(shù)的類型信息有沖突。 然后根據(jù)信息記錄單元21記錄的操作數(shù)最新值判斷是否為負(fù)數(shù)。如果為負(fù)數(shù),則 判定是符號(hào)錯(cuò)誤漏洞,執(zhí)行步驟S700,并根據(jù)信息記錄單元21提取的指令地址信 息,定位漏洞。如果為正數(shù),執(zhí)行步驟S800繼續(xù)運(yùn)行。仍以上面的例子為例,如 果a是負(fù)數(shù),則檢測(cè)到符號(hào)類型錯(cuò)誤,并定位該漏洞。如果a為正數(shù),則程序正 常運(yùn)行。
圖7是賦值截?cái)鄼z測(cè)模塊224的實(shí)施流程示意圖。在VEX中,當(dāng)把一個(gè)小于3 2位的數(shù)值寫到內(nèi)存變量時(shí),這個(gè)值連同寬度類型信息由"GET"表達(dá)式傳給寄存 器變量,然后再由"STORE"操作存入內(nèi)存變量。因此本發(fā)明對(duì)寄存器變量的讀操 作"GET"進(jìn)行檢査,判斷數(shù)值是否在其類型范圍之內(nèi),如果不在,再檢測(cè)下一個(gè) 操作是否為"STORE"。
如圖7所示,步驟S900判斷所執(zhí)行的VEX指令是否為寄存器讀"GET"操作, 接著步驟S1000判斷從寄存器讀出的值是否超過寄存器讀"GET"所能讀出的最大 值MaxU, MaxU表示n位無符號(hào)整數(shù)的最大值。。如果超出最大值,執(zhí)行步驟SllOO 判斷是否下一條指令為內(nèi)存寫"STORE"。如果為內(nèi)存寫"STORE"指令,則執(zhí)行 步驟S1300,根據(jù)信息記錄單元21提取的指令地址信息,定位漏洞。否則執(zhí)行步 驟S1200繼續(xù)運(yùn)行。
本發(fā)明提供了一種符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置的思路及 方法,具體實(shí)現(xiàn)該技術(shù)方案的方法和途徑很多,以上所述僅是本發(fā)明的優(yōu)選實(shí)施 方式,應(yīng)當(dāng)指出,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的 前提下,還可以做出若干改進(jìn)和潤(rùn)飾,這些改進(jìn)和潤(rùn)飾也應(yīng)視為本發(fā)明的保護(hù)范 圍。本實(shí)施例中未明確的各組成部份均可用現(xiàn)有技術(shù)加以實(shí)現(xiàn)。
10
權(quán)利要求
1、一種符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置,其特征在于,該裝置包括以下單元用于將二進(jìn)制代碼轉(zhuǎn)換成VEX中間代碼的代碼轉(zhuǎn)換單元(20);信息記錄單元(21),所述信息記錄單元(21)包括用于記錄變量的類型信息的類型信息提取模塊(211);用于記錄變量的最新值的數(shù)值信息提取模塊(212);用于記錄賦給變量最新值指令地址的指令地址提取模塊(213);檢測(cè)定位單元(22),所述檢測(cè)定位單元(22)包括符號(hào)錯(cuò)誤檢測(cè)模塊(221)以及賦值截?cái)鄼z測(cè)模塊(222)。
2、 根據(jù)權(quán)利要求1所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置, 其特征在于,所述代碼轉(zhuǎn)換單元(20)通過二進(jìn)制分析工具Valgrind將二進(jìn)制代 碼轉(zhuǎn)換成VEX中間代碼;包括對(duì)寄存器的讀/寫指令、對(duì)內(nèi)存的讀/寫指令、對(duì) 臨時(shí)變量的讀/寫指令、對(duì)常量的讀指令。
3、 根據(jù)權(quán)利要求2所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置, 其特征在于,所述二進(jìn)制分析工具Valgrind插入類型引用插件Catchcorw后,所 述類型信息提取模塊(211)的類型信息通過符號(hào)跳轉(zhuǎn)指令、庫函數(shù)定義以及操作 數(shù)的大小信息獲得。
4、 根據(jù)權(quán)利要求3所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置, 其特征在于,類型信息提取模塊(211)提取的類型信息包括寬度信息和符號(hào)信息; 所述寬度信息包括8bitS、16bitS、 32bits;符號(hào)信息包括有符號(hào)和無符號(hào)。
5、 根據(jù)權(quán)利要求4所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置, 其特征在于,所述數(shù)值信息提取模塊(212)將內(nèi)存寫指令所寫的數(shù)值記錄下來, 并且通過內(nèi)存讀指令,寄存器讀寫指令,臨時(shí)變量讀寫指令,將數(shù)值傳遞給寄存 器以及臨時(shí)變量。
6、 根據(jù)權(quán)利要求4所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置, 其特征在于,所述指令地址提取模塊(213)記錄內(nèi)存寫操作所對(duì)應(yīng)的指令地址。
7、 根據(jù)權(quán)利要求1所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置, 其特征在于,所述符號(hào)錯(cuò)誤檢測(cè)模塊(221)包括以下步驟步驟S100,在信息記錄單元(21)提取操作數(shù)的符號(hào)類型信息前,檢查該操 作數(shù)已有的符號(hào)類型信息;步驟S200,判斷操作數(shù)的符號(hào)類型信息是否有類型沖突,即該操作數(shù)是否既 被用做無符號(hào)數(shù)又被用做有符號(hào)數(shù);如果操作數(shù)的符號(hào)類型信息有沖突,則執(zhí)行 步驟S600;如果操作數(shù)的符號(hào)類型信息沒有沖突,則執(zhí)行下一步;步驟S300,由信息記錄單元(21)從二元運(yùn)算中的比較操作以及庫函數(shù)定義中提取操作數(shù)的符號(hào)類型信息;步驟S400,判斷操作數(shù)符號(hào)類型信息是否有沖突;即步驟S300提取的符號(hào)類 型信息和步驟S100檢査的操,數(shù)已有的符號(hào)類型信息是否存在類型沖突;步驟S500,如果操作數(shù)的類型不存在沖突,則根據(jù)步驟S300提取的符號(hào)類型 信息重新設(shè)置并記錄操作數(shù)的類型信息;步驟S600,如果存在操作數(shù)類型沖突,先記錄該操作數(shù)的類型信息有沖突; 然后根據(jù)信息記錄單元(21)記錄的操作數(shù)最新值判斷是否為負(fù)數(shù);如果為負(fù)數(shù), 則判定是符號(hào)錯(cuò)誤漏洞,執(zhí)行步驟S700;如果為正數(shù),執(zhí)行步驟S800;步驟S700,根據(jù)信息記錄單元(21)提取的指令地址信息,并由信息記錄單 元(21)記錄該指令地址信息;步驟S800,程序沒有檢測(cè)到符號(hào)轉(zhuǎn)換錯(cuò)誤,繼續(xù)正常運(yùn)行。
8、根據(jù)權(quán)利要求1至7中任意一項(xiàng)所述的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞 檢測(cè)定位裝置,其特征在于,所述賦值截?cái)鄼z測(cè)模塊(222)包括以下步驟步驟S900,判斷所執(zhí)行的VEX指令是否為寄存器讀操作Iex_GET;步驟SIOOO,判斷從寄存器讀出的值是否超過寄存器讀所能讀出的最大值;所 述VEX中間代碼對(duì)應(yīng)的寄存器讀操作是lex—GET,該操作帶有寬度類型信息,如果 超出最大值,執(zhí)行步驟SllOO,否則執(zhí)行步驟S1300;步驟SllOO,判斷是否下一條指令為內(nèi)存寫指令;在VEX中間代碼中,內(nèi)存寫 指令為1st—STORE,如果為內(nèi)存寫指令,則執(zhí)行步驟S1200;步驟S1200,根據(jù)信息記錄單元(21)提取的指令地址信息,并由信息記錄單 元(21)記錄該指令地址信息;步驟S1300,程序沒有檢測(cè)到賦值截?cái)?,繼續(xù)正常運(yùn)行。
全文摘要
本發(fā)明公開了一種符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置,該裝置包括以下單元用于將二進(jìn)制代碼轉(zhuǎn)換成VEX中間代碼的代碼轉(zhuǎn)換單元;信息記錄單元,所述信息記錄單元包括用于記錄變量的類型信息的類型信息提取模塊;用于記錄變量的最新值的數(shù)值信息提取模塊;用于記錄賦給變量最新值的指令地址的指令地址提取模塊;檢測(cè)定位單元,所述檢測(cè)定位單元包括符號(hào)錯(cuò)誤檢測(cè)模塊以及賦值截?cái)鄼z測(cè)模塊。本發(fā)明提出的符號(hào)錯(cuò)誤和賦值截?cái)嗟亩M(jìn)制漏洞檢測(cè)定位裝置,不需要源代碼,全自動(dòng)的運(yùn)行,不需要人工干預(yù),能準(zhǔn)確定位漏洞代碼。
文檔編號(hào)G06F11/36GK101551773SQ20091002588
公開日2009年10月7日 申請(qǐng)日期2009年3月12日 優(yōu)先權(quán)日2009年3月12日
發(fā)明者逸 王, 兵 茅, 立 謝, 知 辛, 平 陳 申請(qǐng)人:南京大學(xué)