專利名稱:計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及的是一種計(jì)算機(jī)技術(shù)領(lǐng)域的檢測(cè)系統(tǒng),具體是一種計(jì)算機(jī)程序?qū)嶋H運(yùn) 行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng)。
背景技術(shù):
程序分析技術(shù)是指針對(duì)計(jì)算機(jī)程序推導(dǎo)出其結(jié)構(gòu)和數(shù)據(jù)流程的分析技術(shù)。在軟件 維護(hù)檢測(cè)和軟件理解的過程中,我們需要對(duì)目標(biāo)程序的結(jié)構(gòu)和數(shù)據(jù)流程進(jìn)行分析,程序分 析系統(tǒng)的輸出一般為數(shù)據(jù)流圖和控制流圖。數(shù)據(jù)流圖以圖表的方法表達(dá)程序系統(tǒng)中信息的 變換和傳遞過程,特別是數(shù)據(jù)被引用和被定義的情況;控制流圖經(jīng)常使用圖或抽象語法樹 的形式刻畫程序結(jié)構(gòu)。動(dòng)態(tài)程序分析技術(shù)是對(duì)實(shí)際執(zhí)行中的程序進(jìn)行分析的技術(shù),即在程序執(zhí)行的情況 下,通過對(duì)程序的運(yùn)行環(huán)境(環(huán)境變量、內(nèi)存、堆棧等)進(jìn)行分析,來檢測(cè)程序是否存在漏洞 的技術(shù)。動(dòng)態(tài)程序分析技術(shù)能檢測(cè)到那些在程序?qū)嶋H運(yùn)行時(shí)才會(huì)觸發(fā)的漏洞,不需要修改 目標(biāo)程序源代碼或其二進(jìn)制代碼,在一定程度上提高了程序的保密性。與之相對(duì)的是靜態(tài) 程序分析技術(shù),指在不執(zhí)行程序的情況下獲得程序編譯時(shí)的信息,并根據(jù)這些信息對(duì)特定 的漏洞模式進(jìn)行檢測(cè)的技術(shù),簡(jiǎn)稱為靜態(tài)分析。大多數(shù)情況下,靜態(tài)分析的輸入都是程序的 源代碼,只有少數(shù)情況會(huì)使用其二進(jìn)制代碼?,F(xiàn)階段,靜態(tài)分析技術(shù)越來越多地被應(yīng)用到程 序優(yōu)化、軟件錯(cuò)誤檢測(cè)等領(lǐng)域。但是,無論動(dòng)態(tài)程序分析還是靜態(tài)程序分析,都有其無法克服的缺點(diǎn)。對(duì)于動(dòng)態(tài)程 序分析技術(shù)而言,因?yàn)槌绦蛟诿恳淮蝿?dòng)態(tài)執(zhí)行的過程中只能沿一條路徑執(zhí)行下去,所以為 了能達(dá)到滿意的路徑覆蓋率,我們必須重復(fù)執(zhí)行動(dòng)態(tài)分析足夠多的次數(shù),但即使這樣路徑 覆蓋率也難以達(dá)到百分之百。對(duì)于靜態(tài)程序分析技術(shù)而言,雖然能夠達(dá)到百分之百的程序 路徑覆蓋率,但是它并不能檢測(cè)到那些在程序?qū)嶋H運(yùn)行時(shí)才會(huì)觸發(fā)的漏洞,并且一般漏洞 的誤報(bào)率較高,同時(shí),直接對(duì)整個(gè)大型程序進(jìn)行靜態(tài)分析會(huì)導(dǎo)致很大的時(shí)間和系統(tǒng)資源開 銷。更重要的一點(diǎn)是,現(xiàn)有的相關(guān)系統(tǒng)往往需要程序源代碼才能進(jìn)行程序分析和漏洞檢測(cè), 并不能直接分析目標(biāo)程序的二進(jìn)制代碼,這個(gè)缺點(diǎn)也限制了這些系統(tǒng)的用途。
發(fā)明內(nèi)容
本發(fā)明針對(duì)現(xiàn)有技術(shù)中的系統(tǒng)上存在的上述不足,提出了一種計(jì)算機(jī)程序?qū)嶋H運(yùn) 行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng)。本發(fā)明通過結(jié)合動(dòng)態(tài)程序分析和靜態(tài)分析路徑補(bǔ)全這兩種 技術(shù),既能檢測(cè)到那些在程序?qū)嶋H運(yùn)行時(shí)才會(huì)觸發(fā)的漏洞,又能達(dá)到較高的程序路徑覆蓋 率,對(duì)動(dòng)態(tài)分析過程中沒有覆蓋到的路徑進(jìn)行漏洞檢測(cè),提高了漏洞檢測(cè)的成功率,降低了 漏洞誤報(bào)率。同時(shí),靜態(tài)分析路徑補(bǔ)全技術(shù)只分析動(dòng)態(tài)分析未執(zhí)行到的路徑,而并非全部的 程序路徑,這樣大大降低了時(shí)間和系統(tǒng)資源的開銷。本發(fā)明是通過以下技術(shù)方案實(shí)現(xiàn)的本發(fā)明包括二進(jìn)制代碼動(dòng)態(tài)插入模塊、程序基本塊識(shí)別模塊、函數(shù)調(diào)用圖構(gòu)建模塊、控制流圖構(gòu)建模塊、函數(shù)識(shí)別模塊、靜態(tài)分析模塊;二進(jìn)制代碼動(dòng)態(tài)插入模塊將用戶自 定義的分析代碼插入程序的任意位置,并跟蹤程序調(diào)用的系統(tǒng)API,最后將分析結(jié)果通過 自定義程序分析文件提供的回調(diào)函數(shù)返回并傳遞給程序基本塊識(shí)別模塊;程序基本塊識(shí)別 模塊根據(jù)二進(jìn)制代碼動(dòng)態(tài)插入模塊傳遞的分析結(jié)果將目標(biāo)程序按基本塊規(guī)則劃分,并將劃 分的基本塊集合傳遞給函數(shù)調(diào)用圖構(gòu)建模塊和控制流圖構(gòu)建模塊;函數(shù)調(diào)用圖構(gòu)建模塊對(duì) 基本塊識(shí)別模塊傳遞過來的基本塊集合進(jìn)行處理,得到基本的函數(shù)塊集合,并將此函數(shù)塊 集合傳遞給函數(shù)識(shí)別模塊,根據(jù)返回的函數(shù)行為特征得到函數(shù)之間的相互調(diào)用關(guān)系,以此 構(gòu)建函數(shù)調(diào)用圖,并將函數(shù)調(diào)用信息傳遞給控制流圖構(gòu)建模塊;控制流圖構(gòu)建模塊根據(jù)程 序基本塊識(shí)別模塊傳遞來的基本塊集合構(gòu)建控制流節(jié)點(diǎn)集合并維護(hù)它們的相互關(guān)系,并將 構(gòu)建的節(jié)點(diǎn)集合和程序執(zhí)行時(shí)獲得的動(dòng)態(tài)信息傳遞給靜態(tài)分析模塊,根據(jù)返回的包含未執(zhí) 行路徑的完整執(zhí)行信息構(gòu)建完整的程序控制流信息和程序控制流圖,并將此信息作為系統(tǒng) 輸出傳遞給用戶;函數(shù)識(shí)別模塊提取函數(shù)調(diào)用圖構(gòu)建模塊傳遞過來的基本函數(shù)塊的調(diào)用地 址,根據(jù)此信息查找API數(shù)據(jù)庫獲得函數(shù)的索引值和行為特征,并將找到的函數(shù)索引值和 行為特征作為輸出返回給函數(shù)調(diào)用圖構(gòu)建模塊;靜態(tài)分析模塊接受控制流圖構(gòu)建模塊傳遞 來的節(jié)點(diǎn)集合和記錄的動(dòng)態(tài)執(zhí)行路徑信息,補(bǔ)全未執(zhí)行到的路徑信息,生成完整的程序執(zhí) 行路徑信息,并將這些信息作為輸出返回給控制流圖構(gòu)建模塊。所述的二進(jìn)制代碼動(dòng)態(tài)插入模塊包括自定義程序分析文件、動(dòng)態(tài)代碼插入工具 DynamoRIO ;自定義程序分析文件完成了對(duì)DynamoRIO提供的回調(diào)函數(shù)的實(shí)現(xiàn),用戶能在此 文件中定義所需的動(dòng)態(tài)分析關(guān)注點(diǎn)和分析規(guī)則;動(dòng)態(tài)代碼插入工具DynamoRIO能在程序運(yùn) 行時(shí),根據(jù)自定義程序分析文件中規(guī)定的分析要求和規(guī)則,在程序的任意位置插入任意二 進(jìn)制代碼并跟蹤API信息,最后將分析結(jié)果通過所述的回調(diào)函數(shù)傳遞給程序基本塊識(shí)別模 塊。所述的程序基本塊識(shí)別模塊包括程序單個(gè)指令定義和識(shí)別模塊、程序基本塊定 義和識(shí)別模塊;程序單個(gè)指令定義和識(shí)別模塊包含了單個(gè)指令的定義和識(shí)別規(guī)則,此模塊 根據(jù)由二進(jìn)制代碼動(dòng)態(tài)插入模塊傳遞過來的程序動(dòng)態(tài)分析信息識(shí)別出程序的單個(gè)指令,并 將這些單個(gè)指令的識(shí)別結(jié)果傳遞給程序基本塊定義和識(shí)別模塊;程序基本塊的定義和識(shí)別 模塊包含了基本塊的定義和識(shí)別規(guī)則,此模塊根據(jù)程序單個(gè)指令定義和識(shí)別模塊傳遞過來 的單個(gè)指令的識(shí)別結(jié)果識(shí)別出程序的基本塊,并將這些基本塊的識(shí)別結(jié)果傳遞給函數(shù)調(diào)用 圖構(gòu)建模塊和控制流圖構(gòu)建模塊。所述的程序基本塊為程序某段指令的鏈?zhǔn)郊?,而程序的?shí)際分析過程將采用基 本塊執(zhí)行過程。所述的函數(shù)調(diào)用圖構(gòu)建模塊包括函數(shù)節(jié)點(diǎn)識(shí)別模塊、函數(shù)調(diào)用關(guān)系構(gòu)建模塊、函 數(shù)調(diào)用圖生成模塊;函數(shù)節(jié)點(diǎn)識(shí)別模塊根據(jù)由程序基本塊識(shí)別模塊傳遞過來的程序基本塊 集合,識(shí)別出帶返回指令的基本塊并將其作為函數(shù)節(jié)點(diǎn)對(duì)程序基本塊集合進(jìn)行劃分,以比 識(shí)別出每個(gè)函數(shù)塊,并將這些函數(shù)塊識(shí)別結(jié)果傳遞給函數(shù)識(shí)別模塊,并將返回的函數(shù)識(shí)別 結(jié)果和函數(shù)的特征行為傳遞給函數(shù)調(diào)用關(guān)系構(gòu)建模塊;函數(shù)調(diào)用關(guān)系構(gòu)建模塊根據(jù)傳遞 過來的函數(shù)識(shí)別結(jié)果、函數(shù)的特征行為和每個(gè)函數(shù)中的調(diào)用指令構(gòu)建函數(shù)間的相互調(diào)用關(guān) 系,并將這些識(shí)別出來的調(diào)用關(guān)系信息傳遞給函數(shù)調(diào)用圖生成模塊;函數(shù)調(diào)用圖生成模塊 根據(jù)由函數(shù)調(diào)用關(guān)系構(gòu)建模塊傳遞來的函數(shù)相互調(diào)用關(guān)系信息構(gòu)建函數(shù)調(diào)用圖,并將函數(shù)相互調(diào)用關(guān)系信息和構(gòu)建出來的函數(shù)調(diào)用圖傳遞給控制流圖構(gòu)建模塊。所述的控制流圖構(gòu)建模塊包括節(jié)點(diǎn)構(gòu)建模塊、節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊、控制流 圖生成模塊;節(jié)點(diǎn)構(gòu)建模塊接受程序基本塊識(shí)別模塊傳遞過來的基本塊集合,根據(jù)其中基 本塊的控制流信息構(gòu)建相應(yīng)的控制流節(jié)點(diǎn),并將構(gòu)建的節(jié)點(diǎn)集合傳遞給節(jié)點(diǎn)關(guān)系構(gòu)建和維 護(hù)模塊;節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊根據(jù)傳遞來的節(jié)點(diǎn)集合構(gòu)建這些節(jié)點(diǎn)在執(zhí)行過程中的動(dòng) 態(tài)路徑信息,同時(shí)將節(jié)點(diǎn)動(dòng)態(tài)路徑信息傳遞給靜態(tài)分析模塊,根據(jù)返回的包含未執(zhí)行路徑 的程序執(zhí)行路徑信息構(gòu)建完整的程序控制流,并將構(gòu)建的控制流信息傳遞給控制流圖生成 模塊;控制流圖生成模塊根據(jù)節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊傳遞過來的控制流信息構(gòu)建程序控 制流圖,并將這個(gè)程序控制流圖作為系統(tǒng)的輸出傳遞給系統(tǒng)的用戶。所述的函數(shù)識(shí)別模塊包括函數(shù)信息查找模塊、函數(shù)分析模塊;函數(shù)信息查找模 塊提取由函數(shù)調(diào)用圖構(gòu)建模塊傳遞過來的函數(shù)塊的調(diào)用地址,根據(jù)此地址在目標(biāo)程序PE 文件的導(dǎo)入地址表(IAT,Import Address Table)中獲得所調(diào)用函數(shù)的索引值,并將查找到 的函數(shù)索引值傳遞給函數(shù)分析模塊;函數(shù)分析模塊根據(jù)函數(shù)信息查找模塊傳遞來的函數(shù)索 引值從API數(shù)據(jù)庫中直接獲得該函數(shù)的信息傳播方式和特征行為,并將該函數(shù)的識(shí)別結(jié)果 和特征行為返回給函數(shù)調(diào)用圖構(gòu)建模塊。所述的靜態(tài)分析模塊包括動(dòng)態(tài)執(zhí)行路徑記錄模塊、靜態(tài)路徑補(bǔ)全模塊;動(dòng)態(tài)執(zhí) 行路徑記錄模塊根據(jù)控制流圖構(gòu)建模塊傳遞來的節(jié)點(diǎn)動(dòng)態(tài)路徑信息記錄程序在動(dòng)態(tài)執(zhí)行 時(shí)走過的路徑,并將此路徑信息傳遞給靜態(tài)路徑補(bǔ)全模塊;靜態(tài)路徑補(bǔ)全模塊根據(jù)動(dòng)態(tài)執(zhí) 行路徑記錄模塊記錄的程序動(dòng)態(tài)執(zhí)行路徑信息補(bǔ)全剩余的未執(zhí)行到的程序路徑,生成包含 未執(zhí)行路徑的完整的程序執(zhí)行路徑信息,并將該信息作為輸出返回至控制流圖構(gòu)建模塊。所述的API數(shù)據(jù)庫包含常見系統(tǒng)API和庫函數(shù)的索引值、函數(shù)特征行為和函數(shù)的 信息傳播方式等。與現(xiàn)有技術(shù)相比,本發(fā)明具有如下有益效果將動(dòng)態(tài)程序分析和靜態(tài)路徑補(bǔ)全技 術(shù)相結(jié)合,其優(yōu)點(diǎn)在于(1)本發(fā)明繼承了兩種技術(shù)的優(yōu)點(diǎn),既有動(dòng)態(tài)程序分析的實(shí)時(shí)性, 并能夠獲得程序?qū)嶋H運(yùn)行時(shí)的大量動(dòng)態(tài)信息,又能獲得較高的程序可執(zhí)行路徑覆蓋率,使 檢測(cè)結(jié)果更完整、更有說服力;(2)本發(fā)明互補(bǔ)了兩種技術(shù)的缺點(diǎn),通過靜態(tài)分析克服了動(dòng) 態(tài)程序分析覆蓋率較低的缺點(diǎn),通過動(dòng)態(tài)分析過程中獲得的信息提高靜態(tài)分析的精度,因 此提高了發(fā)現(xiàn)軟件脆弱點(diǎn)和漏洞的可能性;(3)本發(fā)明相對(duì)同類漏洞檢測(cè)系統(tǒng),降低了系 統(tǒng)的資源和時(shí)間的開銷;(4)本發(fā)明能夠針對(duì)目標(biāo)程序的二進(jìn)制代碼進(jìn)行漏洞的分析和檢 測(cè),與同類系統(tǒng)大都只能針對(duì)目標(biāo)程序的源代碼進(jìn)行檢測(cè)相比,有更為廣泛的應(yīng)用空間。
圖1為本發(fā)明的系統(tǒng)架構(gòu)圖;圖2為本發(fā)明的系統(tǒng)輸出樣例。
具體實(shí)施例方式下面結(jié)合附圖對(duì)本發(fā)明的實(shí)施例作詳細(xì)說明,本實(shí)施例在以本發(fā)明技術(shù)方案為前 提下進(jìn)行實(shí)施,給出了詳細(xì)的實(shí)施方式和具體的操作過程,但本發(fā)明的保護(hù)范圍不限于下 述的實(shí)施例。
6
如圖1所示,本實(shí)施例包括二進(jìn)制代碼動(dòng)態(tài)插入模塊、程序基本塊識(shí)別模塊、函 數(shù)調(diào)用圖構(gòu)建模塊、控制流圖構(gòu)建模塊、函數(shù)識(shí)別模塊、靜態(tài)分析模塊。所述的二進(jìn)制代 碼動(dòng)態(tài)插入模塊可將用戶自定義的分析代碼插入程序的任意位置,并跟蹤程序調(diào)用的系 統(tǒng)API,最后將分析結(jié)果通過自定義程序分析文件提供的回調(diào)函數(shù)返回并傳遞給程序基本 塊識(shí)別模塊;所述的程序基本塊識(shí)別模塊根據(jù)二進(jìn)制代碼動(dòng)態(tài)插入模塊傳遞的分析結(jié)果將 目標(biāo)程序按基本塊規(guī)則劃分,并將劃分的基本塊集合傳遞給函數(shù)調(diào)用圖構(gòu)建模塊和控制流 圖構(gòu)建模塊;所述的函數(shù)調(diào)用圖構(gòu)建模塊對(duì)基本塊識(shí)別模塊傳遞過來的基本塊集合進(jìn)行處 理,得到基本的函數(shù)塊集合,并將此函數(shù)塊集合傳遞給函數(shù)識(shí)別模塊,根據(jù)返回的函數(shù)行為 特征得到函數(shù)之間的相互調(diào)用關(guān)系,以此構(gòu)建函數(shù)調(diào)用圖,并將函數(shù)調(diào)用信息傳遞給控制 流圖構(gòu)建模塊;所述的控制流圖構(gòu)建模塊根據(jù)程序基本塊識(shí)別模塊傳遞來的基本塊集合構(gòu) 建控制流節(jié)點(diǎn)集合并維護(hù)它們的相互關(guān)系,并將構(gòu)建的節(jié)點(diǎn)集合和程序執(zhí)行時(shí)獲得的動(dòng)態(tài) 信息傳遞給靜態(tài)分析模塊,根據(jù)返回的包含未執(zhí)行路徑的完整執(zhí)行信息構(gòu)建完整的程序控 制流信息和程序控制流圖,并將此信息作為系統(tǒng)輸出傳遞給用戶;所述函數(shù)識(shí)別模塊提取 函數(shù)調(diào)用圖構(gòu)建模塊傳遞過來的基本函數(shù)塊的調(diào)用地址,根據(jù)此信息查找API數(shù)據(jù)庫獲得 函數(shù)的索引值和行為特征,并將找到的函數(shù)索引值和行為特征作為輸出返回給函數(shù)調(diào)用圖 構(gòu)建模塊;所述靜態(tài)分析模塊接受控制流圖構(gòu)建模塊傳遞來的節(jié)點(diǎn)集合和記錄的動(dòng)態(tài)執(zhí)行 路徑信息,補(bǔ)全未執(zhí)行到的路徑信息,生成完整的程序執(zhí)行路徑信息,并將這些信息作為輸 出返回給控制流圖構(gòu)建模塊。本實(shí)施例將以此段代碼為例說明本發(fā)明每個(gè)模塊的運(yùn)行過程、運(yùn)行結(jié)果和產(chǎn)生的 效果如下lbuffer[MAXLINELEN];2InputList*il ;34//處理輸入的代碼5int handle_input{5if (il- > flag == FLAG_INVALID)6Input_invalid_procedure(il);7else if (il- > flag == FLAG_UNIC0DE)8Input_unicode_procedure(buffer, il);9else if (il- > flag == FLAG_ANSI)10Input_ansi_procedure(buffer, il);IlreturnO ;12}1314void Input_invalid_procedure(il)15 {16printf ( "% s,,,"Error ! The input is invalid !”);17}18
7
19void Input_unicode_procedure(buffer, il);20 {21sprintf (buffer, “ % s”,il- > usr_str) ;// 緩沖區(qū)溢出22}2324void Input_ansi_procedure(buffer, il)25 {26for(int i = 0 ;i < 100 ;i++)27 {28printf ( "% s,,,buffer [i]);29}30}所述的二進(jìn)制代碼動(dòng)態(tài)插入模塊,包括自定義程序分析文件和動(dòng)態(tài)代碼插入工具 DynamoRIO0根據(jù)用戶自定義的分析文件中的規(guī)則要求,動(dòng)態(tài)代碼插入工具DynamoRIO可以 在樣例代碼中每個(gè)函數(shù)(如函數(shù)Input_unicode_procedure)的調(diào)用處插入二進(jìn)制代碼從 而跟蹤程序執(zhí)行流,并分析記錄程序運(yùn)行時(shí)的信息,然后將分析記錄的結(jié)果通過用戶實(shí)現(xiàn) 的回調(diào)函數(shù)傳遞給程序基本塊識(shí)別模塊。所述的程序基本塊識(shí)別模塊,包括單個(gè)指令定義和識(shí)別模塊、基本塊定義和識(shí)別 模塊。單個(gè)指令定義和識(shí)別模塊可以根據(jù)程序動(dòng)態(tài)分析信息識(shí)別出程序的單個(gè)指令(如樣 例代碼中的每一行即是一條指令),并將這些單個(gè)指令的識(shí)別結(jié)果傳遞給程序基本塊定義 和識(shí)別模塊。因此樣例代碼中的存在漏洞的第21行代碼“sprintf (buffer,“ % s,,,il- > usr_str); ”也將被識(shí)別為一條指令。這里定義基本塊是只具有一個(gè)入口和一個(gè)出口的直 線順序的代碼序列?;緣K的定義和識(shí)別模塊根據(jù)基本塊的定義規(guī)則,對(duì)單個(gè)指令的識(shí)別 結(jié)果進(jìn)行處理合并,從而識(shí)別出程序的基本塊,并將這些基本塊的識(shí)別結(jié)果傳遞給函數(shù)調(diào) 用圖構(gòu)建模塊和控制流圖構(gòu)建模塊。因此樣例代碼中包含存在漏洞的第21行代碼的基本 塊為第19到22行指令構(gòu)成的基本塊。本發(fā)明將目標(biāo)程序識(shí)別出的基本塊接順序放入一個(gè) 鏈表,同時(shí),所述的基本塊實(shí)際為程序中某段指令的鏈?zhǔn)郊?,即本發(fā)明采取嵌套鏈表的方 式存儲(chǔ)程序基本塊識(shí)別模塊中識(shí)別出來的指令和基本塊。所述的函數(shù)調(diào)用圖構(gòu)建模塊,包括函數(shù)節(jié)點(diǎn)識(shí)別模塊、函數(shù)調(diào)用關(guān)系構(gòu)建模塊 和函數(shù)調(diào)用圖生成模塊。函數(shù)節(jié)點(diǎn)識(shí)別模塊根據(jù)傳遞過來的程序基本塊集合,識(shí)別出帶 ret (返回)指令的基本塊并將其作為函數(shù)節(jié)點(diǎn)將程序基本塊集合進(jìn)行劃分,以此識(shí)別出每 個(gè)的函數(shù)塊(如樣例代碼中第19到22行代碼構(gòu)成的函數(shù)塊),并將這些函數(shù)塊識(shí)別結(jié)果傳 遞給函數(shù)識(shí)別模塊。函數(shù)識(shí)別模塊提取函數(shù)塊的調(diào)用地址,根據(jù)此地址在目標(biāo)程序PE文件 的導(dǎo)入地址表中獲得所調(diào)用函數(shù)的索引值(Hint值,每個(gè)函數(shù)有唯一的Hint值),并根據(jù)函 數(shù)Hint值從API數(shù)據(jù)庫中直接獲得該函數(shù)的信息傳播方式和特征行為。之后,系統(tǒng)根據(jù)函 數(shù)識(shí)別的結(jié)果、函數(shù)的特征行為和每個(gè)函數(shù)中的調(diào)用指令(即call和jmp指令)構(gòu)建函數(shù) 間的相互調(diào)用關(guān)系,并以此為依據(jù)生成程序中所有函數(shù)的調(diào)用關(guān)系圖。所述的控制流圖構(gòu)建模塊,包括節(jié)點(diǎn)構(gòu)建模塊、節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊和控制 流圖生成模塊。節(jié)點(diǎn)構(gòu)建模塊接受程序基本塊識(shí)別模塊傳遞過來的基本塊集合,根據(jù)其中基本塊的控制流信息構(gòu)建相應(yīng)的控制流節(jié)點(diǎn),并將構(gòu)建的節(jié)點(diǎn)集合傳遞給節(jié)點(diǎn)關(guān)系構(gòu)建和 維護(hù)模塊。節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊根據(jù)傳遞來的節(jié)點(diǎn)集合構(gòu)建這些節(jié)點(diǎn)在執(zhí)行過程中的 動(dòng)態(tài)路徑信息,同時(shí)將節(jié)點(diǎn)動(dòng)態(tài)路徑信息傳遞給靜態(tài)分析模塊。靜態(tài)分析模塊得到程序在 動(dòng)態(tài)執(zhí)行時(shí)走過的路徑后,依據(jù)以下所示的靜態(tài)分析路徑補(bǔ)全算法補(bǔ)全剩余的未執(zhí)行到的 程序路徑,生成包含未執(zhí)行路徑的完整的程序控制流,具體如下Input :branch point list P{p1; p2,p3,· · · }CFG :B{bi; b2, . . . }H基本塊集合Ele1, e2, . . . }H邊集合procedure StaticAnalysisη = 1 ;for branch point :pn in P ;for each new b = GetNextBB ();H獲得下一個(gè)未執(zhí)行的基本塊if b not in Bif last instruction is condition branchaddnewp' intoP ;end ifaddbintoB ;addnewEintoE ;end ifn++ ;最后控制流圖生成模塊根據(jù)完整的程序控制流信息生成目標(biāo)程序的控制流圖,并
以此作為系統(tǒng)的輸出傳遞給系統(tǒng)的用戶。如圖2所示,本實(shí)施例代碼真正的執(zhí)行路徑是由紅色粗箭頭所標(biāo)記的,黑色細(xì)箭 頭標(biāo)記的路徑是由本發(fā)明補(bǔ)全的未執(zhí)行路徑,兩者構(gòu)成了樣本代碼的全部可執(zhí)行路徑。如 果僅按照程序的執(zhí)行路徑分析,則無法檢測(cè)到實(shí)施例代碼中的代碼漏洞;而根據(jù)本實(shí)施例 經(jīng)過靜態(tài)分析路徑補(bǔ)全技術(shù)處理后得到的控制流圖,則可明確無誤的檢測(cè)到樣本程序中潛 在的漏洞。同時(shí),由于獲得了許多目標(biāo)程序動(dòng)態(tài)運(yùn)行時(shí)的信息,本實(shí)施例在進(jìn)行靜態(tài)分析路 徑補(bǔ)全時(shí)能夠更快捷、更精確地獲得補(bǔ)全結(jié)果,提高了補(bǔ)全精度,降低了時(shí)間和系統(tǒng)資源的 開銷。本實(shí)施例實(shí)施過程如下載入目標(biāo)程序之后,二進(jìn)制代碼動(dòng)態(tài)插入模塊將插入分析代碼或函數(shù)調(diào)用語句, 目的是能在程序運(yùn)行時(shí)動(dòng)態(tài)調(diào)用系統(tǒng)自定義的分析代碼,從而得到目標(biāo)程序運(yùn)行時(shí)產(chǎn)生的 fn息;識(shí)別目標(biāo)程序代碼中的每條指令,并將屬于同一基本塊的指令鏈接起來構(gòu)建成一 個(gè)正確的程序基本塊,通過程序基本塊識(shí)別模塊來完成指令的識(shí)別以及基本塊的識(shí)別與構(gòu)建任務(wù);在函數(shù)調(diào)用圖構(gòu)建模塊中對(duì)程序基本塊識(shí)別模塊得到的程序基本塊集合進(jìn)行處 理,識(shí)別出基本的函數(shù)塊,由函數(shù)識(shí)別模塊調(diào)用API數(shù)據(jù)庫對(duì)以上函數(shù)塊進(jìn)行進(jìn)一步的識(shí) 別與分析,得到所調(diào)用函數(shù)的傳播信息和特征行為,據(jù)此構(gòu)建并維護(hù)函數(shù)的調(diào)用關(guān)系,生成 目標(biāo)程序的函數(shù)調(diào)用圖;使用靜態(tài)分析模塊對(duì)函數(shù)調(diào)用圖構(gòu)建模塊生成的目標(biāo)程序函數(shù)調(diào)用圖進(jìn)行分析 并完成靜態(tài)路徑補(bǔ)全,通過控制流圖構(gòu)建模塊將補(bǔ)全結(jié)果與程序動(dòng)態(tài)執(zhí)行路徑相結(jié)合生成 完整的目標(biāo)程序控制流路徑,并生成程序控制流圖,以此作為整個(gè)系統(tǒng)的輸出傳遞給用戶。在實(shí)施例中,第三步由函數(shù)識(shí)別模塊調(diào)用API數(shù)據(jù)庫完成識(shí)別與分析的過程中, 涉及的API數(shù)據(jù)庫包含常見系統(tǒng)API和庫函數(shù)的索引值、函數(shù)特征行為以及信息傳播方式。 此API數(shù)據(jù)庫可由用戶根據(jù)實(shí)際需要進(jìn)行修改和維護(hù),以適應(yīng)不同的程序和漏洞檢測(cè)要 求。本實(shí)施例說明本發(fā)明繼承了動(dòng)態(tài)程序分析和靜態(tài)路徑補(bǔ)全技術(shù)各自的優(yōu)點(diǎn),互補(bǔ) 了兩種技術(shù)的缺點(diǎn),提高了程序分析結(jié)果的覆蓋度和分析精度,比同類系統(tǒng)有更大的可能 性發(fā)現(xiàn)軟件脆弱點(diǎn)和漏洞,同時(shí)降低了系統(tǒng)的資源和時(shí)間的開銷。
權(quán)利要求
一種計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征在于,包括二進(jìn)制代碼動(dòng)態(tài)插入模塊、程序基本塊識(shí)別模塊、函數(shù)調(diào)用圖構(gòu)建模塊、控制流圖構(gòu)建模塊、函數(shù)識(shí)別模塊、靜態(tài)分析模塊;二進(jìn)制代碼動(dòng)態(tài)插入模塊將用戶自定義的分析代碼插入程序的任意位置,并跟蹤程序調(diào)用的系統(tǒng)API,最后將分析結(jié)果通過自定義程序分析文件提供的回調(diào)函數(shù)返回并傳遞給程序基本塊識(shí)別模塊;程序基本塊識(shí)別模塊根據(jù)二進(jìn)制代碼動(dòng)態(tài)插入模塊傳遞的分析結(jié)果將目標(biāo)程序按基本塊規(guī)則劃分,并將劃分的基本塊集合傳遞給函數(shù)調(diào)用圖構(gòu)建模塊和控制流圖構(gòu)建模塊;函數(shù)調(diào)用圖構(gòu)建模塊對(duì)基本塊識(shí)別模塊傳遞過來的基本塊集合進(jìn)行處理,得到基本的函數(shù)塊集合,并將此函數(shù)塊集合傳遞給函數(shù)識(shí)別模塊,根據(jù)返回的函數(shù)行為特征得到函數(shù)之間的相互調(diào)用關(guān)系,以此構(gòu)建函數(shù)調(diào)用圖,并將函數(shù)調(diào)用信息傳遞給控制流圖構(gòu)建模塊;控制流圖構(gòu)建模塊根據(jù)程序基本塊識(shí)別模塊傳遞來的基本塊集合構(gòu)建控制流節(jié)點(diǎn)集合并維護(hù)它們的相互關(guān)系,并將構(gòu)建的節(jié)點(diǎn)集合和程序執(zhí)行時(shí)獲得的動(dòng)態(tài)信息傳遞給靜態(tài)分析模塊,根據(jù)返回的包含未執(zhí)行路徑的完整執(zhí)行信息構(gòu)建完整的程序控制流信息和程序控制流圖,并將此信息作為系統(tǒng)輸出傳遞給用戶;函數(shù)識(shí)別模塊提取函數(shù)調(diào)用圖構(gòu)建模塊傳遞過來的基本函數(shù)塊的調(diào)用地址,根據(jù)此信息查找API數(shù)據(jù)庫獲得函數(shù)的索引值和行為特征,并將找到的函數(shù)索引值和行為特征作為輸出返回給函數(shù)調(diào)用圖構(gòu)建模塊;靜態(tài)分析模塊接受控制流圖構(gòu)建模塊傳遞來的節(jié)點(diǎn)集合和記錄的動(dòng)態(tài)執(zhí)行路徑信息,補(bǔ)全未執(zhí)行到的路徑信息,生成完整的程序執(zhí)行路徑信息,并將這些信息作為輸出返回給控制流圖構(gòu)建模塊。
2.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特 征是,所述的二進(jìn)制代碼動(dòng)態(tài)插入模塊包括自定義程序分析文件、動(dòng)態(tài)代碼插入工具 DynamoRIO;自定義程序分析文件完成了對(duì)DynamoRIO提供的回調(diào)函數(shù)的實(shí)現(xiàn),用戶能在此 文件中定義所需的動(dòng)態(tài)分析關(guān)注點(diǎn)和分析規(guī)則;動(dòng)態(tài)代碼插入工具DynamoRIO能在程序運(yùn) 行時(shí),根據(jù)自定義程序分析文件中規(guī)定的分析要求和規(guī)則,在程序的任意位置插入任意二 進(jìn)制代碼并跟蹤API信息,最后將分析結(jié)果通過所述的回調(diào)函數(shù)傳遞給程序基本塊識(shí)別模 塊。
3.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的程序基本塊識(shí)別模塊包括程序單個(gè)指令定義和識(shí)別模塊、程序基本塊定義和識(shí) 別模塊;程序單個(gè)指令定義和識(shí)別模塊包含了單個(gè)指令的定義和識(shí)別規(guī)則,此模塊根據(jù)由 二進(jìn)制代碼動(dòng)態(tài)插入模塊傳遞過來的程序動(dòng)態(tài)分析信息識(shí)別出程序的單個(gè)指令,并將這些 單個(gè)指令的識(shí)別結(jié)果傳遞給程序基本塊定義和識(shí)別模塊;程序基本塊的定義和識(shí)別模塊包 含了基本塊的定義和識(shí)別規(guī)則,此模塊根據(jù)程序單個(gè)指令定義和識(shí)別模塊傳遞過來的單個(gè) 指令的識(shí)別結(jié)果識(shí)別出程序的基本塊,并將這些基本塊的識(shí)別結(jié)果傳遞給函數(shù)調(diào)用圖構(gòu)建 模塊和控制流圖構(gòu)建模塊。
4.相據(jù)權(quán)利要求3所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的程序基本塊為程序某段指令的鏈?zhǔn)郊希绦虻膶?shí)際分析過程將采用基本塊 執(zhí)行過程。
5.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的函數(shù)調(diào)用圖構(gòu)建模塊包括函數(shù)節(jié)點(diǎn)識(shí)別模塊、函數(shù)調(diào)用關(guān)系構(gòu)建模塊、函數(shù)調(diào) 用圖生成模塊;函數(shù)節(jié)點(diǎn)識(shí)別模塊根據(jù)由程序基本塊識(shí)別模塊傳遞過來的程序基本塊集合,識(shí)別出帶返回指令的基本塊并將其作為函數(shù)節(jié)點(diǎn)將程序基本塊集合進(jìn)行劃分,以此識(shí) 別出每個(gè)的函數(shù)塊,并將這些函數(shù)塊識(shí)別結(jié)果傳遞給函數(shù)識(shí)別模塊,并將返回的函數(shù)識(shí)別 結(jié)果和函數(shù)的特征行為傳遞給函數(shù)調(diào)用關(guān)系構(gòu)建模塊;函數(shù)調(diào)用關(guān)系構(gòu)建模塊根據(jù)傳遞 過來的函數(shù)識(shí)別結(jié)果、函數(shù)的特征行為和每個(gè)函數(shù)中的調(diào)用指令構(gòu)建函數(shù)間的相互調(diào)用關(guān) 系,并將這些識(shí)別出來的調(diào)用關(guān)系信息傳遞給函數(shù)調(diào)用圖生成模塊;函數(shù)調(diào)用圖生成模塊 根據(jù)由函數(shù)調(diào)用關(guān)系構(gòu)建模塊傳遞來的函數(shù)相互調(diào)用關(guān)系信息構(gòu)建函數(shù)調(diào)用圖,并將函數(shù) 相互調(diào)用關(guān)系信息和構(gòu)建出來的函數(shù)調(diào)用圖傳遞給控制流圖構(gòu)建模塊。
6.相據(jù)權(quán)利要求1所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的控制流圖構(gòu)建模塊包括節(jié)點(diǎn)構(gòu)建模塊、節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊、控制流圖生 成模塊;節(jié)點(diǎn)構(gòu)建模塊接受程序基本塊識(shí)別模塊傳遞過來的基本塊集合,根據(jù)其中基本塊 的控制流信息構(gòu)建相應(yīng)的控制流節(jié)點(diǎn),并將構(gòu)建的節(jié)點(diǎn)集合傳遞給節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模 塊;節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊根據(jù)傳遞來的節(jié)點(diǎn)集合構(gòu)建這些節(jié)點(diǎn)在執(zhí)行過程中的動(dòng)態(tài) 路徑信息,同時(shí)將節(jié)點(diǎn)動(dòng)態(tài)路徑信息傳遞給靜態(tài)分析模塊,根據(jù)返回的包含未執(zhí)行路徑的 程序執(zhí)行路徑信息構(gòu)建完整的程序控制流,并將構(gòu)建的控制流信息傳遞給控制流圖生成模 塊;控制流圖生成模塊根據(jù)節(jié)點(diǎn)關(guān)系構(gòu)建和維護(hù)模塊傳遞過來的控制流信息構(gòu)建程序控制 流圖,并將這個(gè)程序控制流圖作為系統(tǒng)的輸出傳遞給系統(tǒng)的用戶。
7.相據(jù)權(quán)利要求1所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的函數(shù)識(shí)別模塊包括函數(shù)信息查找模塊、函數(shù)分析模塊;函數(shù)信息查找模塊提取 由函數(shù)調(diào)用圖構(gòu)建模塊傳遞過來的函數(shù)塊的調(diào)用地址,根據(jù)此地址在目標(biāo)程序PE文件的 導(dǎo)入地址表中獲得所調(diào)用函數(shù)的索引值,并將查找到的函數(shù)索引值傳遞給函數(shù)分析模塊; 函數(shù)分析模塊根據(jù)函數(shù)信息查找模塊傳遞來的函數(shù)索引值從API數(shù)據(jù)庫中直接獲得該函 數(shù)的信息傳播方式和特征行為,并將該函數(shù)的識(shí)別結(jié)果和特征行為返回給函數(shù)調(diào)用圖構(gòu)建 模塊。
8.根據(jù)權(quán)利要求7所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的API數(shù)據(jù)庫包含常見系統(tǒng)API和庫函數(shù)的索引值、函數(shù)特征行為和函數(shù)的信息傳 播方式。
9.根據(jù)權(quán)利要求1所述的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng),其特征 是,所述的靜態(tài)分析模塊包括動(dòng)態(tài)執(zhí)行路徑記錄模塊、靜態(tài)路徑補(bǔ)全模塊;動(dòng)態(tài)執(zhí)行路徑 記錄模塊根據(jù)控制流圖構(gòu)建模塊傳遞來的節(jié)點(diǎn)動(dòng)態(tài)路徑信息記錄程序在動(dòng)態(tài)執(zhí)行時(shí)走過 的路徑,并將此路徑信息傳遞給靜態(tài)路徑補(bǔ)全模塊;靜態(tài)路徑補(bǔ)全模塊根據(jù)動(dòng)態(tài)執(zhí)行路徑 記錄模塊記錄的程序動(dòng)態(tài)執(zhí)行路徑信息補(bǔ)全剩余的未執(zhí)行到的程序路徑,生成包含未執(zhí)行 路徑的完整的程序執(zhí)行路徑信息,并將該信息作為輸出返回至控制流圖構(gòu)建模塊。
全文摘要
一種計(jì)算機(jī)技術(shù)領(lǐng)域的計(jì)算機(jī)程序?qū)嶋H運(yùn)行時(shí)觸發(fā)軟件漏洞的檢測(cè)系統(tǒng)。包括二進(jìn)制代碼動(dòng)態(tài)插入模塊、程序基本塊識(shí)別模塊、函數(shù)調(diào)用圖構(gòu)建模塊、控制流圖構(gòu)建模塊、函數(shù)識(shí)別模塊、靜態(tài)分析模塊;本發(fā)明通過結(jié)合動(dòng)態(tài)程序分析和靜態(tài)分析路徑補(bǔ)全這兩種技術(shù),既能檢測(cè)到那些在程序?qū)嶋H運(yùn)行時(shí)才會(huì)觸發(fā)的漏洞,又能達(dá)到較高的程序路徑覆蓋率,對(duì)動(dòng)態(tài)分析過程中沒有覆蓋到的路徑進(jìn)行漏洞檢測(cè),提高了漏洞檢測(cè)的成功率,降低了漏洞誤報(bào)率。同時(shí),靜態(tài)分析路徑補(bǔ)全技術(shù)只分析動(dòng)態(tài)分析未執(zhí)行到的路徑,而并非全部的程序路徑,這樣大大降低了時(shí)間和系統(tǒng)資源的開銷。
文檔編號(hào)G06F11/36GK101968766SQ201010513779
公開日2011年2月9日 申請(qǐng)日期2010年10月21日 優(yōu)先權(quán)日2010年10月21日
發(fā)明者周侃, 張若愚, 王卓, 黃實(shí)秋, 黃山 申請(qǐng)人:上海交通大學(xué)