專利名稱:一種產(chǎn)生測試用例的方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及軟件安全性測試技術(shù)領(lǐng)域,特別涉及一種產(chǎn)生測試用例的方法及裝置。
背景技術(shù):
軟件(包括應(yīng)用程序、協(xié)議等)的安全性測試實際上是在軟件輸入空間中的一種 探測。軟件的輸入空間由該軟件的所有可能的輸入、或所有可能的輸入的組合構(gòu)成。窮舉是 驗證軟件行為正確性的一種最極端的方法,然而,窮舉對大部分案例來說不具備可操作性, 因為通常情況下,軟件程序的輸入空間非常巨大,甚至可能是無窮大。相比于窮舉的方法來 說,模糊測試(Fuzz Testing)作為一種隨機樣本方法,是一種更具可行性的黑盒測試方法。模糊測試是一種軟件測試技術(shù),該技術(shù)構(gòu)造一些隨機或半隨機的數(shù)據(jù)(稱為 fuzz,以下稱為模糊數(shù)據(jù))作為被測試軟件程序的輸入,并觀察被測試軟件程序的工作狀 況。模糊測試是檢查程序容錯性的一種重要的測試手段。如果被測軟件程序出錯(例如 崩潰了或?qū)е聝?nèi)置的斷言驗證代碼為假),就表明檢測出了缺陷。用于產(chǎn)生fuzz數(shù)據(jù)的程 序稱為模糊測試器(Fuzzers),模糊測試器是進行滲透測試或其它測試的有效工具。作為一種黑盒測試工具,模糊測試通常用于大型軟件開發(fā)項目。模糊測試被認為 能夠提高軟件的安全性,這是因為模糊測試總是能檢測出一些測試人員未能發(fā)現(xiàn)的缺陷, 這些缺陷往往會被軟件測試工程師所忽略。目前,最常用的模糊測試是基于字符的,基于字 符的模糊測試提供隨機數(shù)據(jù)流(從文件或其它數(shù)據(jù)流中提供,例如從套接字中提供)作 為被測軟件程序的輸入,基于字符的模糊測試正廣泛應(yīng)用于協(xié)議或網(wǎng)絡(luò)服務(wù)器的安全性測 試ο雖然模糊測試具有上述種種優(yōu)勢,然而,當模糊測試的測試對象為協(xié)議(當然也 包括對應(yīng)于協(xié)議的應(yīng)用或產(chǎn)品等)時,采用任意的輸入作為測試用例就稍顯不夠了。這是 因為在進行協(xié)議測試時,交互的報文(或消息)必須符合相應(yīng)的協(xié)議規(guī)范,因此,一次完 整、有效的模糊測試需要基于協(xié)議規(guī)范進行,而非基于任意的隨機輸入進行。協(xié)議規(guī)范定義了通信雙方之間所交互的報文之間的關(guān)系、以及報文的格式,例如 哪個/哪些響應(yīng)報文是對應(yīng)于給定輸入報文的。因此,只有輸入適當?shù)膱笪男蛄胁拍苁箙f(xié) 議產(chǎn)品進入隨后的相應(yīng)狀態(tài),而只有進入了這些狀態(tài),才有可能對這些狀態(tài)下協(xié)議產(chǎn)品的 行為進行測試。在不理解協(xié)議規(guī)范的相關(guān)知識的情況下,模糊測試只能采用任意的輸入作 為第一個報文來測試協(xié)議產(chǎn)品的初始狀態(tài),因此,這種模糊測試無法完整、有效地評估協(xié)議 產(chǎn)品的安全性。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明實施例提供一種產(chǎn)生測試用例的方法,以在無需理解協(xié)議規(guī)范 的相關(guān)知識的情況下,完整、有效地評估協(xié)議產(chǎn)品的安全性。本發(fā)明實施例還提供一種產(chǎn)生測試用例的裝置,以在無需理解協(xié)議規(guī)范的相關(guān)知
5識的情況下,完整、有效地評估協(xié)議產(chǎn)品的安全性。本發(fā)明實施例提供的一種產(chǎn)生測試用例的方法,用于對協(xié)議進行模糊測試,包 括A、采用協(xié)議分析器抓取并記錄協(xié)議雙方之間交互的報文;B、采用協(xié)議分析器對所述記錄的報文進行解析,得到報文的各個字段;C、根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充所述字段得到測試報文。較佳地,所述協(xié)議雙方為客戶端和服務(wù)器;在所述A之后可以進一步包括將所述記錄的報文中由客戶端發(fā)送給服務(wù)器的報 文按照發(fā)送的先后次序進行排列,得到第一合法報文序列;所述B為對所述第一合法報文序列中的報文進行解析,得到所述第一合法報文 序列中各個報文的各個字段;所述C為根據(jù)所述第一合法報文序列中各個報文的各個字段的類型,依次以相 應(yīng)類型的模糊數(shù)據(jù)填充所述字段得到對應(yīng)的測試報文,并依次以所述得到的每一個測試報 文替換所述第一合法報文序列中的對應(yīng)報文得到對應(yīng)的報文序列,將所述得到的報文序列 作為測試報文序列。進一步地,該方法可以包括預(yù)先設(shè)置需要進行模糊化的字段的類型,所述類型至 少為一種;并針對每一種類型設(shè)置相應(yīng)的模糊數(shù)據(jù);所述C可以包括Cl、將所述第一合法報文序列中的第一個報文作為當前報文,將當前報文的第一 個字段作為當前字段,將從所述第一合法報文序列中的第一個報文開始至當前報文為止的 報文序列作為當前合法報文序列;C2、判斷所述預(yù)先設(shè)置的需要進行模糊化的字段的類型中是否存在與當前字段的 類型相同的類型,若不存在,繼續(xù)執(zhí)行C3,若存在,繼續(xù)執(zhí)行C4 ;C3、判斷當前字段是否為當前報文的最后一個字段,若不是,則將當前字段的下一 個字段作為當前字段,返回C2 ;若是,繼續(xù)判斷當前報文是否為第一合法報文序列中的最 后一個報文,若是最后一個報文,則結(jié)束本方法流程,若不是最后一個報文,則將當前報文 的下一個報文作為當前報文,將當前報文的第一個字段作為當前字段,將從所述第一合法 報文序列中的第一個報文開始至當前報文為止的報文序列作為當前合法報文序列,返回 C2 ;C4、根據(jù)當前字段的類型從所述預(yù)先設(shè)置的模糊數(shù)據(jù)中確定對應(yīng)的模糊數(shù)據(jù),依 次將所述模糊數(shù)據(jù)中的每一個填充到當前報文的當前字段,得到對應(yīng)的報文,并依次以所 述得到的每一個測試報文替換所述當前合法報文序列中的當前報文得到對應(yīng)的報文序列, 將所述得到的各個報文序列作為測試報文序列,返回C3。所述C4中在得到對應(yīng)的報文之后、并在依次以所述得到的每一個測試報文替換 所述第一合法報文序列中的當前報文之前,可以進一步包括判斷所述得到的報文的長度與所述當前報文的長度是否相等,若不相等,則將所 述得到的報文的長度字段的值置為所述得到的報文的長度。在所述得到第一合法報文序列之后,可以進一步包括將所述記錄的報文中由服 務(wù)器返回給客戶端的響應(yīng)報文按照對應(yīng)于所述第一合法報文序列的順序進行排列,得到第二合法響應(yīng)序列;在所述C之后進一步包括依次將每一個測試報文序列作為當前測試報文序列, 執(zhí)行D F D、將當前測試報文序列發(fā)送給所述服務(wù)器;E、將對應(yīng)于所述當前測試報文序列的合法報文序列發(fā)送給所述服務(wù)器,并接收所 述服務(wù)器返回的響應(yīng)序列;F、根據(jù)所述第二合法響應(yīng)序列確定對應(yīng)于所述合法報文序列的合法響應(yīng)序列,判 斷所述服務(wù)器返回的響應(yīng)序列與所述合法響應(yīng)序列是否相同,若不相同,則記錄當前測試 報文序列以及所述服務(wù)器返回的響應(yīng)序列。本發(fā)明實施例提供的一種產(chǎn)生測試用例的裝置,用于對協(xié)議進行模糊測試,該裝 置包括協(xié)議分析器410和模糊測試器420,其中所述協(xié)議分析器410,用于抓取并記錄協(xié)議雙方之間交互的報文,并用于對所述記 錄的報文進行解析,得到報文的各個字段;所述模糊測試器420,用于根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充所述 字段得到測試報文。較佳地,所述協(xié)議雙方為客戶端和服務(wù)器;所述協(xié)議分析器410,還可以用于將所述記錄的報文中由客戶端發(fā)送給服務(wù)器的 報文按照發(fā)送的先后次序進行排列,得到第一合法報文序列,并用于對所述第一合法報文 序列中的報文進行解析,得到所述第一合法報文序列中各個報文的各個字段;所述模糊測試器420,還可以用于根據(jù)所述第一合法報文序列中各個報文的各個 字段的類型,依次以相應(yīng)類型的模糊數(shù)據(jù)填充所述字段得到對應(yīng)的報文,并依次以所述得 到的每一個測試報文替換所述第一合法報文序列中的對應(yīng)報文得到對應(yīng)的報文序列,將所 述得到的報文序列作為測試報文序列。較佳地,該裝置中還可以包括存儲器430,用于存儲預(yù)先設(shè)置的需要進行模糊化 的字段的類型,所述類型至少為一種;以及用于存儲針對每一種類型設(shè)置的相應(yīng)的模糊數(shù) 據(jù);所述模糊測試器420中進一步包括初始化模塊421、類型匹配模塊422、遍歷模塊 423和模糊化模塊424,其中所述初始化模塊421,用于將所述第一合法報文序列中的第一個報文作為當前報 文,將當前報文的第一個字段作為當前字段,將從所述第一合法報文序列中的第一個報文 開始至當前報文為止的報文序列作為當前合法報文序列,通知類型匹配模塊422工作;所述類型匹配模塊422,用于根據(jù)所述初始化模塊421或所述遍歷模塊423的通 知,判斷所述存儲器430中預(yù)先存儲的需要進行模糊化的字段的類型中是否存在與當前字 段的類型相同的類型,在不存在時,通知遍歷模塊423工作,在存在時,通知模糊化模塊424 工作;所述遍歷模塊423,用于根據(jù)所述類型匹配模塊422或所述模糊化模塊424的通知 判斷當前字段是否為當前報文的最后一個字段,在不是時,用于將當前字段的下一個字段 作為當前字段,通知類型匹配模塊422工作;在是時,還用于判斷當前報文是否為第一合法 報文序列中的最后一個報文,在是最后一個報文時,結(jié)束本裝置的操作,在不是最后一個報文時,用于將當前報文的下一個報文作為當前報文,將當前報文的第一個字段作為當前字 段,將從所述第一合法報文序列中的第一個報文開始至當前報文為止的報文序列作為當前 合法報文序列,通知類型匹配模塊422工作;所述模糊化模塊424,用于根據(jù)所述類型匹配模塊422的通知,并根據(jù)當前字段的 類型從所述存儲器430中獲取預(yù)先存儲的對應(yīng)于所述類型的模糊數(shù)據(jù),依次將所述模糊數(shù) 據(jù)中的每一個填充到當前報文的當前字段,得到對應(yīng)的報文,并依次以所述得到的每一個 測試報文替換所述當前合法報文序列中的當前報文得到對應(yīng)的報文序列,將所述得到的各 個報文序列作為測試報文序列,通知遍歷模塊423工作。較佳地,所述模糊化模塊424,還可以用于在得到對應(yīng)的報文之后,判斷所述得到 的報文的長度與所述當前報文的長度是否相等,在不相等時,用于將所述得到的報文的長 度字段的值置為所述得到的報文的長度。較佳地,所述協(xié)議分析器410,還可以用于將所述記錄的報文中由服務(wù)器返回給客 戶端的響應(yīng)報文按照對應(yīng)于所述第一合法報文序列的順序進行排列,得到第二合法響應(yīng)序 列;所述模糊測試器420中進一步包括測試模塊425,所述測試模塊425用于依次將每 一個測試報文序列作為當前測試報文序列發(fā)送給所述服務(wù)器;并用于將對應(yīng)于所述當前測 試報文序列的合法報文序列發(fā)送給所述服務(wù)器,接收所述服務(wù)器返回的響應(yīng)序列;還用于 根據(jù)所述第二合法響應(yīng)序列確定對應(yīng)于所述合法報文序列的合法響應(yīng)序列,判斷所述服務(wù) 器返回的響應(yīng)序列與所述合法響應(yīng)序列是否相同,在不相同時,記錄當前測試報文序列以 及所述服務(wù)器返回的響應(yīng)序列。由上述技術(shù)方案可見,本發(fā)明利用協(xié)議分析器抓取并記錄被測協(xié)議產(chǎn)品接收和發(fā) 送的合法的報文序列,并采用協(xié)議分析器對這些報文進行解析,將解析后的報文提供給模 糊測試器,由模糊測試器對解析后的報文中的某些字段進行一些改變,從而構(gòu)造出有針對 性的測試報文。由于本發(fā)明所提供的技術(shù)方案中,測試報文序列由模糊測試器根據(jù)協(xié)議分 析器所提供的解析后的報文構(gòu)造得到,無需基于對協(xié)議規(guī)范的理解人工構(gòu)造測試報文序 列,這不僅節(jié)約了大量的時間成本和人力成本,而且提高了模糊測試的有效性,是一種快 速、簡便的用于對網(wǎng)絡(luò)協(xié)議產(chǎn)品進行模糊測試的方案。
下面將通過參照附圖詳細描述本發(fā)明的示例性實施例,使本領(lǐng)域的普通技術(shù)人員 更清楚本發(fā)明的上述及其他特征和優(yōu)點,附圖中圖1為本發(fā)明產(chǎn)生測試用例的方法的流程示意圖;圖2為本發(fā)明一較佳實施例中進行模糊測試的方法的流程示意圖;圖3為本發(fā)明一較佳實施例中追蹤文件的數(shù)據(jù)結(jié)構(gòu)Caputrue_file的示意圖;圖4為本發(fā)明一較佳實施例中產(chǎn)生測試用例的裝置的組成結(jié)構(gòu)示意圖。
具體實施例方式為使本發(fā)明的目的、技術(shù)方案及優(yōu)點更加清楚明白,以下參照附圖并舉實施例,對 本發(fā)明進一步詳細說明。
雖然對于一次有效的模糊測試來說,理解協(xié)議規(guī)范的相關(guān)知識是必須的,但是,這 是一項耗時、費力的任務(wù),特別是對于復(fù)雜的協(xié)議而言。而且,它還需要花費大量的精力去 人工記錄用于測試協(xié)議產(chǎn)品不同狀態(tài)的報文序列。將協(xié)議分析器用于網(wǎng)絡(luò)故障檢測、網(wǎng)絡(luò)分析、軟件和通信協(xié)議開發(fā)、教育等領(lǐng)域由 來已久。協(xié)議分析器(也稱為網(wǎng)絡(luò)嗅探器、網(wǎng)絡(luò)分析器或報文嗅探器等)是一種計算機軟 件程序或計算機硬件,它能夠抓取并記錄流經(jīng)整個數(shù)字網(wǎng)絡(luò)或網(wǎng)絡(luò)中某一局部區(qū)域內(nèi)的數(shù) 據(jù)流。隨著數(shù)據(jù)流流經(jīng)網(wǎng)絡(luò),協(xié)議分析器抓取每一個報文,并根據(jù)相應(yīng)的規(guī)范對報文的內(nèi) 容進行解析、分析。目前,最流行的開源協(xié)議分析器包括:WireShark(也就是Ethereal)、 Tcpdump等。由于這些開源協(xié)議分析器本身已經(jīng)集成有眾多協(xié)議的規(guī)范知識,因此,開源協(xié) 議分析器不僅可以抓取流經(jīng)網(wǎng)絡(luò)的報文,而且還可以基于這些協(xié)議規(guī)范對所抓取的報文進 行解析。本發(fā)明的主要思想在于利用協(xié)議分析器抓取并記錄被測協(xié)議產(chǎn)品接收和發(fā)送 的合法的報文序列,并使用報文解析器(即經(jīng)改進之后具備報文解析功能的協(xié)議分析器) 對這些報文進行解析,將解析后的報文提供給模糊測試器,由模糊測試器對解析后的報文 中的某些字段進行一些改變,從而構(gòu)造出有針對性的測試報文。由于本發(fā)明所提供的技術(shù) 方案中,測試報文序列由模糊測試器根據(jù)協(xié)議分析器所提供的解析后的報文構(gòu)造得到,無 需基于對協(xié)議規(guī)范的理解人工構(gòu)造測試報文序列,這不僅節(jié)約了大量的時間成本和人力成 本,而且提高了模糊測試的有效性,是一種快速、簡便的用于對網(wǎng)絡(luò)協(xié)議產(chǎn)品進行模糊測試 的方案。圖1為本發(fā)明產(chǎn)生測試用例的方法的流程示意圖。參見圖1,該方法包括步驟101 采用協(xié)議分析器抓取并記錄協(xié)議雙方之間交互的報文;步驟102 采用協(xié)議分析器對所述記錄的報文進行解析,得到報文的各個字段;步驟103 根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充所述字段得到測試 報文。采用本發(fā)明圖1所示方法產(chǎn)生模糊測試的測試用例時,無需了解被測協(xié)議的協(xié)議 規(guī)范相關(guān)信息,只需根據(jù)由協(xié)議分析器解析得到的報文的各個字段的類型,以相應(yīng)類型的 模糊數(shù)據(jù)對該字段進行填充,這樣得到的報文是個別字段被模糊化了的報文,以這樣的報 文對被測協(xié)議進行模糊測試,一方面,在不具備被測協(xié)議的協(xié)議規(guī)范的相關(guān)知識的情況下 實現(xiàn)了模糊測試,另一方面,這樣的報文并非任意的隨機輸入,而是對合法報文的某些字段 進行了有針對性的改變之后得到的報文,因此能夠?qū)Ρ粶y協(xié)議的相關(guān)狀態(tài)進行測試,保證 了模糊測試的完整性和有效性。本發(fā)明所述協(xié)議雙方實際上是客戶端和服務(wù)器,由于服務(wù)器的安全性和可靠性是 保證協(xié)議產(chǎn)品正常運行的基礎(chǔ),因此,協(xié)議測試的主要測試目標是服務(wù)器。鑒于此,在構(gòu)造 測試用例時,可以對由客戶端發(fā)送給服務(wù)器的報文、以及服務(wù)器返回給客戶端的報文進行 區(qū)分,并對由客戶端發(fā)送給服務(wù)器的報文的某些字段采取本發(fā)明方法進行模糊化得到測試 報文,并用所得到的測試報文對被測服務(wù)器進行測試,從而提高模糊測試的效率。下面通過一個具體實施例對本發(fā)明產(chǎn)生測試用例的方法及利用所產(chǎn)生的測試用 例進行模糊測試的方法的具體實施方式
進行詳細說明。圖2為本發(fā)明一較佳實施例中進行模糊測試的方法的流程示意圖。本方法中,將協(xié)議雙方分別稱為客戶端和被測服務(wù)器,該客戶端和被測服務(wù)器支持同一協(xié)議,該協(xié)議為 被測協(xié)議。參見圖2,該方法包括步驟201 預(yù)先設(shè)置需要進行模糊化的字段的類型,并針對每一種類型設(shè)置相應(yīng) 的模糊數(shù)據(jù)。本步驟需要根據(jù)實際應(yīng)用的需要設(shè)置需要進行模糊化的字段的類型,以使所產(chǎn)生 的測試用例更具針對性。這里,用戶無需理解報文中每個字段的語義,只需定義用戶所關(guān)注 的字段的類型名即可。例如字段長度、字符串、字節(jié)串等。用戶所關(guān)注的這些字段的類型 名可以在配置文件中進行設(shè)置。如此,報文解析器在解析當前報文時,只需根據(jù)配置文件查 看報文字段的類型名即可。當然,如果沒有進行本步驟的設(shè)置,本發(fā)明方法根據(jù)報文中每一 個字段的類型以相應(yīng)類型的模糊數(shù)據(jù)填充該字段也可以實現(xiàn)本發(fā)明的發(fā)明目的。本步驟中,在設(shè)置模糊數(shù)據(jù)時,可以指定一個數(shù)據(jù)庫、或一個文件或其他數(shù)據(jù)源作 為模糊數(shù)據(jù)。步驟202 采用協(xié)議分析器抓取并記錄某一客戶端與被測服務(wù)器之間交互的報文。本步驟中,為了覆蓋被測服務(wù)器的各種不同的協(xié)議狀態(tài),需要令客戶端以盡可能 多的、各種不同的方式接入被測服務(wù)器。例如以初始狀態(tài)時、數(shù)據(jù)傳輸時、結(jié)束通信時等多 種方式向被測服務(wù)器發(fā)送對應(yīng)的報文。由于此時的客戶端與被測服務(wù)器之間的交互是基于雙方所運行的協(xié)議正常地進 行,因此,該客戶端與被測服務(wù)器之間交互的報文為合法的報文,這些合法的報文序列必將 令被測服務(wù)器遍歷協(xié)議規(guī)范所定義的各種協(xié)議狀態(tài)。因此,一個報文序列可被當作模糊測 試中的測試樣本,用于構(gòu)造符合協(xié)議規(guī)范的報文序列,去探測和測試被測服務(wù)器的不同協(xié) 議狀態(tài)。本步驟中,所抓取的這些報文序列可由協(xié)議分析器當作追蹤文件保存下來。步驟203 協(xié)議分析器將所記錄的報文中由客戶端發(fā)送給服務(wù)器的報文按照發(fā)送 的先后次序進行排列,得到第一合法報文序列;將所記錄的報文中由服務(wù)器返回給客戶端 的響應(yīng)報文按照對應(yīng)于該第一合法報文序列的順序進行排列,得到第二合法響應(yīng)序列。在模糊測試中,經(jīng)改進之后具備報文解析功能的協(xié)議分析器充當報文解析器的角 色,用于解析追蹤文件以獲取報文序列。由于追蹤文件中既包含所有自客戶端發(fā)出的報文, 也包含所有自被測服務(wù)器發(fā)出的報文,而只有從客戶端發(fā)送給被測服務(wù)器的報文可用于本 發(fā)明的模糊測試,因此,報文解析器需要從追蹤文件中找出從客戶端發(fā)送給被測服務(wù)器的 報文,并將它們按照如(1)所示形式進行排列P1, P2, · · ·,Pm (1)(1)就是第一合法報文序列,在(1)中,P1是客戶端發(fā)給被測服務(wù)器的第一個報 文,P2是客戶端發(fā)給被測服務(wù)器的第二個報文,依此類推,Pffl是客戶端發(fā)給被測服務(wù)器的第 m個報文。同理,可將被測服務(wù)器返回給客戶端的響應(yīng)報文按照如(2)所示形式進行排列R1, R2, ... , Rm(2)(2)就是第二合法響應(yīng)序列,在(2)中,R1是被測服務(wù)器返回給客戶端的對應(yīng)于P1 的響應(yīng)報文,R2是被測服務(wù)器返回給客戶端的對應(yīng)于P2的響應(yīng)報文,依此類推,Rffl是被測服 務(wù)器返回給客戶端的對應(yīng)于Pm的響應(yīng)報文。
10
下面以Wireshark為例,說明在實際應(yīng)用中如何從追蹤文件中得到如(1)和(2) 所示的報文序列。由于Wireshark是一種開源的協(xié)議分析器,因此,可以將Wireshark中一些與本 發(fā)明不相關(guān)的組件去除,而只保留與本發(fā)明有關(guān)的組件,例如可以保留用于解析追蹤文件 以獲取報文序列的組件?;赪ireshark中的可解析各種協(xié)議的報文的解析器,報文解析 器將追蹤文件導(dǎo)入如圖3所示的數(shù)據(jù)結(jié)構(gòu)Caputrue_file中。該數(shù)據(jù)結(jié)構(gòu)Caputrue_file 用于以分級的方式存儲協(xié)議頭和各字段。由于Wireshark中集成有上百種協(xié)議的解析器功 能,這些解析器可以根據(jù)給定的協(xié)議將報文解析到字段級別,圖3中,結(jié)構(gòu)epan_diSSeCt_t 示出了哪種協(xié)議需要被分析。追蹤文件中的每一個報文將被存儲為pr0t0_tree的結(jié)構(gòu),在 該結(jié)構(gòu)中,每一個字段以field_info這種數(shù)據(jù)結(jié)構(gòu)的形式表示,并被存儲為樹型結(jié)構(gòu)。在 每一個field_inf0中,header_field_inf0用于描述字段屬性信息(例如字段名、字段類 型等),fvalUe_t用于存儲實際的字段值。這里,對于圖3中與本發(fā)明無關(guān)的數(shù)據(jù)結(jié)構(gòu)未進 行詳細說明?;赪ireshark的上述信息,報文解析器可以根據(jù)每個報文的地址字段(例如 IP地址字段)將由客戶端發(fā)送給服務(wù)器的報文、以及由服務(wù)器返回給客戶端的報文區(qū)分開 來,并按照先后次序排列為如⑴和⑵所示的報文序列。步驟204 對第一合法報文序列中的報文進行解析,得到第一合法報文序列中各 個報文的各個字段。由于協(xié)議分析器集成了對應(yīng)于協(xié)議報文的格式信息,因此,協(xié)議分析器可以作為 報文解析器對當前報文進行解析得到該報文的每一個字段。以上為本發(fā)明產(chǎn)生測試用例的預(yù)備操作,以下將根據(jù)第一合法報文序列中的每一 個報文Pi, i = 1,2,…,m,進行產(chǎn)生測試用例的操作。步驟205 進行初始化設(shè)置,即將第一合法報文序列中的第一個報文P1作為當前 報文,將當前報文的第一個字段作為當前字段,將從第一合法報文序列中的第一個報文開 始至當前報文為止的報文序列作為當前合法報文序列。步驟206 判斷預(yù)先設(shè)置的需要進行模糊化的字段的類型中是否存在與當前字段 的類型相同的類型,若不存在,繼續(xù)執(zhí)行步驟207,若存在,跳到步驟211。本步驟中,可以根據(jù)預(yù)先設(shè)置的需要進行模糊化的字段的類型與當前字段的類型 進行比較,從而確定該字段是否需要進行模糊化,以用于進行模糊測試。對于需要進行模 糊化的字段,跳到步驟211進行模糊化,對于不需要進行模糊化的字段,無需進行模糊化操 作,直接進入步驟207,對下一個字段或下一個報文進行判斷。步驟207 判斷當前字段是否為當前報文的最后一個字段,若不是當前報文的最 后一個字段,則繼續(xù)步驟208,若是當前報文的最后一個字段,繼續(xù)步驟209。步驟208 將當前字段的下一個字段作為當前字段,返回步驟206。步驟209 判斷當前報文是否為第一合法報文序列中的最后一個報文,若是最后 一個報文,結(jié)束產(chǎn)生測試用例的操作,跳到步驟212,繼續(xù)進行采用測試用例進行模糊測試 的操作,若不是最后一個報文,則繼續(xù)步驟210。本步驟中,若當前報文已經(jīng)是第一合法報文序列的最后一個報文、且當前字段已 經(jīng)是當前報文的最后一個字段,表明已對第一合法報文序列的各個報文中的各個可被模糊化的字段進行了模糊數(shù)據(jù)的填充,以產(chǎn)生了足夠多的符合條件的測試用例,因此,可以結(jié)束 產(chǎn)生測試用例的操作,繼續(xù)進行采用測試用例進行模糊測試的操作。步驟210 將當前報文的下一個報文作為當前報文,將當前報文的第一個字段作 為當前字段,將從第一合法報文序列中的第一個報文開始至當前報文為止的報文序列作為 當前合法報文序列,返回步驟206。舉例而言,假設(shè)當前報文為Pi,那么當前合法報文序列就是P1, P2,... , Pi。步驟211 根據(jù)當前字段的類型從預(yù)先設(shè)置的模糊數(shù)據(jù)中確定對應(yīng)的模糊數(shù)據(jù), 依次將該模糊數(shù)據(jù)中的每一個填充到當前報文的當前字段,得到對應(yīng)的報文,并依次以所 得到的每一個測試報文替換當前合法報文序列中的當前報文得到對應(yīng)的報文序列,將得到 的各個報文序列作為測試報文序列,返回步驟207。本步驟中,如果當前報文的當前字段的類型名與預(yù)設(shè)于配置文件中的某一個類型 名匹配,則需要對該當前字段進行模糊數(shù)據(jù)填充。具體而言假設(shè)當前報文為Pi,模糊測試 器將首先從預(yù)設(shè)的模糊數(shù)據(jù)中(例如一個預(yù)設(shè)的數(shù)據(jù)庫或文件中)選取所有符合該類型 的測試用例,然后對于每一個測試用例,將其填充到當前報文的當前字段中得到測試報文 Pi',以所得到的每一個Pi'替換當前合法報文序列中的當前報文Pi即可得到一個新的報文 序列,該報文序列就是本發(fā)明的測試報文序列。在必要時,模糊測試器可能需要對報文P/的長度字段進行適當?shù)男薷?,因為測試 用例的長度可能與Pi中該字段的原始內(nèi)容的長度不相等。具體來說,就是判斷所得到的報 文的長度與當前報文的長度是否相等,若不相等,則將所得到的報文的長度字段的值置為 所得到的報文的長度。通過上述步驟,產(chǎn)生了大量的測試報文序列,下面可以采用這些測試報文序列對 被測服務(wù)器進行測試。具體而言,在進行測試時,可以依次將每一個測試報文序列作為當前 測試報文序列,執(zhí)行步驟212 步驟214。步驟212 模糊測試器向被測服務(wù)器發(fā)送當前測試報文序列。本步驟中,假設(shè)當前測試報文序列為P1, P2, ... , Ph,Pi'。步驟213 將對應(yīng)于該當前測試報文序列的合法報文序列發(fā)送給被測服務(wù)器,并 接收被測服務(wù)器返回的響應(yīng)序列。本步驟中,模糊測試器可以啟動與被測服務(wù)器的另一個連接,并通過該連接向被 測服務(wù)器發(fā)送諸如P1, P2,...,Pi-!, Pi此類的正確的探測報文序列,該探測報文序列是合法 的報文序列。步驟214 判斷被測服務(wù)器是否返回正確的響應(yīng)報文,若是,表明被測服務(wù)器依然 操作正常,若不是,則表明被測服務(wù)器在當前測試報文序列的測試下出現(xiàn)了異常,記錄當前 測試報文序列以及所述服務(wù)器返回的響應(yīng)序列。本步驟中,可以根據(jù)第二合法響應(yīng)報文確定對應(yīng)于P1, P2, ... , Ph,Pi的正確的響 應(yīng)報文應(yīng)當為R1;R2,...,Ri,如果被測服務(wù)器沒有正常響應(yīng)探測報文序列,表明被測服務(wù)器 在當前測試報文序列的攻擊下出現(xiàn)了異常狀態(tài),模糊測試器將該測試報文序列P1, P2,..., Ρη,Ρ/作為能夠觸發(fā)被測服務(wù)器的安全漏洞的報文序列進行保存,以供進一步分析。然后, 重啟被測服務(wù)器以進行進一步測試,并返回步驟212對下一個測試用例在Pi報文的當前可 模糊化的字段進行嘗試。如果被測服務(wù)器正常響應(yīng)了探測報文序列,則返回步驟212對下
12一個測試用例在Pi報文的當前可模糊化的字段進行嘗試。如果所有測試用例均以嘗試完 畢,返回步驟212對當前報文Pi的下一個可模糊化的字段進行嘗試。在對當前報文所有可模糊化的字段采用所有測試用例進行測試之后,對當前報文 的下一個報文進行測試。如果每一個報文均已被測試,則結(jié)束模糊測試,并報告所發(fā)現(xiàn)的安 全漏洞。對應(yīng)于上述方法,本發(fā)明還公開了一種產(chǎn)生測試用例的裝置,該裝置用于對協(xié)議 進行模糊測試。圖4為本發(fā)明一較佳實施例中產(chǎn)生測試用例的裝置的組成結(jié)構(gòu)示意圖。圖 4中的裝置包括協(xié)議分析器(410)和模糊測試器(420),其中協(xié)議分析器(410),用于抓取并記錄協(xié)議雙方之間交互的報文,并用于對所述記錄 的報文進行解析,得到報文的各個字段;模糊測試器(420),用于根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充所述字 段得到測試報文。較佳地,協(xié)議雙方為客戶端和服務(wù)器;圖4所示裝置中的協(xié)議分析器(410),還用于將所記錄的報文中由客戶端發(fā)送給 服務(wù)器的報文按照發(fā)送的先后次序進行排列,得到第一合法報文序列,并用于對該第一合 法報文序列中的報文進行解析,得到該第一合法報文序列中各個報文的各個字段;相應(yīng)地,圖4所示裝置中的模糊測試器(420),還用于根據(jù)第一合法報文序列中各 個報文的各個字段的類型,依次以相應(yīng)類型的模糊數(shù)據(jù)填充該字段得到對應(yīng)的報文,并依 次以所得到的每一個測試報文替換該第一合法報文序列中的對應(yīng)報文得到對應(yīng)的報文序 列,將所得到的報文序列作為測試報文序列。圖4所示裝置中還可以包括存儲器(430),用于存儲預(yù)先設(shè)置的需要進行模糊化 的字段的類型,所設(shè)置的類型至少為一種;以及用于存儲針對每一種類型設(shè)置的相應(yīng)的模 糊數(shù)據(jù);模糊測試器(420)中可以進一步包括初始化模塊(421)、類型匹配模塊(422)、遍 歷模塊(423)和模糊化模塊(424),其中初始化模塊(421),用于將第一合法報文序列中的第一個報文作為當前報文,將當 前報文的第一個字段作為當前字段,將從第一合法報文序列中的第一個報文開始至當前報 文為止的報文序列作為當前合法報文序列,通知類型匹配模塊(422)工作;類型匹配模塊(422),用于根據(jù)初始化模塊(421)或遍歷模塊(423)的通知,判斷 存儲器(430)中預(yù)先存儲的需要進行模糊化的字段的類型中是否存在與當前字段的類型 相同的類型,在不存在時,通知遍歷模塊(423)工作,在存在時,通知模糊化模塊(424)工 作;遍歷模塊(423),用于根據(jù)類型匹配模塊(422)或模糊化模塊(424)的通知判斷 當前字段是否為當前報文的最后一個字段,在不是時,用于將當前字段的下一個字段作為 當前字段,通知類型匹配模塊(422)工作;在是時,還用于判斷當前報文是否為第一合法報 文序列中的最后一個報文,在是最后一個報文時,結(jié)束本裝置的操作,在不是最后一個報文 時,用于將當前報文的下一個報文作為當前報文,將當前報文的第一個字段作為當前字段, 將從第一合法報文序列中的第一個報文開始至當前報文為止的報文序列作為當前合法報 文序列,通知類型匹配模塊(422)工作;
模糊化模塊(424),用于根據(jù)類型匹配模塊(422)的通知,并根據(jù)當前字段的類型 從存儲器(430)中獲取預(yù)先存儲的對應(yīng)于該類型的模糊數(shù)據(jù),依次將該模糊數(shù)據(jù)中的每一 個填充到當前報文的當前字段,得到對應(yīng)的報文,并依次以所得到的每一個測試報文替換 該當前合法報文序列中的當前報文得到對應(yīng)的報文序列,將所得到的各個報文序列作為測 試報文序列,通知遍歷模塊(423)工作。圖4所示裝置中的模糊化模塊(424),還用于在得到對應(yīng)的報文之后,判斷所得到 的報文的長度與當前報文的長度是否相等,在不相等時,用于將所得到的報文的長度字段 的值置為所得到的報文的長度。圖4所示裝置中,協(xié)議分析器(410),還用于將所記錄的報文中由服務(wù)器返回給客 戶端的響應(yīng)報文按照對應(yīng)于第一合法報文序列的順序進行排列,得到第二合法響應(yīng)序列;模糊測試器(420)中進一步包括測試模塊(425),所述測試模塊(425)用于依次將 每一個測試報文序列作為當前測試報文序列發(fā)送給服務(wù)器;并用于將對應(yīng)于當前測試報文 序列的合法報文序列發(fā)送給服務(wù)器,接收服務(wù)器返回的響應(yīng)序列;還用于根據(jù)第二合法響 應(yīng)序列確定對應(yīng)于該合法報文序列的合法響應(yīng)序列,判斷服務(wù)器返回的響應(yīng)序列與所述合 法響應(yīng)序列是否相同,在不相同時,記錄當前測試報文序列以及服務(wù)器返回的響應(yīng)序列。由上述實施例可見,本發(fā)明利用協(xié)議分析器抓取并記錄被測協(xié)議產(chǎn)品接收和發(fā)送 的合法的報文序列,并采用協(xié)議分析器對這些報文進行解析,將解析后的報文提供給模糊 測試器,由模糊測試器對解析后的報文中的某些字段進行一些改變,從而構(gòu)造出有針對性 的測試報文。由于本發(fā)明所提供的技術(shù)方案中,測試報文序列由模糊測試器根據(jù)協(xié)議分析 器所提供的解析后的報文構(gòu)造得到,無需基于對協(xié)議規(guī)范的理解人工構(gòu)造測試報文序列, 這不僅節(jié)約了大量的時間成本和人力成本,而且提高了模糊測試的有效性,是一種快速、簡 便的用于對網(wǎng)絡(luò)協(xié)議產(chǎn)品進行模糊測試的方案。以上所述僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。凡在 本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換、改進等,均應(yīng)包含在本發(fā)明的保護范 圍之內(nèi)。
權(quán)利要求
一種產(chǎn)生測試用例的方法,用于對協(xié)議進行模糊測試,其特征在于,包括A、采用協(xié)議分析器抓取并記錄協(xié)議雙方之間交互的報文;B、采用協(xié)議分析器對所述記錄的報文進行解析,得到報文的各個字段;C、根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充所述字段得到測試報文。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于所述協(xié)議雙方為客戶端和服務(wù)器;在所述A之后進一步包括將所述記錄的報文中由客戶端發(fā)送給服務(wù)器的報文按照發(fā) 送的先后次序進行排列,得到第一合法報文序列;所述B為對所述第一合法報文序列中的報文進行解析,得到所述第一合法報文序列 中各個報文的各個字段;所述C為根據(jù)所述第一合法報文序列中各個報文的各個字段的類型,依次以相應(yīng)類 型的模糊數(shù)據(jù)填充所述字段得到對應(yīng)的測試報文,并依次以所述得到的每一個測試報文替 換所述第一合法報文序列中的對應(yīng)報文得到對應(yīng)的報文序列,將所述得到的報文序列作為 測試報文序列。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,該方法進一步包括預(yù)先設(shè)置需要進行模 糊化的字段的類型,所述類型至少為一種;并針對每一種類型設(shè)置相應(yīng)的模糊數(shù)據(jù);所述C包括Cl、將所述第一合法報文序列中的第一個報文作為當前報文,將當前報文的第一個字 段作為當前字段,將從所述第一合法報文序列中的第一個報文開始至當前報文為止的報文 序列作為當前合法報文序列;C2、判斷所述預(yù)先設(shè)置的需要進行模糊化的字段的類型中是否存在與當前字段的類型 相同的類型,若不存在,繼續(xù)執(zhí)行C3,若存在,繼續(xù)執(zhí)行C4 ;C3、判斷當前字段是否為當前報文的最后一個字段,若不是,則將當前字段的下一個字 段作為當前字段,返回C2 ;若是,繼續(xù)判斷當前報文是否為第一合法報文序列中的最后一 個報文,若是最后一個報文,則結(jié)束本方法流程,若不是最后一個報文,則將當前報文的下 一個報文作為當前報文,將當前報文的第一個字段作為當前字段,將從所述第一合法報文 序列中的第一個報文開始至當前報文為止的報文序列作為當前合法報文序列,返回C2 ;C4、根據(jù)當前字段的類型從所述預(yù)先設(shè)置的模糊數(shù)據(jù)中確定對應(yīng)的模糊數(shù)據(jù),依次將 所述模糊數(shù)據(jù)中的每一個填充到當前報文的當前字段,得到對應(yīng)的報文,并依次以所述得 到的每一個測試報文替換所述當前合法報文序列中的當前報文得到對應(yīng)的報文序列,將所 述得到的各個報文序列作為測試報文序列,返回C3。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,所述C4中在得到對應(yīng)的報文之后、并在依 次以所述得到的每一個測試報文替換所述第一合法報文序列中的當前報文之前,進一步包 括判斷所述得到的報文的長度與所述當前報文的長度是否相等,若不相等,則將所述得 到的報文的長度字段的值置為所述得到的報文的長度。
5.根據(jù)權(quán)利要求2至4任一項所述的方法,其特征在于在所述得到第一合法報文序列之后,進一步包括將所述記錄的報文中由服務(wù)器返回 給客戶端的響應(yīng)報文按照對應(yīng)于所述第一合法報文序列的順序進行排列,得到第二合法響應(yīng)序列;在所述C之后進一步包括依次將每一個測試報文序列作為當前測試報文序列,執(zhí)行 D F D、將當前測試報文序列發(fā)送給所述服務(wù)器;E、將對應(yīng)于所述當前測試報文序列的合法報文序列發(fā)送給所述服務(wù)器,并接收所述服 務(wù)器返回的響應(yīng)序列;F、根據(jù)所述第二合法響應(yīng)序列確定對應(yīng)于所述合法報文序列的合法響應(yīng)序列,判斷所 述服務(wù)器返回的響應(yīng)序列與所述合法響應(yīng)序列是否相同,若不相同,則記錄當前測試報文 序列以及所述服務(wù)器返回的響應(yīng)序列。
6.一種產(chǎn)生測試用例的裝置,用于對協(xié)議進行模糊測試,其特征在于,該裝置包括協(xié) 議分析器410和模糊測試器420,其中所述協(xié)議分析器410,用于抓取并記錄協(xié)議雙方之間交互的報文,并用于對所述記錄的 報文進行解析,得到報文的各個字段;所述模糊測試器420,用于根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充所述字段 得到測試報文。
7.根據(jù)權(quán)利要求6所述的裝置,其特征在于所述協(xié)議雙方為客戶端和服務(wù)器;所述協(xié)議分析器410,還用于將所述記錄的報文中由客戶端發(fā)送給服務(wù)器的報文按照 發(fā)送的先后次序進行排列,得到第一合法報文序列,并用于對所述第一合法報文序列中的 報文進行解析,得到所述第一合法報文序列中各個報文的各個字段;所述模糊測試器420,還用于根據(jù)所述第一合法報文序列中各個報文的各個字段的類 型,依次以相應(yīng)類型的模糊數(shù)據(jù)填充所述字段得到對應(yīng)的報文,并依次以所述得到的每一 個測試報文替換所述第一合法報文序列中的對應(yīng)報文得到對應(yīng)的報文序列,將所述得到的 報文序列作為測試報文序列。
8.根據(jù)權(quán)利要求7所述的裝置,其特征在于,該裝置中還包括存儲器430,用于存儲預(yù) 先設(shè)置的需要進行模糊化的字段的類型,所述類型至少為一種;以及用于存儲針對每一種 類型設(shè)置的相應(yīng)的模糊數(shù)據(jù);所述模糊測試器420中進一步包括初始化模塊421、類型匹配模塊422、遍歷模塊423 和模糊化模塊424,其中所述初始化模塊421,用于將所述第一合法報文序列中的第一個報文作為當前報文,將 當前報文的第一個字段作為當前字段,將從所述第一合法報文序列中的第一個報文開始至 當前報文為止的報文序列作為當前合法報文序列,通知類型匹配模塊422工作;所述類型匹配模塊422,用于根據(jù)所述初始化模塊421或所述遍歷模塊423的通知,判 斷所述存儲器430中預(yù)先存儲的需要進行模糊化的字段的類型中是否存在與當前字段的 類型相同的類型,在不存在時,通知遍歷模塊423工作,在存在時,通知模糊化模塊424工 作;所述遍歷模塊423,用于根據(jù)所述類型匹配模塊422或所述模糊化模塊424的通知判 斷當前字段是否為當前報文的最后一個字段,在不是時,用于將當前字段的下一個字段作 為當前字段,通知類型匹配模塊422工作;在是時,還用于判斷當前報文是否為第一合法報文序列中的最后一個報文,在是最后一個報文時,結(jié)束本裝置的操作,在不是最后一個報文 時,用于將當前報文的下一個報文作為當前報文,將當前報文的第一個字段作為當前字段, 將從所述第一合法報文序列中的第一個報文開始至當前報文為止的報文序列作為當前合 法報文序列,通知類型匹配模塊422工作;所述模糊化模塊424,用于根據(jù)所述類型匹配模塊422的通知,并根據(jù)當前字段的類型 從所述存儲器430中獲取預(yù)先存儲的對應(yīng)于所述類型的模糊數(shù)據(jù),依次將所述模糊數(shù)據(jù)中 的每一個填充到當前報文的當前字段,得到對應(yīng)的報文,并依次以所述得到的每一個測試 報文替換所述當前合法報文序列中的當前報文得到對應(yīng)的報文序列,將所述得到的各個報 文序列作為測試報文序列,通知遍歷模塊423工作。
9.根據(jù)權(quán)利要求8所述的裝置,其特征在于所述模糊化模塊424,還用于在得到對應(yīng)的報文之后,判斷所述得到的報文的長度與所 述當前報文的長度是否相等,在不相等時,用于將所述得到的報文的長度字段的值置為所 述得到的報文的長度。
10.根據(jù)權(quán)利要求7至9任一項所述的裝置,其特征在于所述協(xié)議分析器410,還用于將所述記錄的報文中由服務(wù)器返回給客戶端的響應(yīng)報文 按照對應(yīng)于所述第一合法報文序列的順序進行排列,得到第二合法響應(yīng)序列;所述模糊測試器420中進一步包括測試模塊425,所述測試模塊425用于依次將每一個 測試報文序列作為當前測試報文序列發(fā)送給所述服務(wù)器;并用于將對應(yīng)于所述當前測試報 文序列的合法報文序列發(fā)送給所述服務(wù)器,接收所述服務(wù)器返回的響應(yīng)序列;還用于根據(jù) 所述第二合法響應(yīng)序列確定對應(yīng)于所述合法報文序列的合法響應(yīng)序列,判斷所述服務(wù)器返 回的響應(yīng)序列與所述合法響應(yīng)序列是否相同,在不相同時,記錄當前測試報文序列以及所 述服務(wù)器返回的響應(yīng)序列。
全文摘要
本發(fā)明公開了一種產(chǎn)生測試用例的方法,該方法用于對協(xié)議進行模糊測試,該方法首先采用協(xié)議分析器抓取并記錄協(xié)議雙方之間交互的報文;然后采用協(xié)議分析器對所記錄的報文進行解析,得到報文的各個字段;最后根據(jù)各個字段的類型,以相應(yīng)類型的模糊數(shù)據(jù)填充該字段得到測試報文。本發(fā)明還公開了一種產(chǎn)生測試用例的系統(tǒng)。應(yīng)用本發(fā)明能夠在無需理解協(xié)議規(guī)范的相關(guān)知識的情況下,產(chǎn)生完整有效的測試用例,以完整、有效地評估協(xié)議產(chǎn)品的安全性。
文檔編號H04L29/06GK101902367SQ20091014382
公開日2010年12月1日 申請日期2009年5月31日 優(yōu)先權(quán)日2009年5月31日
發(fā)明者唐文 申請人:西門子(中國)有限公司