專利名稱:一種軟件漏洞挖掘方法
技術(shù)領(lǐng)域:
本發(fā)明屬于軟件工程和信息安全領(lǐng)域,具體涉及一種軟件漏洞挖掘方法。
背景技術(shù):
軟件安全問題已經(jīng)成為信息系統(tǒng)諸多安全問題的根源之一,如何發(fā)現(xiàn)軟件中的安 全漏洞至關(guān)重要。一種常見的軟件漏洞挖掘技術(shù)是通過對目標(biāo)軟件的正常輸入隨機修改, 從而構(gòu)造大量畸形數(shù)據(jù)作為程序輸入,在程序處理這些畸形數(shù)據(jù)時,觀測目標(biāo)程序的表現(xiàn), 一旦程序發(fā)生異常,則發(fā)現(xiàn)了一個潛在的安全問題。然而,很多文件格式和網(wǎng)絡(luò)協(xié)議中都含有校驗和(checksum)信息。校驗和是一種 常用的數(shù)據(jù)完整性檢測方法。例如,TCP/IP協(xié)議報文中含有整個報文的校驗和值、PNG圖片 中為每個數(shù)據(jù)塊都保存了校驗和值。應(yīng)用程序在處理具有校驗和的輸入時,通常會重新計 算一個校驗值,并與輸入中的校驗和相比較。進一步地,為表述方便,假設(shè)輸入數(shù)據(jù)由兩部分組成數(shù)據(jù)部分D和校驗和部分C。 常見的基于校驗和的輸入數(shù)據(jù)完整性檢測模式如下if (Checksum (D) ! =C)error ();程序在處理每個輸入時,通常會重新計算該輸入的校驗和Checksum ),這里 ChecksumO代表不同的校驗和算法。程序進一步比較Checksum )和輸入數(shù)據(jù)中的C,如 果二者不一致,意味著輸入數(shù)據(jù)已經(jīng)遭到了破壞,程序就不會再處理這個輸入(例如,生成 錯誤信息后退出)。校驗和給軟件動態(tài)漏洞挖掘方法帶來很多困難,特別是在文件格式和協(xié)議格式不 公開的情況下。對正常數(shù)據(jù)的隨機修改將導(dǎo)致整個數(shù)據(jù)的完整性遭到破壞,而目標(biāo)程序內(nèi) 部通過校驗和檢測就能發(fā)現(xiàn)輸入數(shù)據(jù)遭到破壞,這導(dǎo)致傳統(tǒng)動態(tài)漏洞挖掘技術(shù)生成的畸形 數(shù)據(jù)很難對目標(biāo)程序做到有效測試。特別地,當(dāng)校驗和算法未知,文件格式和協(xié)議格式不公 開的情況下,現(xiàn)有的大部分軟件動態(tài)漏洞挖掘技術(shù)都無法對目標(biāo)程序有效測試和分析。校驗和函數(shù)本質(zhì)上是單向哈希函數(shù),很難找到具有相同的校驗值的不同數(shù)據(jù)。例 如,對正常數(shù)據(jù)部分D修改后的數(shù)據(jù)部分為D’,針對D’重新計算的校驗和Checksum ’ ) 很難與原始數(shù)據(jù)中的校驗和C 一致。類似地,對原始數(shù)據(jù)中校驗和部分C的修改為C’, Checksum(D)也不可能與C’ 一致。
發(fā)明內(nèi)容
本發(fā)明的目的在于克服現(xiàn)有軟件動態(tài)漏洞挖掘技術(shù)的不足,提供一種軟件漏洞挖 掘方法,特別是當(dāng)輸入格式中含有校驗和信息時,本發(fā)明依然能對目標(biāo)程序有效測試。本發(fā)明所提出一種動態(tài)軟件漏洞挖掘方法,其步驟包括1.對目標(biāo)程序輸入多個正常數(shù)據(jù),收集程序處理每個正常數(shù)據(jù)的運行時信息;2.基于步驟1收集的運行時信息,修改正常數(shù)據(jù),生成畸形數(shù)據(jù);
3.對目標(biāo)程序輸入多個畸形數(shù)據(jù),收集程序處理每個畸形數(shù)據(jù)的運行時信息;4.基于步驟1、3收集的運行時信息,識別程序中進行校驗和檢測的代碼,具體地 說,定位程序中用于檢測校驗和的條件跳轉(zhuǎn)語句在輸入正常數(shù)據(jù)時,這些條件跳轉(zhuǎn)語句一 直發(fā)生跳轉(zhuǎn)/不發(fā)生跳轉(zhuǎn),在輸入畸形數(shù)據(jù)時,這些條件跳轉(zhuǎn)語句一直不發(fā)生跳轉(zhuǎn)/發(fā)生跳 轉(zhuǎn);5.基于步驟4的輸出,修改目標(biāo)程序;具體地說,更改步驟4中定位的條件跳轉(zhuǎn)指 令,使得即使輸入畸形數(shù)據(jù),目標(biāo)程序的執(zhí)行行為與輸入正常數(shù)據(jù)時一致;6.生成大量畸形數(shù)據(jù),對修改后的目標(biāo)程序進行測試;7.對于能夠使修改后的程序崩潰的畸形樣本,修改該樣本中的校驗和域,使原目 標(biāo)程序處理修改后的樣本數(shù)據(jù)時的執(zhí)行行為與處理正常數(shù)據(jù)時一致(即使修改后的樣本 數(shù)據(jù)能夠通過原始目標(biāo)程序的校驗和檢測),生成新的畸形樣本;8.將步驟7中生成的畸形樣本,重新輸入至原始目標(biāo)程序。如果程序處理該樣本 時仍然崩潰,收集程序執(zhí)行的調(diào)用棧以及執(zhí)行上下文信息(例如當(dāng)時寄存器信息),并報告 一個潛在的安全漏洞。進一步地,上述步驟1在處理每個正常輸入時包括1. a)基于系統(tǒng)調(diào)用劫持技術(shù)(HOOK),劫持文件打開(例如UNIX系統(tǒng)里open ()函 數(shù))、文件讀取(例如UNIX系統(tǒng)里read()函數(shù))、文件關(guān)閉(例如UNIX系統(tǒng)中close ()函 數(shù)),以及網(wǎng)絡(luò)數(shù)據(jù)操作函數(shù),監(jiān)控目標(biāo)程序?qū)φ?shù)據(jù)的讀入。根據(jù)操作系統(tǒng)不同以及對 輸入數(shù)據(jù)關(guān)注點不同,可以對需要劫持的函數(shù)范圍適當(dāng)修改,以達到最佳效果。1. b)當(dāng)目標(biāo)程序?qū)⒄?shù)據(jù)讀入內(nèi)存時,進一步地記錄相應(yīng)內(nèi)存地址與輸入數(shù)據(jù) 之間的依賴關(guān)系;特別地,以每個字節(jié)在正常輸入數(shù)據(jù)中的位置偏移標(biāo)示該字節(jié),詳細記錄 每個內(nèi)存單元來源于哪些字節(jié)。1. c)基于代碼植入技術(shù)(Code Instrumentation),在目標(biāo)程序的每條機器指令前 都植入監(jiān)控代碼,跟蹤輸入數(shù)據(jù)的每個字節(jié)在程序運行的傳播。特別的,根據(jù)不同指令的語 意信息,植入不同的監(jiān)控代碼,監(jiān)控每條指令的執(zhí)行。a)對于算術(shù)運算(例如add, sub, mul)和邏輯運算(例如and, or, xor)指令,目 的操作數(shù)依賴的輸入字節(jié)信息等于所有源操作數(shù)依賴的輸入字節(jié)的并集。b)對于數(shù)據(jù)傳送指令(例如mov,stos),目的操作數(shù)依賴的輸入字節(jié)信息等于源 操作數(shù)所依賴的輸入字節(jié)信息。c)對于能夠影響EFLAGS的指令(例如test,add,or),記錄EFLAGS依賴的輸入字 節(jié)信息等于所有操作數(shù)依賴的輸入字節(jié)的并集。特別地,記錄該指令中第一個操作數(shù)和第 二個操作數(shù)所依賴的輸入字節(jié)信息。d)對于條件跳轉(zhuǎn)指令(例 如JNZ,JBE, JL),檢查EFLAGS依賴多少輸入字節(jié)。如果 EFLAGS依賴的輸入字節(jié)個數(shù)超過一個預(yù)定義的數(shù)值(用戶指定),輸出該跳轉(zhuǎn)指令的地址、 跳轉(zhuǎn)是否發(fā)生、以及影響EFLAGS的指令的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字 節(jié)信息。例如,“0x8000 je 0x8010”代表地址0x8000處的je指令的目的地址是0x8010, 如果執(zhí)行該指令后發(fā)生跳轉(zhuǎn),而EFLAGS依賴的輸入字節(jié)個數(shù)超過了預(yù)定的數(shù)值,該步驟輸 出指令地址0x8000、該指令發(fā)生跳轉(zhuǎn)以及影響EFLAGS的指令的第一個操作數(shù)和第二個操 作數(shù)所依賴的輸入字節(jié)信息。
e)類似的,對于其他類型的指令(例如setnz),根據(jù)指令的語意植入相應(yīng)的監(jiān)控 代碼。步驟1輸出的程序運行時信息包括1)依賴的輸入字節(jié)數(shù)目超過預(yù)定值的條件跳 轉(zhuǎn)指令,2)這些跳轉(zhuǎn)指令是否發(fā)生跳轉(zhuǎn),3)影響這些指令中所用到的標(biāo)志寄存器EFLAGS的 指令的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息。進一步地,上述步驟2包括2. a)對步驟1中所使用的正常數(shù)據(jù),進行修改生成畸形樣本。特別地,按照步驟1 輸出的條件跳轉(zhuǎn)指令的先后順序,依次將這些條件跳轉(zhuǎn)指令所依賴的輸入字節(jié)替換成隨機 值,生成畸形樣本。進一步地,上述步驟3與步驟1類似,但是輸入步驟2中生成畸形數(shù)據(jù),收集目標(biāo) 程序處理畸形樣本時的運行時信息。進一步地,上述步驟4包括4. a)對于步驟1中輸出的程序運行時信息,統(tǒng)計兩個集合P0和Pl。其中,PO包 含步驟1中輸出的條件跳轉(zhuǎn)指令中沒有發(fā)生跳轉(zhuǎn)的指令;Pi包含步驟1中輸出的條件跳 轉(zhuǎn)指令中發(fā)生跳轉(zhuǎn)的指令。而且,PO U Pl中的每個條件跳轉(zhuǎn)指令中所使用的標(biāo)志寄存器 EFLAGS依賴的輸入字節(jié)數(shù)目均超過了預(yù)定義的數(shù)值。4. b)對于步驟3中輸出的程序運行時信息,統(tǒng)計計算兩個集合PO'和Pl'。其 中,PO'包含步驟3中輸出的條件跳轉(zhuǎn)指令中沒有發(fā)生跳轉(zhuǎn)的指令;Pl'包含步驟3中輸出 的條件跳轉(zhuǎn)指令中發(fā)生跳轉(zhuǎn)的指令。而且,PO' U Pl'中的每個條件跳轉(zhuǎn)指令中所使用的 標(biāo)志寄存器EFLAGS依賴的輸入字節(jié)數(shù)目均超過了預(yù)定義的數(shù)值。4. C)計算(Pl η PO' ) U (Ρ0 η Pl')。該集合中包含的條件跳轉(zhuǎn)指令在輸入 正常數(shù)據(jù)和畸形數(shù)據(jù)時表現(xiàn)完全不同輸入正常數(shù)據(jù)時,這些跳轉(zhuǎn)指令一直發(fā)生跳轉(zhuǎn)/不 跳轉(zhuǎn),但是輸入畸形數(shù)據(jù)時,這些跳轉(zhuǎn)指令一直不跳轉(zhuǎn)/發(fā)生跳轉(zhuǎn)。4. d)根據(jù)步驟1和步驟3中的輸出信息,對(Pl η PO' ) U (Ρ0 η Pl')中每一 個條件跳轉(zhuǎn)指令i,查找影響該條件跳轉(zhuǎn)指令i所使用的標(biāo)志寄存器EFLAGS的指令j,檢測 指令j的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息;如果第一個操作數(shù)依賴的 輸入字節(jié)個數(shù)超過第二個操作數(shù)所依賴的輸入字節(jié)個數(shù),將第二個操作數(shù)所依賴的輸入字 節(jié)作為輸入樣本中的校驗和域;如果第二個操作數(shù)依賴的輸入字節(jié)個數(shù)超過第一個操作數(shù) 所依賴的輸入字節(jié)個數(shù),將第一個操作數(shù)所依賴的輸入字節(jié)作為輸入樣本中的校驗和域;4. e)輸出(PI η PO' ) U (Ρ0 Π Pl')中的條件跳轉(zhuǎn)指令,將這些指令作為校驗 和檢測語句。進一步地,上述步驟5對目標(biāo)程序修改包括5. a)定位步驟4中輸出的條件跳轉(zhuǎn)指令在目標(biāo)程序的位置。5. b)如果輸入正常樣本時,條件跳轉(zhuǎn)指令一直發(fā)生跳轉(zhuǎn)。為表述方便,將條件跳轉(zhuǎn) 指令的跳轉(zhuǎn)地址記做Addr。將目標(biāo)程序中的條件跳轉(zhuǎn)指令修改為直接跳轉(zhuǎn)指令,其中,直接 跳轉(zhuǎn)指令的目的地址為Addr。5. c)如果輸入正常樣本時,條件跳轉(zhuǎn)指令一直不發(fā)生跳轉(zhuǎn),將目標(biāo)程序中的條件 跳轉(zhuǎn)指令修改為等長的nop指令。進一步地,上述步驟6對步驟5修改后的目標(biāo)程序測試包括
6. a)對正常數(shù)據(jù)修改,生成大量畸形樣本。修改規(guī)則包括但不限于[1],將正常數(shù)據(jù)的每一個字節(jié)逐一替換為隨機值;[2],將正常數(shù)據(jù)的每一個字節(jié)逐一替換為用戶定義的數(shù)值;[3],將正常數(shù)據(jù)的連續(xù)N個字節(jié)(N可以為2、4、8或由用戶指定)逐一替換為連 續(xù)N個字節(jié)的隨機值;[4],將正常數(shù)據(jù)的連續(xù)N個字節(jié)(N可以為2、4、8或由用戶指定)逐一替換為連 續(xù)N個字節(jié)的用戶定義的數(shù)值;[5],用戶自定義的其他修改策略。6. b)逐一將畸形數(shù)據(jù)輸入至步驟5修改后的目標(biāo)程序,如果修改后的目標(biāo)程序崩 潰,記錄所輸入的畸形數(shù)據(jù)。進一步地,上述步驟7對步驟6輸出的畸形數(shù)據(jù)修復(fù)包括7. a)將畸形數(shù)據(jù)輸入至原始的目標(biāo)程序;7.b)在調(diào)試模式下,在步驟4中輸出的(Pl Π PO' ) U (Ρ0 Π Pl')中的條件跳 轉(zhuǎn)指令設(shè)置斷點;7. c)斷點觸發(fā)后,如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),在輸入 當(dāng)前的畸形數(shù)據(jù)時也不跳轉(zhuǎn)/跳轉(zhuǎn),繼續(xù)執(zhí)行;7. d)否則,如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),但是在輸入當(dāng) 前的畸形數(shù)據(jù)時跳轉(zhuǎn)/不跳轉(zhuǎn),回溯查找影響該條件跳轉(zhuǎn)指令所使用的標(biāo)志寄存器EFLAGS 的指令i,進一步檢查指令i的操作數(shù)如果指令i的第一個操作數(shù)來源于畸形數(shù)據(jù)的校驗 和域,將畸形數(shù)據(jù)的校驗和域替換為指令i的第二個操作數(shù)的數(shù)值;如果指令i的第二個操 作數(shù)來源于畸形數(shù)據(jù)的校驗和域,將畸形數(shù)據(jù)的校驗和域替換為指令i的第一個操作數(shù)的 數(shù)值;7. e)輸出修復(fù)后的畸形數(shù)據(jù)。進一步地,上述步驟7對步驟6輸出的畸形數(shù)據(jù)修復(fù)的另外一種形式包括7. f)將畸形數(shù)據(jù)輸入至原始的目標(biāo)程序;7. g)將畸形數(shù)據(jù)中的校驗和域視為符號值,基于符號執(zhí)行技術(shù)運行目標(biāo)程序;7. h)在目標(biāo)程序執(zhí)行過程中,收集程序執(zhí)行路徑上的約束條件。7. i)當(dāng)目標(biāo)程序執(zhí)行到步驟4中輸出的(Pl η PO' ) U (Ρ0 η Pl')中的條件 跳轉(zhuǎn)指令時如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),在輸入當(dāng)前的畸形數(shù) 據(jù)時也不跳轉(zhuǎn)/跳轉(zhuǎn),收集路徑約束條件,繼續(xù)執(zhí)行;7. j)否則,如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),但是在輸入當(dāng) 前的畸形數(shù)據(jù)時跳轉(zhuǎn)/不跳轉(zhuǎn),在該條件跳轉(zhuǎn)指令處,添加使該條件跳轉(zhuǎn)指令不跳轉(zhuǎn)/跳轉(zhuǎn) 的路徑約束,即添加使該校驗和的檢測代碼處理正常數(shù)據(jù)時執(zhí)行行為的路徑約束;7. k)求解路徑約束條件。如 果路徑約束有解,將畸形數(shù)據(jù)中相應(yīng)的校驗和域替換 為求解結(jié)果;輸出修改后的畸形數(shù)據(jù)。如果路徑約束無解,輸出原始畸形數(shù)據(jù)。與現(xiàn)有技術(shù)相比,本發(fā)明的積極效果為采用本發(fā)明的方法,可以大大提高漏洞的檢測效率,特別是對輸入格式中含有校 驗和信息時,本發(fā)明依然能對目標(biāo)程序有效測試。
圖1是本發(fā)明總體流程圖。
具體實施例方式下面結(jié)合附圖1,更詳細的描述本發(fā)明的具體實施方式
。本實施實例以英特爾公司 二進制植入平臺PIN和微軟公司約束求解器Z3給出詳細的實施方式和操作過程,但本發(fā)明 的保護范圍不限于本實施例。步驟1.運行正常輸入數(shù)據(jù),收集目標(biāo)程序運行時敏感信息。1. a)劫持操作系統(tǒng)文件操作及網(wǎng)絡(luò)數(shù)據(jù)操作的系統(tǒng)調(diào)用?;赑IN平臺的API接 口 PIN_AddSyscallEntryFunction、PIN_AddSyscallExitFunction,劫持相應(yīng)的系統(tǒng)調(diào)用的 參數(shù)和返回值。通過對一些文件打開、讀入、關(guān)閉的系統(tǒng)調(diào)用的劫持,例如在windows平臺
胃 NtCreateFile^ NtOpenFile^ NtReadFile, ^ Linuxopen、read、close、
seek、Iseek等,就可以獲得傳入這些系統(tǒng)調(diào)用的參數(shù)及返回值。1. b)如果目標(biāo)程序?qū)⒄]斎霐?shù)據(jù)讀入了內(nèi)存,就記錄內(nèi)存單元和輸入數(shù)據(jù)的映 射關(guān)系。例如,Linux平臺上執(zhí)行read(fd,buf,100)的作用是從文件fd中讀取100字節(jié) 到以buf為起始地址的內(nèi)存中。假設(shè)fd是輸入文件,執(zhí)行該read系統(tǒng)調(diào)用后,我們根據(jù)當(dāng) 時fd的文件偏移及buf的數(shù)值,詳細記錄buf+0來源于第1輸入字節(jié),-buf+i來源于第 i+1個輸入字節(jié)…,buf+99來源于第100個輸入字節(jié)。l.c)在程序執(zhí)行過程中,跟蹤輸入數(shù)據(jù)的傳播;基于PIN提供的INSJnsertCall 等API接口,在每條指令執(zhí)行前,根據(jù)指令的語義信息,檢查該條指令對輸入數(shù)據(jù)傳播的影 響。 對于算術(shù)運算(例如add,sub, mul)和邏輯運算(例如and,or, xor)指令,目 的操作數(shù)依賴的輸入字節(jié)信息等于所有源操作數(shù)依賴的輸入字節(jié)的并集。例如在執(zhí)行下面add指令時,add eax, ebx ;//eax = eax+ebx ;假設(shè)eax依賴于第i個輸入字節(jié),ebx依賴于第j個輸入字節(jié),執(zhí)行該指令后,eax 依賴于第i,j兩個輸入字節(jié)。對于特殊運算指令,這類指令可以將目的操作數(shù)設(shè)置為常數(shù),需要特殊處理。例 如xor eax, eax ;該指令的作用是將eax清0。假設(shè)執(zhí)行該指令前eax依賴于第i個輸入 字節(jié),執(zhí)行該指令后eax不依賴任何輸入數(shù)據(jù)。類似的運算指令還sub eaxeax,mul eax,0 等。用戶可根據(jù)需要,植入不同的監(jiān)控代碼,以達到最佳效果 對于數(shù)據(jù)傳送指令(例如mov,stos),目的操作數(shù)依賴的輸入字節(jié)信息等于源 操作數(shù)所依賴的輸入字節(jié)信息。例如,執(zhí)行下面mov指令時,mov eax, ebx ;//eax = ebx該mov作用是將ebx賦值給eax。執(zhí)行該指令后,eax依賴于ebx所依賴的輸入數(shù) 據(jù)。 對于能夠影響EFLAGS的指令(例如cmp,test, add, or),記錄EFLAGS依賴的輸 入字節(jié)信息等于所有操作數(shù)依賴的輸入字節(jié)的并集。特別地,記錄EFLAGS分別依賴該指令中第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息。例如,執(zhí)行下面cmp指令時
cmp eax, ebx該cmp指令比較eax和ebx,并將根據(jù)比較結(jié)果設(shè)置標(biāo)志寄存器EFLAGS。執(zhí)行該 指令后,EFLAGS依賴的輸入字節(jié)信息等于eax和ebx所依賴的輸入字節(jié)信息的并集。并且, 同時記錄cmp第一個操作數(shù)eax和第二個操作數(shù)ebx所依賴的輸入字節(jié)信息。 對于條件跳轉(zhuǎn)指令(例如 JA,JNBE, JAE, JNBE, JB, JNAE, JBE, JNA, JE, JZ, JNE, JNZ, JG, JNLE, JGE, JNL,幾,JNGE, JLE, JNG, JC, JNC, JNO, JNP, JPO, JNS, JO, JP, JPE, JS 等),檢查EFLAGS依賴多少輸入字節(jié)。如果EFLAGS依賴的輸入字節(jié)個數(shù)超過一個預(yù)定義的 數(shù)值(用戶指定,例如32,64等),輸出該跳轉(zhuǎn)指令的地址、跳轉(zhuǎn)是否發(fā)生、以及影響EFLAGS 的指令的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息。例如,執(zhí)行下面兩條指令中的je指令時cmp eax, ebx0x8000 je 0x8010這里je是一個條件跳轉(zhuǎn)指令,該指令的地址是0x8000,跳轉(zhuǎn)的目的地址是 0x8010,如果執(zhí)行該指令后發(fā)生跳轉(zhuǎn),而EFLAGS依賴的輸入字節(jié)個數(shù)超過了預(yù)定的數(shù)值, 該輸出指令地址0x8000、該指令發(fā)生跳轉(zhuǎn)以及影響EFLAGS的指令(上面的cmp指令)的 第一個操作數(shù)(上面cmp指令的eax操作數(shù))和第二個操作數(shù)(上面cmp指令的ebx操作 數(shù))所依賴的輸入字節(jié)信息。 類似的,對于其他類型的指令(例如setnz),根據(jù)指令的語意植入相應(yīng)的監(jiān)控 代碼步驟2.根據(jù)步驟1)中收集的信息,針對性的修改正常數(shù)據(jù),生成畸形數(shù)據(jù)。例如, 假設(shè)步驟1中輸出0x8000處條件分支使用的EFLAGS寄存器依賴正常數(shù)據(jù)的第1至第100 字節(jié),則對第1至第100字節(jié)隨機修改,產(chǎn)生一批畸形數(shù)據(jù)。步驟3.將步驟2中產(chǎn)生的畸形樣本依次輸入至目標(biāo)程序。具體地,與步驟1類似, 收集程序處理每個畸形數(shù)據(jù)的運行時信息,包括哪些條件跳轉(zhuǎn)指令所使用的EFLAGS依賴 的輸入字節(jié)個數(shù)超過了指定數(shù)值(例如32、64等,由用戶定義),這些條件跳轉(zhuǎn)指令是否發(fā) 生跳轉(zhuǎn),以及影響EFLAGS的指令的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息。步驟4.定位目標(biāo)程序中的校驗和檢測代碼和正常樣本中的校驗和域,具體包括4. a)根據(jù)步驟1中收集的目標(biāo)程序運行正常數(shù)據(jù)時的信息,進一步統(tǒng)計兩個集 合P0和Pl。其中,PO包含步驟1中輸出的條件跳轉(zhuǎn)指令中沒有發(fā)生跳轉(zhuǎn)的指令;Pl包含 步驟1中輸出的條件跳轉(zhuǎn)指令中發(fā)生跳轉(zhuǎn)的指令。而且,PO U Pl中的每個條件跳轉(zhuǎn)指令 中所使用的標(biāo)志寄存器EFLAGS依賴的輸入字節(jié)數(shù)目均超過了預(yù)定義的數(shù)值。例如,假設(shè)步驟1中運行了 3個正常數(shù)據(jù),依次輸出{bl 跳轉(zhuǎn);b2 跳轉(zhuǎn),b3 不跳轉(zhuǎn),b4 跳轉(zhuǎn),b5 不跳轉(zhuǎn)},{bl 不跳轉(zhuǎn);b2 跳轉(zhuǎn),b3 不跳轉(zhuǎn),b4 不跳轉(zhuǎn),b5 不跳轉(zhuǎn)},{bl 不跳轉(zhuǎn);b2 跳轉(zhuǎn),b3 不跳轉(zhuǎn),b4 跳轉(zhuǎn),b5 不跳轉(zhuǎn)},那么,PO = {b3,b5},Pl = {b2},這里bl_b5代表五個不同的條件跳轉(zhuǎn)語句。4. b)對于步驟3中輸出的程序運行時信息,統(tǒng)計計算兩個集合PO'和Pl'。其中,PO'包含步驟3中輸出的條件跳轉(zhuǎn)指令中沒有發(fā)生跳轉(zhuǎn)的指令;Pl'包含步驟3中輸出 的條件跳轉(zhuǎn)指令中發(fā)生跳轉(zhuǎn)的指令。而且,PO' U Pl'中的每個條件跳轉(zhuǎn)指令中所使用的 標(biāo)志寄存器EFLAGS依賴的輸入字節(jié)數(shù)目均超過了預(yù)定義的數(shù)值。例如,假設(shè)步驟3中運行了三個步驟2中生成的畸形數(shù)據(jù),依次輸出{bl 跳轉(zhuǎn);b2 不跳轉(zhuǎn),b3 不跳轉(zhuǎn),b4 跳轉(zhuǎn),b5 不跳轉(zhuǎn)},{bl 跳轉(zhuǎn);b2 不跳轉(zhuǎn),b3 不跳轉(zhuǎn),b4 不跳轉(zhuǎn),b5 不跳轉(zhuǎn)},{bl 跳轉(zhuǎn);b2 不跳轉(zhuǎn),b3 跳轉(zhuǎn),b4 跳轉(zhuǎn),b5 不跳轉(zhuǎn)},那么,PO'= {b2,b5},Pl' = {bl}。
4. C)計算(PI η PO' ) υ (Ρ0 η PI')。該集合中包含的條件跳轉(zhuǎn)指令在輸入 正常數(shù)據(jù)和畸形數(shù)據(jù)時表現(xiàn)完全不同輸入正常數(shù)據(jù)時,這些跳轉(zhuǎn)指令一直發(fā)生跳轉(zhuǎn)/不 跳轉(zhuǎn),但是輸入畸形數(shù)據(jù)時,這些跳轉(zhuǎn)指令一直不跳轉(zhuǎn)/發(fā)生跳轉(zhuǎn)。在4. a)和4. c)中的例 子里,(pi η po' ) υ (ρο η pi' ) = {b2}4. d)根據(jù)步驟1和步驟3中的輸出信息,對(Pl η PO' ) U (ΡΟ η Pl')中每一 個條件跳轉(zhuǎn)指令i,查找影響該條件跳轉(zhuǎn)指令i所使用的標(biāo)志寄存器EFLAGS的指令j,檢測 指令j的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息;如果第一個操作數(shù)依賴的 輸入字節(jié)個數(shù)超過第二個操作數(shù)所依賴的輸入字節(jié)個數(shù),將第二個操作數(shù)所依賴的輸入字 節(jié)作為輸入樣本中的校驗和域;如果第二個操作數(shù)依賴的輸入字節(jié)個數(shù)超過第一個操作數(shù) 所依賴的輸入字節(jié)個數(shù),將第一個操作數(shù)所依賴的輸入字節(jié)作為輸入樣本中的校驗和域;例如,假設(shè)影響條件跳轉(zhuǎn)指令b2所使用的標(biāo)志寄存器EFLAGS的指令是指令“cmp eaX,ebX”,并且在該cmp指令中,第一個操作數(shù)eax依賴于{1,2,3,···100}字節(jié),第二個操 作數(shù)ebx依賴于{101,102,103,104}字節(jié)。那么,將輸入數(shù)據(jù)中的第101至第104四個字 節(jié)作為校驗和域。4. e)輸出(Pl Π PO' ) U (ΡΟ ΠΡ1')中的條件跳轉(zhuǎn)指令,將這些指令作為校驗 和檢測語句。步驟5.對目標(biāo)程序修改5. a)定位步驟4中輸出的條件跳轉(zhuǎn)指令在目標(biāo)程序的二進制文件中的位置。5.b)如果輸入正常樣本時,條件跳轉(zhuǎn)指令一直發(fā)生跳轉(zhuǎn),相應(yīng)的跳轉(zhuǎn)地址為 Addr,那么將目標(biāo)程序中的條件跳轉(zhuǎn)指令修改為直接跳轉(zhuǎn)指令,其中,直接跳轉(zhuǎn)指令的目的 地址為Addr。例如,如果待修改的條件跳轉(zhuǎn)指令是je 0x8000,則修改為jmp 0x8000 ;5. c)如果輸入正常樣本時,條件跳轉(zhuǎn)指令一直不發(fā)生跳轉(zhuǎn),將目標(biāo)程序中的條件 跳轉(zhuǎn)指令修改為等長的nop指令。例如,如果待修改的跳轉(zhuǎn)指令是je 0x8000,根據(jù)該指令的長度,用等長的nop指
令替換。步驟6對步驟5修改后目標(biāo)程序測試包括6. a)對正常數(shù)據(jù)修改,生成大量畸形樣本。具體地,將正常數(shù)據(jù)的連續(xù)4個字節(jié)逐 一替換為連續(xù)4個字節(jié)的隨機值和整型邊界值,如0x800000001,0x7fffffff,0x00008000, 0x40000001,0x10000001 ;6. b)依次將畸形數(shù)據(jù)輸入至步驟5修改后的目標(biāo)程序,如果修改后的目標(biāo)程序崩潰,記錄所輸入的畸形數(shù)據(jù)步驟7對步驟6輸出的畸形數(shù)據(jù)修復(fù)包括7. a)將畸形數(shù)據(jù)輸入至原始的目標(biāo)程序;7.b)在調(diào)試模式下,在步驟4中輸出的(PI η PO' ) υ (Ρ0 η PI')中的條件跳轉(zhuǎn)指令設(shè)置斷點;假設(shè)(Pi η PO' ) υ (Ρ0 η PI' ) = {bi,b2,b3},則在三個條件跳轉(zhuǎn)指 令上都設(shè)置斷點;7. c)斷點觸發(fā)后,檢查步驟1的輸出。如果斷點處的條件跳轉(zhuǎn)指令,在輸入正常樣 本時不跳轉(zhuǎn)/跳轉(zhuǎn),在輸入當(dāng)前的畸形數(shù)據(jù)時也不跳轉(zhuǎn)/跳轉(zhuǎn),繼續(xù)執(zhí)行;例如,如果當(dāng)輸入正常樣本是,bl指令一直跳轉(zhuǎn),而當(dāng)運行當(dāng)前的畸形數(shù)據(jù)時,bl 也跳轉(zhuǎn),那么就取消該斷點,讓程序繼續(xù)執(zhí)行。7. d)否則,如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),但是在輸入當(dāng) 前的畸形數(shù)據(jù)時跳轉(zhuǎn)/不跳轉(zhuǎn),回溯查找影響該條件跳轉(zhuǎn)指令所使用的標(biāo)志寄存器EFLAGS 的指令i,進一步檢查指令i的操作數(shù)如果指令i的第一個操作數(shù)來源于畸形數(shù)據(jù)的校驗 和域,將畸形數(shù)據(jù)的校驗和域替換為指令i的第二個操作數(shù)的數(shù)值;如果指令i的第二個操 作數(shù)來源于畸形數(shù)據(jù)的校驗和域,將畸形數(shù)據(jù)的校驗和域替換為指令i的第一個操作數(shù)的 數(shù)值;例如,假設(shè)b2條件跳轉(zhuǎn)指令在輸入正常數(shù)據(jù)和畸形數(shù)據(jù)時的行為不一致,則回 溯查找影響b2所使用的標(biāo)志寄存器EFLAGS的指令。假設(shè)是“cmp eax,ebx”指令設(shè)置了 EFLAGS,則查看eax和ebx的取值。進一步地,根據(jù)步驟4. d),判斷eax和ebx中哪個寄存 器來源于校驗和域。如果eax來源于校驗和域,則把ebx的取值填充回畸形數(shù)據(jù)中的校驗 和域;如果ebx來源于校驗和域,則把eax的取值填充回畸形數(shù)據(jù)中的校驗和域。7. e)輸出修復(fù)后的畸形數(shù)據(jù)。上述步驟7對步驟6輸出的畸形數(shù)據(jù)修復(fù)的另外一種形式包括7. f)將畸形數(shù)據(jù)輸入至原始的目標(biāo)程序;7. g)將畸形數(shù)據(jù)中的校驗和域視為符號值,基于符號執(zhí)行技術(shù)運行目標(biāo)程序;[1],劫持系統(tǒng)調(diào)用,監(jiān)控目標(biāo)程序的文件操作和網(wǎng)絡(luò)數(shù)據(jù)操作。[2],當(dāng)畸形數(shù)據(jù)的校驗和域讀入內(nèi)存時,記錄內(nèi)存單元和輸入字節(jié)的映射。根據(jù) 微軟Z3求解器的API,為校驗和域中每個字節(jié)創(chuàng)建一個符號值。具體地說,通過Z3_mk_bv_ sortO創(chuàng)建長度為8的比特矢量類型后,進一步調(diào)用Z3_mk_C0nst()創(chuàng)建一個符號變量。[3],維護內(nèi)存地址和符號變量之間的映射關(guān)系。例如在Linux平臺上,read(fd, buf,4)是從文件fd中讀取4個字節(jié)值內(nèi)存buf中。假設(shè)讀入的4個字節(jié)恰好是校驗和域, 則依次創(chuàng)建4個符號變量,分別為si,s2,s3,s4,并創(chuàng)建映射表,記錄buf保存sl,buf+l保 存 s2, buf+2 保存 s3, buf+3 保存 s4。[4].基于PIN提供的INSjnsertCal 1等API接口,在每條指令執(zhí)行前,根據(jù)指令的語義信息,模擬每條指令的運行。如果指令的每個操作數(shù)都是真實值,則正常執(zhí)行該指 令;如果該指令中存在時符號值的操作數(shù)時,根據(jù)指令語意模擬該指令執(zhí)行。 例如,mov eax,
,該指令將內(nèi)存0x8000出數(shù)據(jù)賦值給eax。如果內(nèi)存 地址0x8000處保存了符號值,則記錄eax保存同一個符號值。如果內(nèi)存地址0x8000處是 真實值,則更新eax,使eax等于該真實值。
例如,add eax, ebx,該指令將eax與ebx求和賦值給eax。如果eax保存的是 符號值sl+s2,ebx保存的是符號值s3,模擬該指令執(zhí)行,令eax保存sl+s2+s3。
對于能夠影響EFLAGS的指令(包括算術(shù)指令、邏輯運算指令等),如果指令中 所有的操作數(shù)都是真實值,正常執(zhí)行該指令。如果指令操作數(shù)中含有符號變量,則記錄影響 EFLAGS的符號表達式。例如,對于cmp eax, ebx指令,如果eax保存符號值sl,ebx保存真實值100,執(zhí)行 該指令后,記錄EFLAGS受符號表達式s 1-100影響。7. h)在目標(biāo)程序執(zhí)行過程中,收集程序執(zhí)行路徑上的約束條件。 對于條件跳轉(zhuǎn)指令,檢查當(dāng)時EFLAGS是否受符號表達式控制。如果當(dāng)時EFLAGS 不受符號表達式影響,直接執(zhí)行該條件跳轉(zhuǎn)指令,不收集約束。 如果當(dāng)時EFLAGS受符號表達式影響,根據(jù)EFLAGS依賴的符號表達,收集路徑約 束信息。例如,執(zhí)行jz 0x8000時,假設(shè)EFLAGS受符號表達式sl-1000影響,當(dāng)該指令發(fā) 生跳轉(zhuǎn)時,記錄路徑約束條件“sl-100 = 0”;如果該指令沒有發(fā)生跳轉(zhuǎn),記錄路徑約束條件
"sl-100 ! = 0”通過 Z3 中 Z3_mk_bvugt, Z3_mk_bvult, Z3_mk_bvslt, Z3_mk_bvule, Z3_mk_bvsle, Z3_mk_bvuge, Z3_mk_bvsge,Z3_mk_bvsgt等API即可描述有符號比較或無符號比較的大
于、等于、小于等約束信息。7. i)當(dāng)目標(biāo)程序執(zhí)行到步驟4中輸出的(Pl Π PO' ) U (Ρ0 Π Pl')中的條件 跳轉(zhuǎn)指令時 如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),在輸入當(dāng)前的畸形數(shù)據(jù) 時也不跳轉(zhuǎn)/跳轉(zhuǎn),收集路徑約束條件,繼續(xù)執(zhí)行; 如果該條件跳轉(zhuǎn)指令在輸入正常樣本時不跳轉(zhuǎn)/跳轉(zhuǎn),但是在輸入當(dāng)前的畸形 數(shù)據(jù)時跳轉(zhuǎn)/不跳轉(zhuǎn),在該條件跳轉(zhuǎn)指令處,添加使該條件跳轉(zhuǎn)指令不跳轉(zhuǎn)/跳轉(zhuǎn)的路徑約 束,執(zhí)行步驟7. j)7. j)求解路徑約束條件。將收集到的路徑約束通過調(diào)用Z3_aSSert_CnStr聲明為 謂詞,進一步調(diào)用Z3_check_and_get_m0del求解這些約束。如果路徑約束有解,將畸形數(shù) 據(jù)中相應(yīng)的校驗和域替換為求解結(jié)果;輸出修改后的畸形數(shù)據(jù)。如果路徑約束無解,輸出原 始畸形數(shù)據(jù)。步驟8.將步驟7中輸出的畸形數(shù)據(jù),輸入至原始的目標(biāo)程序,如果程序崩潰或發(fā) 生異常,收集崩潰時或異常時的堆棧信息,與輸入的畸形數(shù)據(jù)一起報告給測試人員。最后應(yīng)說明的是以上實施例僅用以說明而非限制本發(fā)明的技術(shù)方案,盡管參照 上述實施例對本發(fā)明進行了詳細說明,本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解依然可以對本發(fā)明進 行修改或者等同替換,而不脫離本發(fā)明的精神和范圍的任何修改或局部替換,其均應(yīng)涵蓋 在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
一種軟件漏洞挖掘方法,其步驟為1)將多個正常數(shù)據(jù)分別輸入目標(biāo)程序,收集該目標(biāo)程序處理每個正常數(shù)據(jù)的運行時信息;2)根據(jù)步驟1)所得的運行時信息,修改正常數(shù)據(jù),生成畸形數(shù)據(jù);3)將生成的多個畸形數(shù)據(jù)分別輸入該目標(biāo)程序,收集該目標(biāo)程序處理每個畸形數(shù)據(jù)的運行時信息;4)根據(jù)步驟1)、3)收集的運行時信息,識別該目標(biāo)程序中校驗和的檢測代碼;5)修改識別出的校驗和的檢測代碼,使得修改后的目標(biāo)程序處理畸形數(shù)據(jù)時的執(zhí)行行為與處理正常數(shù)據(jù)時一致;6)生成若干畸形數(shù)據(jù)并輸入步驟5)所修改后的目標(biāo)程序;7)將使修改后的目標(biāo)程序崩潰的畸形數(shù)據(jù)作為樣本數(shù)據(jù),修改每個樣本數(shù)據(jù)中校驗和的域值,使修改后的樣本數(shù)據(jù)能夠通過原始目標(biāo)程序的校驗和檢測;8)將步驟7)修改后的樣本數(shù)據(jù)輸入原目標(biāo)程序,如果原目標(biāo)程序崩潰或發(fā)生異常則收集原目標(biāo)程序執(zhí)行的調(diào)用棧以及執(zhí)行上下文信息,并報告一個潛在的安全漏洞;其中,所述運行時信息包括條件跳轉(zhuǎn)指令、條件跳轉(zhuǎn)指令是否發(fā)生跳轉(zhuǎn)、影響條件跳轉(zhuǎn)指令中所用到的標(biāo)志寄存器指令的第一個操作數(shù)所依賴的輸入字節(jié)信息和第二個操作數(shù)所依賴的輸入字節(jié)信息。
2.如權(quán)利要求1所述的方法,其特征在于所述條件跳轉(zhuǎn)指令為依賴的輸入字節(jié)數(shù)目超 過預(yù)定值的條件跳轉(zhuǎn)指令;利用該目標(biāo)程序中的條件跳轉(zhuǎn)指令識別該目標(biāo)程序中校驗和的 檢測代碼。
3.如權(quán)利要求1或2所述的方法,其特征在于所述運行時信息的收集方法為1)利用系統(tǒng)調(diào)用劫持方法監(jiān)控目標(biāo)程序?qū)φ?shù)據(jù)的讀入;2)當(dāng)目標(biāo)程序?qū)⒄?shù)據(jù)讀入內(nèi)存時,記錄相應(yīng)內(nèi)存地址與輸入數(shù)據(jù)之間的依賴關(guān)系;3)利用代碼植入方法,在目標(biāo)程序的每條機器指令前植入相應(yīng)的監(jiān)控代碼,監(jiān)控每條 指令的執(zhí)行,收集所述運行時信息。
4.如權(quán)利要求3所述的方法,其特征在于記錄相應(yīng)內(nèi)存地址與輸入數(shù)據(jù)之間的依賴關(guān) 系的方法為當(dāng)目標(biāo)程序?qū)⒄?shù)據(jù)讀入內(nèi)存時,以每個字節(jié)在正常輸入數(shù)據(jù)中的位置偏 移標(biāo)示該字節(jié),并記錄每個內(nèi)存單元來源于哪些字節(jié)。
5.如權(quán)利要求1或2所述的方法,其特征在于識別所述目標(biāo)程序中校驗和的檢測代碼 的方法為a)將步驟1)中輸出的運行時信息統(tǒng)計為兩個集合P0和Pl;其中,PO包含步驟1)中 輸出的條件跳轉(zhuǎn)指令中沒有發(fā)生跳轉(zhuǎn)的指令;Pl包含步驟1)中輸出的條件跳轉(zhuǎn)指令中發(fā) 生跳轉(zhuǎn)的指令;b)將步驟3)中輸出的運行時信息統(tǒng)計為兩個集合PO'和Pl';其中,PO'包含步驟 3)中輸出的條件跳轉(zhuǎn)指令中沒有發(fā)生跳轉(zhuǎn)的指令;Pl'包含步驟3)中輸出的條件跳轉(zhuǎn)指令中發(fā)生跳轉(zhuǎn)的指令;C)輸出(PI η PO' ) U (Ρ0 η PI')中的條件跳轉(zhuǎn)指令,將其作為校驗和的檢測代碼。
6.如權(quán)利要求5所述的方法,其特征在于所述修改識別出的校驗和的檢測代碼的方法為a)定位識別出的校驗和的檢測代碼在所述目標(biāo)程序中的位置;b)如果輸入正常樣本時,校驗和的檢測代碼一直發(fā)生跳轉(zhuǎn),則將目標(biāo)程序中的條件跳 轉(zhuǎn)指令修改為直接跳轉(zhuǎn)指令,該直接跳轉(zhuǎn)指令的目的地址指向該條件跳轉(zhuǎn)指令的跳轉(zhuǎn)地 址;c)如果輸入正常樣本時,條件跳轉(zhuǎn)指令一直不發(fā)生跳轉(zhuǎn),將目標(biāo)程序中的條件跳轉(zhuǎn)指 令修改為等長的nop指令。
7.如權(quán)利要求1所述的方法,其特征在于所述步驟4)中,同時識別正常數(shù)據(jù)中的校驗 和域;其方法為對于每一校驗和的檢測代碼,查找影響當(dāng)前校驗和的檢測代碼所使用的 標(biāo)志寄存器指令j,檢測指令j的第一個操作數(shù)和第二個操作數(shù)所依賴的輸入字節(jié)信息;如 果第一個操作數(shù)依賴的輸入字節(jié)個數(shù)超過第二個操作數(shù)所依賴的輸入字節(jié)個數(shù),則將第二 個操作數(shù)所依賴的輸入字節(jié)作為輸入樣本中的校驗和域;如果第二個操作數(shù)依賴的輸入字 節(jié)個數(shù)超過第一個操作數(shù)所依賴的輸入字節(jié)個數(shù),則將第一個操作數(shù)所依賴的輸入字節(jié)作 為輸入樣本中的校驗和域。
8.如權(quán)利要求1或2或7所述的方法,其特征在于修改每個樣本數(shù)據(jù)中校驗和的域值 的方法為a)將樣本數(shù)據(jù)輸入至原目標(biāo)程序;b)在調(diào)試模式下,在所述校驗和的檢測代碼處設(shè)置斷點;c)斷點觸發(fā)后,如果校驗和的檢測代碼在輸入正常數(shù)據(jù)時的執(zhí)行行為與在輸入當(dāng)前樣 本數(shù)據(jù)時執(zhí)行一致,則繼續(xù)執(zhí)行;否則,回溯查找影響該校驗和的檢測代碼所使用的標(biāo)志寄 存器的指令i,然后檢查指令i的操作數(shù)如果指令i的第一個操作數(shù)來源于樣本數(shù)據(jù)的校 驗和域,將樣本數(shù)據(jù)的校驗和域替換為指令i的第二個操作數(shù)的數(shù)值;如果指令i的第二個 操作數(shù)來源于樣本數(shù)據(jù)的校驗和域,將樣本數(shù)據(jù)的校驗和域替換為指令i的第一個操作數(shù) 的數(shù)值。
9.如權(quán)利要求1或2所述的方法,其特征在于修改每個樣本數(shù)據(jù)中校驗和的域值的方 法為a)將樣本數(shù)據(jù)輸入至原目標(biāo)程序;b)將樣本數(shù)據(jù)中的校驗和域視為符號值,采用符號執(zhí)行方法運行原目標(biāo)程序;c)在原目標(biāo)程序執(zhí)行過程中,收集原目標(biāo)程序執(zhí)行路徑上的約束條件;d)當(dāng)原目標(biāo)程序執(zhí)行到校驗和的檢測代碼時如果該校驗和的檢測代碼在輸入正常 數(shù)據(jù)時的執(zhí)行行為與在輸入當(dāng)前樣本數(shù)據(jù)時執(zhí)行一致,則收集路徑約束條件,繼續(xù)執(zhí)行;否 貝U,在該校驗和的檢測代碼處,添加使該校驗和的檢測代碼處理正常數(shù)據(jù)時執(zhí)行行為的路 徑約束;e)求解路徑約束條件,如果路徑約束有解,則將樣本數(shù)據(jù)中相應(yīng)的校驗和域替換為求 解結(jié)果;如果路徑約束無解,則輸出原始樣本數(shù)據(jù)。
10.如權(quán)利要求1或2所述的方法,其特征在于所述畸形數(shù)據(jù)的生成方法包括將正常 數(shù)據(jù)的每一個字節(jié)逐一替換為隨機值、或?qū)⒄?shù)據(jù)的每一個字節(jié)逐一替換為用戶定義的 數(shù)值、或?qū)⒄?shù)據(jù)的連續(xù)N個字節(jié)逐一替換為連續(xù)N個字節(jié)的隨機值、或?qū)⒄?shù)據(jù)的連續(xù)N個字節(jié)逐一替換為連續(xù)N個字節(jié)的用戶定義的數(shù)值,N為自然數(shù).
全文摘要
本發(fā)明公開了一種軟件漏洞挖掘方法,屬于軟件工程和信息安全領(lǐng)域。本方法為1)將多個正常數(shù)據(jù)輸入目標(biāo)程序,收集該目標(biāo)程序的運行時信息;2)生成畸形數(shù)據(jù),并將其輸入該目標(biāo)程序,收集該目標(biāo)程序的運行時信息;3)根據(jù)1)、2)收集的運行時信息,識別該目標(biāo)程序中校驗和的檢測代碼;4)修改校驗和的檢測代碼,使得目標(biāo)程序處理畸形數(shù)據(jù)時的執(zhí)行行為與處理正常數(shù)據(jù)時一致;5)生成若干畸形數(shù)據(jù)并輸入修改后的目標(biāo)程序,將使其崩潰的畸形數(shù)據(jù)作為樣本數(shù)據(jù);6)修改每個樣本數(shù)據(jù)中校驗和的域值并將其輸入原目標(biāo)程序,如果原目標(biāo)程序崩潰或發(fā)生異常則報告一個潛在的安全漏洞。與現(xiàn)有技術(shù)相比,本發(fā)明可以大大提高漏洞挖掘的效率。
文檔編號G06F11/36GK101847121SQ201010171979
公開日2010年9月29日 申請日期2010年5月7日 優(yōu)先權(quán)日2010年5月7日
發(fā)明者丁羽, 張超, 戴帥夫, 李義春, 王鐵磊, 鄒維, 韋韜 申請人:北京大學(xué)