国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      一種受上下文無關(guān)文法約束的測試用例生成方法

      文檔序號:6356054閱讀:931來源:國知局
      專利名稱:一種受上下文無關(guān)文法約束的測試用例生成方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及一種為軟件安全性測試生成測試用例的方法,尤其涉及一種使用變異 型策略為Fuzzing測試生成受上下文無關(guān)文法約束的測試用例的方法,屬于軟件工程技術(shù) 領(lǐng)域。
      背景技術(shù)
      安全漏洞的存在對于信息系統(tǒng)是一個極大的威脅。攻擊者可以借助漏洞使目標(biāo) 主機(jī)發(fā)生崩潰,造成計算機(jī)系統(tǒng)無法正常工作,甚至能夠突破安全防御,獲取系統(tǒng)的訪問權(quán) 限,完成諸如盜竊敏感文件、安裝后門程序等惡意行為。因此,在軟件開發(fā)完成后,有必要展 開安全性測試,盡可能發(fā)現(xiàn)其中存在的漏洞并采取措施修復(fù),確保信息系統(tǒng)安全可靠。在實踐中,F(xiàn)uzzing測試是最流行的一種用于挖掘漏洞的安全性測試技術(shù)。 Fuzzing技術(shù)屬于軟件測試領(lǐng)域的黑盒測試類型,它不關(guān)心程序內(nèi)部的工作機(jī)制,而是根據(jù) 程序?qū)ν庹宫F(xiàn)的接口,構(gòu)造大量半有效的測試用例作為輸入,以程序是否出現(xiàn)異常為標(biāo)志, 來判斷是否存在安全漏洞。Fuzzing測試能夠快速地找到大范圍的緩沖區(qū)溢出、整數(shù)溢出、 格式化字符串等類型的漏洞,是一種代價低且行之有效的漏洞挖掘技術(shù),在業(yè)界已經(jīng)得到 廣泛的應(yīng)用。Fuzzing測試的一項關(guān)鍵是測試用例的生成技術(shù)。好的測試用例應(yīng)該是半有效的。 所謂“半有效”,是指測試用例從整體上看符合程序期待的格式規(guī)范,以便通過最初的輸入 驗證,執(zhí)行到達(dá)核心的數(shù)據(jù)處理代碼;同時,測試用例的部分關(guān)鍵字段必須是無效的,這樣 才能觸發(fā)隱藏在核心代碼中的深層次錯誤。通常,F(xiàn)uzzing測試的測試用例生成技術(shù)可以 分為兩類生成型(Generational)和變異型(Mutational)。生成型方式需要首先編寫用 以描述測試對象輸入格式的模板,之后Fuzzing工具將根據(jù)一定的規(guī)則填充模板,產(chǎn)生測 試用例;對于變異型方式,操作者需要提供正常有效的輸入數(shù)據(jù)樣本,F(xiàn)uzzing工具以此為 起點,對樣本中的某些域進(jìn)行變化,從而得到新的變異后的測試用例。目前安全研究人員已經(jīng)開發(fā)出大量Fuzzing工具,可用于各種不同類型的軟件進(jìn) 行安全性測試。這些工具可用于測試的輸入類型包括網(wǎng)絡(luò)報文、文件格式、API接口(包括 動態(tài)鏈接庫和COM組件/ActiveX)等。這些輸入類型的共同特點是數(shù)據(jù)由二進(jìn)制格式描 述,以數(shù)據(jù)域(Field)為單位進(jìn)行組織;各個域之間的關(guān)系較為簡單,其中多數(shù)域是獨立的 數(shù)據(jù)單元,無論對其中的數(shù)據(jù)進(jìn)行怎樣的修改,修改后的整體輸入仍是合法的。一個典型的 例子就是TCP報文TCP報文由二進(jìn)制數(shù)據(jù)構(gòu)成,其中含有大量不可打印字符;整個報文被 劃分成一個個的域,分別用于表示源端口、目的端口、序列號等;不同的域之間的關(guān)系較為 簡單,只有“校驗和”域上存在約束(必須是TCP頭部所有域的校驗和),對于其它的域如源 端口,任意改變其中的值,整個報文仍舊是合法的TCP報文。針對這類數(shù)據(jù)的Fuzzing測試 技術(shù)研究上已經(jīng)非常成熟,現(xiàn)有工具都能較好地進(jìn)行處理。與此同時,也有些常用而重要的軟件,它們的輸入數(shù)據(jù)顯現(xiàn)出與以上描述完 全不同的特征。這方面的典型例子如網(wǎng)絡(luò)瀏覽器及其要處理的Jav必cript腳本。首先,JavMcript腳本是純文本格式的,基本組成結(jié)構(gòu)是語法記號而非二進(jìn)制域;其次, JavMcript語言具有嚴(yán)格的語法結(jié)構(gòu),各語法記號的存在與否及其順序都要符合上下文無 關(guān)文法的約束,即使腳本中一個字符出現(xiàn)錯誤,都有可能導(dǎo)致瀏覽器無法解析腳本,從而達(dá) 不到測試的效果。目前現(xiàn)有的Fuzzing工具大都無法對這類輸入進(jìn)行有效的測試。

      發(fā)明內(nèi)容
      本發(fā)明的目的是設(shè)計一種為Fuzzing測試生成受上下文無關(guān)文法約束的測試用 例的方法,以允許Fuzzing工具對處理此類輸入的軟件(如瀏覽器,數(shù)據(jù)庫服務(wù)器系統(tǒng)等) 進(jìn)行安全性測試。本發(fā)明的技術(shù)方案為一種基于上下文無關(guān)文法的變異型Fuzzing測試用例生成方法,其步驟為1)編寫一定數(shù)量的合法測試用例,這些測試用例構(gòu)成的集合稱為初始集合,記作 I。合法的測試用例為符合目標(biāo)程序上下文無關(guān)文法約束的、能被目標(biāo)程序正確地接受和處 理的測試用例。對于I中測試用例的數(shù)量并沒有一個固定的要求,但這些測試用例最好能 夠覆蓋上下文無關(guān)文法中可能出現(xiàn)的每種語法結(jié)構(gòu);2)對于I中的每個測試用例,使用上下文無關(guān)文法分析其語法結(jié)構(gòu),得到一個解 析樹T,T中的每個內(nèi)結(jié)點η都代表文法中的一個非終結(jié)符N,同時也對應(yīng)測試用例中由該 非終結(jié)符所生成的子串s ;3)遍歷解析樹Τ,對于其中的每個內(nèi)結(jié)點η,找到相應(yīng)的非終結(jié)符N所生成的測試 用例的子串s,將s加入非終結(jié)符N可以生成的字符串集合中,該集合記為4)對I中的每個測試用例均執(zhí)行步驟2、3中的操作。在本步驟結(jié)束時,對于上下 文無關(guān)文法中每個非終結(jié)符N,都存在一個N可以生成的字符串的集合;5)創(chuàng)建一個空隊列Q,為Q設(shè)定一個測試用例的入隊條件P (例如長度小于一個預(yù) 設(shè)值),并將初始集合I中的合法測試用例作為初始種子測試用例全部加入到隊列Q中。同 時創(chuàng)建一個空集合GEN,用于存放后續(xù)步驟中生成的新測試用例;6)從隊列Q的隊頭取出一個初始種子測試用例C,使用上下文無關(guān)文法分析其語 法結(jié)構(gòu),得到一個解析樹T。;7)遍歷解析樹T。,對于其中的每個內(nèi)結(jié)點n。,執(zhí)行如下操作首先找到η。相應(yīng)的非 終結(jié)符N在測試用例c中生成的子串s。,然后使用集合中的每個與S。不同的字符串 來替代測試用例c的子串s。,從而得到一系列新的測試用例。對于其中每個新的測試用例 C’,如果C’已經(jīng)在集合GEN中出現(xiàn),則將其丟棄;否則,將C’加入集合GEN中,并且如果C’ 還滿足Q中預(yù)定的入隊條件P,則將C’作為新的種子添加到隊列Q的隊尾;8)重復(fù)執(zhí)行步驟6、7直到隊列Q中的種子測試用例被全部從隊頭取出。此時將集 合GEN中的全部元素作為本方法所生成的Fuzzing測試用例而輸出。本發(fā)明的積極效果為本發(fā)明首次提出了一種基于上下文無關(guān)文法的變異型Fuzzing測試用例生成方 法。首先,該方法基于上下文無關(guān)文法,能夠生成符合文法約束的測試用例,可以用于對 網(wǎng)絡(luò)瀏覽器軟件、數(shù)據(jù)庫服務(wù)器系統(tǒng)等以此類數(shù)據(jù)為輸入的軟件進(jìn)行安全性測試,填補(bǔ)了 當(dāng)前通用Fuzzing框架在該領(lǐng)域的空白;其次,該方法使用了 Fuzzing測試中的變異型 (Mutational)數(shù)據(jù)生成方式,有效避免了生成型(Generational)數(shù)據(jù)生成方式固有的狀態(tài)空間爆炸以及難以滿足語義約束等缺陷,測試用例的生成速度快,得到的測試用例結(jié)構(gòu) 更復(fù)雜,并且絕大多數(shù)情況下都滿足語義約束。該方法具有有效性,在使用該方法對瀏 覽器的XPath語言處理代碼進(jìn)行Fuzzing測試后,共發(fā)現(xiàn)1個雙重釋放漏洞(CVE編號 CVE-2010-4494)和 1 個野指針調(diào)用漏洞,分別影響 Google Chrome/Apple Safari 和 Opera 瀏覽器,兩個漏洞均屬高危漏洞;通用性,無論何種具備上下文無關(guān)文法的輸入類型,都可 以使用該方法來生成這種類型的Fuzzing測試用例,從而解決一大類輸入類型的安全性測 試問題。


      圖1是正整數(shù)四則運算上下文無關(guān)文法的語法圖表示,其中(a)、表達(dá)式(expression)在該文法中的產(chǎn)生式規(guī)則,(b)、加減法表達(dá)式(additiveExpression)在該文法中的產(chǎn)生式規(guī)則,(C)、乘除法表達(dá)式(multiplicativeExpression)在該文法中的產(chǎn)生式規(guī)則,(d)、主表達(dá)式(primaryExpression)在該文法中的產(chǎn)生式規(guī)則;圖2為本發(fā)明方法的流程示意圖;圖3是對四則運算表達(dá)式“39-24/ (30+8),,進(jìn)行語法分析后得到的解析樹。
      具體實施例方式下面結(jié)合附圖詳細(xì)描述本發(fā)明的具體實施方式
      。假設(shè)需要對一個正整數(shù)四則運算計算器程序進(jìn)行安全性測試。該程序的輸入是 四則運算表達(dá)式,其中運算數(shù)為正整數(shù),運算符為加、減、乘和除,并且允許使用括號來定義 運算的優(yōu)先級次序。這類輸入可以由上下文無關(guān)文法描述,相應(yīng)文法的文字表示為(使用 ANTLR V3 格式)grammar Calc; options { output=AST; } tokens {
      PLUS = '+'; MINUS ='-'; MULT = '*'; DIV = 7';
      expression additiveExpression; additiveExpression :
      multiplicativeExpression ( (PLUS|MINUS)A multiplicativeExpression )*; multiplicativeExpression : primaryExpression ( (MULT|DIV)A primaryExpression )*; primaryExpression : '('! additiveExpression ')'! | INTEGER;
      INTEGER : ( '..'9')+;
      WS : (' '|V|'\tT\u000CT\n') {$channel=HIDDEN;};其 中 expression、additiveExpression、multiplicativeExpression 禾口 primaryExpression都是非終結(jié)符,分別表示表達(dá)式、加減法表達(dá)式、乘除法表達(dá)式和主表 達(dá)式;PLUS、MINUS、MULT、DIV和INTEGER都是終結(jié)符,分別表示運算符加(“ + ”)、運算符減 (“_”)、運算符乘(“X”)、運算符除(“/”)以及正整數(shù)運算數(shù)。與該上下文無關(guān)文法相 對應(yīng)的語法圖如圖1所示。參見圖2,為本發(fā)明方法的流程示意圖。對上述程序進(jìn)行安全性測試可遵循以下步 驟1.編寫合法測試用例的集合即初始種子集合。根據(jù)被測程序的特點,初始種子集 合應(yīng)為一個正整數(shù)四則運算表達(dá)式的集合。因此,可以編寫如下三條測試用例并加入初始 種子集合中39-24/ (30+8)9-(1680/8)/7((87-43) *8_29) *8這些測試用例都是合法的正整數(shù)四則運算表達(dá)式,并且含有加減乘除四種運算符 和括號,覆蓋了上下文無關(guān)文法中出現(xiàn)的各種語法結(jié)構(gòu)。2.使用上下文無關(guān)文法分析每個測試用例的語法結(jié)構(gòu),生成解析樹。多數(shù)已有的 語法分析工具都可以實現(xiàn)這一功能,其中較為常用的有JavaCC和ANTLR。以表達(dá)式39-24/(30+8)為例,在使用四則運算上下文無關(guān)文法對其語法結(jié)構(gòu)進(jìn)行分析后,可得到如圖3所 示的解析樹。3.對步驟2中得到的解析樹進(jìn)行遍歷,遍歷順序可以從深度優(yōu)先和廣度優(yōu)先中任 選其一,但要求在遍歷同一父結(jié)點下的子結(jié)點時,位于左側(cè)的子結(jié)點應(yīng)先于右側(cè)的子結(jié)點。 每當(dāng)訪問到一個內(nèi)結(jié)點時,該結(jié)點的名稱即為它所對應(yīng)的非終結(jié)符??疾煲栽搩?nèi)結(jié)點為根 的子樹,將子樹所有葉結(jié)點中的文本按照遍歷順序連接在一起,即得到前述非終結(jié)符所能 生成的一個字符串,此時應(yīng)將該字符串加入非終結(jié)符可以生成的字符串集合中。以圖3中的解析樹為例。遍歷順序采用深度優(yōu)先遍歷,當(dāng)遍歷至圖3中含有陰影 的結(jié)點時,該結(jié)點的名稱為additiveExpression,因此以該結(jié)點為根的子樹是由非終結(jié)符 additiveExpression生成的。將該子樹的三個葉結(jié)點中的文本“30”、“ + ”和“8”按照遍歷 順序連接,即得到非終結(jié)符additiveExpression所能生成的一個子串“30+8”。這時,將該 子串添加到additiveExpression可以生成的字符串集合中,得到FragadditiveExpMssi。n為FragadditiveExpression = { “ 39-24/ (30+8) ”,“ 30+8,,}4.重復(fù)執(zhí)行步驟2、3,直到初始種子集合中全部三條測試用例都得到處理為止。 此時,各非終結(jié)符所能生成的字符串集合為Fragexpression= {" ((87-4 *8_29) *8 〃,〃 39-24/(30+8)",〃 9-(1680/8)/7" }FragadditiveExpression= {" ((87-4 *8_29) *8 〃,〃 (87-43)^8-29",〃 1680/8〃 30+8 ”,“ 39-24/(30+8)",“ 87-43〃,“ 9-(1680/8)/7" }FragfflUltiplicativeExpression = {" ((87-4 *8_29)*8“,〃(1680/8)/7",〃(87-43)*
      8",〃 1680/8〃,〃 24/(30+8)",〃 29",〃 30",〃 39",〃 43",〃 8",〃 87",〃 9"
      }FragprimaryExpression= {" ((87-43) *8_29) 〃,〃(1680/8)〃,〃(30+8)〃,〃 (87-43) ‘‘,〃 1680〃,〃 24〃,〃 29〃,〃 30〃,〃 39〃,〃 43〃,〃 1",〃 8〃,〃 87〃,〃 9〃 }5.創(chuàng)建一個空隊列,設(shè)定測試用例的入隊條件為“表達(dá)式中語法記號的個數(shù)小于 等于10”,并將初始種子集合中的合法測試用例全部添加到隊列中。此時,隊列中的內(nèi)容 為Q= {〃 39-24/(30+8)",“ 9-(1680/8)/7",“((87-43)*8_29)*8“ }同時也創(chuàng)建一個空集合即結(jié)果集合,用于存放后續(xù)步驟中新生成的四則運算表達(dá) 式。在所有步驟執(zhí)行完畢后,該集合中的所有四則運算表達(dá)式將被作為結(jié)果輸出。6.從隊列的隊頭取出一個測試用例即“39-24/(30+8)”,使用四則運算上下文無 關(guān)文法分析其語法結(jié)構(gòu),得到相應(yīng)的解析樹如圖3所示。7.對步驟6中得到的解析樹進(jìn)行遍歷,遍歷順序的要求同步驟3。每當(dāng)訪問到一個 內(nèi)結(jié)點時,使用與步驟3相同的方式確定與之對應(yīng)的非終結(jié)符所生成的測試用例的子串。 例如,當(dāng)訪問到圖3中含有陰影的結(jié)點時,該結(jié)點的名稱為additiveExpression,相應(yīng)的非 終結(jié)符即為additiveExpression,它在測試用例“39-24/(30+8),,中生成的子串為“30+8”。8.使用相同非終結(jié)符所生成的其它子串來替代當(dāng)前子串,得到一系列新的測試 用例。此時,把這些測試用例添加到結(jié)果集合中,同時將其中滿足入隊條件的新測試用 例作為新的種子添加到隊列的隊尾。同樣以圖3中含有陰影的結(jié)點為例,該結(jié)點的非終 結(jié)符為additiveExpression,在當(dāng)前測試用例中生成的子串為“30+8”。此時,使用集合FragadditiveExpression中每個與“30+8”不同的子串來替代子串“30+8”,替換后會生成如下一系 列新的測試用例39--24/‘(((87-4 *8-29) *8)
      39--24/'((87-43)*8-29)
      39--24/'(1680/8)
      39--24/'(39-24/(30+8))
      39--24/'(87-43)
      39--24/'(9-(1680/8)/7)這些替換后的表達(dá)式都尚未出現(xiàn)在結(jié)果集合中,因此把它們?nèi)刻砑拥浇Y(jié)果集合 里。同時可以觀察到,這些新生成的測試用例里有兩個表達(dá)式中的語法記號不多于10個, 即“39-24/ (1680/8) ”和“39-24/ (87-43) ”。因此,這兩個表達(dá)式將作為新的種子被添加到 隊列的隊尾。9.重復(fù)執(zhí)行步驟6、7和8,直至隊列中的全部表達(dá)式都被從隊頭取出。此時將結(jié) 果集合中的所有四則運算表達(dá)式作為方法所生成的Fuzzing測試用例而輸出。
      權(quán)利要求
      1.一種受上下文無關(guān)文法約束的測試用例生成方法,其步驟為1)建立一包括若干合法測試用例的初始集合I;所述合法測試用例為符合目標(biāo)程序的 上下文無關(guān)文法約束、能被程序正確地接受和處理的測試用例;2)對于I中的每一合法測試用例,利用上下文無關(guān)文法分析其語法結(jié)構(gòu),得到一解析 樹T;3)遍歷解析樹T中每一內(nèi)結(jié)點n,對于n所對應(yīng)的上下文無關(guān)文法非終結(jié)符N,將N在 測試用例中所生成的子串s加入到該非終結(jié)符N對應(yīng)的字符串集合;4)對所述初始集合I中每一合法測試用例,重復(fù)步驟2)、3),得到每一非終結(jié)符在所有 合法測試用例中所能生成的字符串集合;5)將I中的合法測試用例作為初始種子測試用例加入到一隊列Q中,并為Q設(shè)定一個 測試用例入隊條件P;6)從隊列Q的隊頭依次取出一個初始種子測試用例c,利用上下文無關(guān)文法分析其語 法結(jié)構(gòu),得到一個解析樹T。;7)遍歷解析樹T。中每一內(nèi)結(jié)點n。,對于n。所對應(yīng)的上下文無關(guān)文法非終結(jié)符Ν。,查找 非終結(jié)符N。所生成的初始種子測試用例c中的子串S。;8)利用4)所得的與該非終結(jié)符N。名稱相同的集合中每個字符串分別替代初始 種子測試用例c的子串s。,每次得到一個新的測試用例c’,如果C’已經(jīng)在集合GEN中出現(xiàn), 則將c’丟棄;否則將C’加入到集合GEN中,并且如果C’滿足Q中入隊條件P,則同時將C’ 加入隊列Q的隊尾;9)重復(fù)步驟6) 8),直到隊列Q中的種子測試用例全部被依次取出,此時將集合GEN 中的全部元素作為測試用例輸出。
      2.如權(quán)利要求1所述的方法,其特征在于所述初始集合I中的測試用例覆蓋上下文無 關(guān)文法所有語法結(jié)構(gòu)。
      3.如權(quán)利要求2所述的方法,其特征在采用深度優(yōu)先的方法遍歷解析樹。
      4.如權(quán)利要求2所述的方法,其特征在采用廣度優(yōu)先的方法遍歷解析樹。
      5.如權(quán)利要求3或4所述的方法,其特征在于遍歷解析樹中同一父結(jié)點下的子結(jié)點時, 位于左側(cè)的子結(jié)點先于右側(cè)的子結(jié)點遍歷。
      6.如權(quán)利要求1或2所述的方法,其特征在于所述初始種子測試用例為所述初始集合 I中的合法測試用例。
      7.如權(quán)利要求1或2所述的方法,其特征在于所述入隊條件P為測試用例長度小于一設(shè)定閾值。
      8.如權(quán)利要求1或2所述的方法,其特征在于所述合法測試用例為Fuzzing測試用例。
      9.如權(quán)利要求1或2所述的方法,其特征在于所述目標(biāo)程序為以受上下文無關(guān)文法約 束的數(shù)據(jù)為輸入的軟件或系統(tǒng)。
      10.如權(quán)利要求9所述的方法,其特征在于所述軟件包括但不限于網(wǎng)絡(luò)瀏覽器軟件、 數(shù)據(jù)庫服務(wù)器系統(tǒng)軟件。
      全文摘要
      本發(fā)明公開了一種受上下文無關(guān)文法約束的測試用例生成方法,屬于軟件工程技術(shù)領(lǐng)域。本方法為首先編寫一定數(shù)量的合法測試用例,根據(jù)上下文無關(guān)文法分析其語法結(jié)構(gòu)得到解析樹,對于每種可能出現(xiàn)的語法成分,構(gòu)造該成分在已編寫測試用例中所生成的子串集合;然后遍歷解析樹,對于解析樹中的每個語法成分,使用相應(yīng)子串集合中的其它子串來替換該語法成分在當(dāng)前測試用例中生成的子串,從而得到新的結(jié)構(gòu)更復(fù)雜的測試用例。本發(fā)明有效避免了生成型數(shù)據(jù)生成方式固有的狀態(tài)空間爆炸以及難以滿足語義約束等缺陷,測試用例的生成速度快,得到的測試用例結(jié)構(gòu)更復(fù)雜且滿足語義約束;本發(fā)明可對輸入數(shù)據(jù)具備上下文無關(guān)文法約束的計算機(jī)軟件進(jìn)行安全性測試。
      文檔編號G06F11/36GK102141959SQ20111006202
      公開日2011年8月3日 申請日期2011年3月15日 優(yōu)先權(quán)日2011年3月15日
      發(fā)明者劉奇旭, 張玉清, 楊丁寧 申請人:中國科學(xué)院研究生院
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1