• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于字段感知的文本協(xié)議灰盒模糊測試方法

      2024-10-14 00:00:00孫語韜徐向華
      計算機(jī)應(yīng)用研究 2024年10期

      摘 要:基于變異的灰盒協(xié)議模糊測試方法使用便捷、可擴(kuò)展性好,但缺乏協(xié)議報文格式信息,只能對報文整體進(jìn)行變異以產(chǎn)生測試用例,導(dǎo)致生成的大部分測試報文會被被測協(xié)議實現(xiàn)直接拒絕,嚴(yán)重影響測試效率。針對這一問題,提出了基于字段感知的文本協(xié)議模糊測試方法。該方法在基于變異的協(xié)議模糊測試中加入了模板學(xué)習(xí)的概念,使用分隔符劃分報文字段,使用字段字典獲取每個字段的合法取值;然后,針對劃分后的報文,設(shè)計了多種字段級的變異策略,并根據(jù)每個字段可能的取值數(shù)量和覆蓋率反饋計算相應(yīng)的字段變異能量;此外,還利用對報文進(jìn)行字段劃分的結(jié)果,對被測協(xié)議實現(xiàn)的狀態(tài)進(jìn)行更細(xì)粒度的刻畫。實驗結(jié)果表明,該方法可以提高經(jīng)典的基于變異的協(xié)議模糊測試框架AFLNET產(chǎn)生的可被被測協(xié)議實現(xiàn)接受的測試用例的比例,進(jìn)而將測試效率提高到5倍以上。這表明基于變異的協(xié)議模糊測試方法普遍存在的可被接受的測試用例比例過低的問題確實會影響最終的測試效率,改善測試用例的被接受率可以大幅提高測試效率。

      關(guān)鍵詞:網(wǎng)絡(luò)安全; 協(xié)議測試; 模糊測試; 字段感知; 字段變異能量度量; 細(xì)粒度狀態(tài)刻畫

      中圖分類號:TP311 文獻(xiàn)標(biāo)志碼:A

      文章編號:1001-3695(2024)10-032-3110-09

      doi:10.19734/j.issn.1001-3695.2024.01.0035

      Greybox fuzzing method for text protocol based on field perception

      Sun Yutao, Xu Xianghua

      (School of Computer Science, Hangzhou Dianzi University, Hangzhou 310018, China)

      Abstract:The mutation-based grey-box protocol fuzzing methods are convenient and highly scalable. However, they lack the message format information of the protocol under test, resulting in most of the messages in test cases being rejected by the target protocol implementation, severely affecting the testing efficiency. To address this issue, this paper proposed a greybox fuzzing method for text protocol based on field perception. This method incorporated the concept of template learning into mutation-based protocol fuzzing. It used delimiters to segment message fields and utilized a field dictionary to obtain valid values for each field. Subsequently, this paper designed multiple field-level mutation strategies for the segmented messages and calculated the corresponding field mutation energy based on the number of valid values and coverage feedback. Moreover, this approach leveraged the results of message field segmentation to provide a more fine-grained characterization of the protocol implementation state. Experimental results demonstrate that this method can improve the proportion of test cases accepted by the target protocol implementation generated by the classic mutation-based protocol fuzzing framework AFLNET, thereby increasing testing efficiency over five times. It proves that the low acceptance rate of test cases in the commonly used mutation-based protocol fuzzing methods decrease the overall testing efficiency, and increasing the test case acceptance rate can improve the testing efficiency significantly.

      Key words:network security; protocol testing; fuzzing; field perception; field’s mutation energy measurement; fine-grained state characterization

      0 引言

      協(xié)議模糊測試?yán)^承了軟件模糊測試高效、易用的特點(diǎn),并針對有狀態(tài)協(xié)議添加了狀態(tài)選擇機(jī)制[1,2],是目前流行的網(wǎng)絡(luò)協(xié)議測試技術(shù)之一[3],在網(wǎng)絡(luò)安全問題日益突出的今天[4~7]顯得尤為重要。根據(jù)生成測試用例的方式這一關(guān)鍵問題,可以將協(xié)議模糊測試大體分為基于生成的協(xié)議模糊測試和基于變異的協(xié)議模糊測試兩類。其中,基于生成的協(xié)議模糊測試[8,9]需要人工編寫協(xié)議報文模板和狀態(tài)機(jī),以生成符合協(xié)議規(guī)范的測試用例。然而,編寫協(xié)議報文模板和狀態(tài)機(jī)的工作量巨大,且很難保證人工編寫的結(jié)果完全準(zhǔn)確[10],導(dǎo)致此類模糊測試方法實際使用并不方便。而基于變異的協(xié)議模糊測試[11~17]使用被測協(xié)議實現(xiàn)的真實流量或人工構(gòu)造的部分報文作為初始種子,通過對其進(jìn)行變異生成測試用例,不需要人工編寫協(xié)議報文模板和狀態(tài)機(jī),是協(xié)議模糊測試最新的研究熱點(diǎn)。

      AFLNET[11]是首個基于變異的協(xié)議模糊測試框架[18],也是當(dāng)前各個基于變異的協(xié)議模糊器的基礎(chǔ)。它使用被測協(xié)議實現(xiàn)的真實流量作為初始種子,并通過對種子的變異產(chǎn)生測試用例。同時,它將服務(wù)器每次返回的響應(yīng)碼作為此時的協(xié)議實現(xiàn)狀態(tài),在測試過程中動態(tài)構(gòu)建被測協(xié)議實現(xiàn)的狀態(tài)機(jī)。在此基礎(chǔ)上,文獻(xiàn)[13,16]使用快照保存被測協(xié)議實現(xiàn)的各個狀態(tài),避免重復(fù)發(fā)送前綴報文序列的開銷,以提高協(xié)議測試的吞吐量。針對使用響應(yīng)碼表示協(xié)議實現(xiàn)狀態(tài)可能導(dǎo)致狀態(tài)機(jī)構(gòu)建不準(zhǔn)確的問題,文獻(xiàn)[14,15]提出了使用協(xié)議實現(xiàn)中的特定長期變量的哈希值來更為準(zhǔn)確地刻畫協(xié)議狀態(tài)的方法,以此改進(jìn)基于變異的協(xié)議模糊的測試性能。

      然而,基于變異的協(xié)議模糊測試方法缺少被測協(xié)議的報文格式信息,只能識別報文的結(jié)束位置。對于每個報文,此類模糊測試方法則只會將其視為一個完整的字節(jié)流。在產(chǎn)生測試用例時,此類模糊測試工具采用類似于軟件模糊測試中的變異方法,將變異算子直接作用于整個報文。這樣得到的測試用例有很大概率與種子中的原始報文差異巨大,不符合被測協(xié)議實現(xiàn)的基本要求,導(dǎo)致該測試用例無法通過被測協(xié)議實現(xiàn)的報文解析,被直接丟棄。此類測試用例的比例過高,顯然會影響協(xié)議模糊測試的整體效率。

      針對基于變異的協(xié)議模糊測試產(chǎn)生的測試用例中能被被測協(xié)議實現(xiàn)接受的比例過低的問題,本文將基于生成的協(xié)議模糊測試中的部分思想引入到基于變異的協(xié)議模糊測試中,提出了一種基于字段感知的文本協(xié)議灰盒模糊測試方法。為了提高產(chǎn)生的測試用例符合被測協(xié)議實現(xiàn)的基本要求的概率,該方法使用分隔符對種子中的每個報文進(jìn)行字段劃分,并為劃分得到的每個字段分別建立一個字段字典,用于記錄該字段出現(xiàn)過的合法取值及每個取值在種子中出現(xiàn)的次數(shù)。然后,為每個字段分別計算字段變異能量,減少對不適合進(jìn)行隨機(jī)變異的字段進(jìn)行隨機(jī)變異的次數(shù)。在上述改進(jìn)的基礎(chǔ)上,為了緩解基于變異的協(xié)議模糊測試的典型工作AFLNET所存在的狀態(tài)劃分粒度過粗的問題,利用字段劃分的結(jié)果對協(xié)議狀態(tài)進(jìn)行細(xì)粒度的刻畫,為模糊測試提供更準(zhǔn)確的引導(dǎo)。

      本文的主要貢獻(xiàn)如下:

      a)提出了基于字段感知的文本協(xié)議模糊測試方法。使用字段感知方法,學(xué)習(xí)協(xié)議模板,提高測試用例接受率。在此基礎(chǔ)上,使用字段級變異策略、字段能量度量方法和基于請求消息類型的狀態(tài)刻畫方法,提高測試效率。

      b)實現(xiàn)了一個基于字段感知的文本協(xié)議模糊測試方法的原型模糊器FPFuzzer(field perception fuzzer),并評估其效果。實驗表明,F(xiàn)PFuzzer產(chǎn)生的測試用例的接受率可以達(dá)到AFLNET的3~9倍,實現(xiàn)5~10倍的測試加速,提升3%的分支覆蓋。

      1 研究動機(jī)

      與一般的軟件不同,網(wǎng)絡(luò)協(xié)議實現(xiàn)通常對收到的報文具有較高的格式要求,對于不能滿足基本格式要求的報文,通常不會進(jìn)行實際的處理,而是返回錯誤信息。例如,RTSP(real time streaming protocol)協(xié)議的一個著名開源實現(xiàn)live555,其處理客戶端發(fā)送來的請求報文的邏輯如圖1所示。

      收到報文后,live555服務(wù)器首先會對收到的報文進(jìn)行解析,提取其中包含的各個字段。在解析報文的過程中,如果發(fā)現(xiàn)該報文的格式錯誤,例如缺少必要的字段,則會跳過之后的處理步驟,直接返回包含錯誤類型代碼的回復(fù)報文。否則,根據(jù)請求類型字段(FTP協(xié)議中為第一個字段)的值,進(jìn)入對應(yīng)的處理邏輯,對報文進(jìn)行實際處理。如果請求類型字段的值不是live555服務(wù)器支持的類型,則同樣會跳過處理階段,直接返回包含錯誤類型代碼的回復(fù)報文。只有當(dāng)報文格式符合RTSP協(xié)議的基本要求且請求類型字段的值合法時,才能進(jìn)入live555服務(wù)器的實際處理邏輯,完成請求報文所要求的操作。

      大部分協(xié)議的實現(xiàn)都會在收到客戶端發(fā)來的請求報文后進(jìn)行類似的檢查。不符合協(xié)議要求的報文通常是無法進(jìn)入?yún)f(xié)議實現(xiàn)中各類請求報文的處理邏輯的,它們在報文解析階段或請求類型判別階段就會被拒絕。由此可知,協(xié)議模糊器產(chǎn)生的不符合協(xié)議基本要求的報文主要用于測試協(xié)議實現(xiàn)通過報文解析的邊界條件,挖掘其中可能存在的解析錯誤問題。而對協(xié)議實現(xiàn)的請求處理邏輯進(jìn)行測試,則需要能夠通過協(xié)議實現(xiàn)基本檢查的大體上正確的報文。

      這兩類測試用例都有助于對協(xié)議實現(xiàn)進(jìn)行全面的測試,保持這兩類測試用例的比例處于合理區(qū)間才能得到最好的測試效果。然而,基于變異的模糊測試方法完全沒有考慮報文格式的問題,而是將整個報文作為字節(jié)流進(jìn)行變異,無疑會導(dǎo)致產(chǎn)生的測試用例大部分都不符合被測協(xié)議的基本要求。且隨著測試時間的推移,越來越多完全不符合協(xié)議規(guī)范的測試用例被保存為新種子,以這些本身就不符合被測協(xié)議基本要求的種子為基礎(chǔ)產(chǎn)生的測試用例能夠進(jìn)入被測協(xié)議實現(xiàn)實際報文處理邏輯的可能性愈發(fā)渺茫。這就導(dǎo)致了基于變異的協(xié)議模糊測試對被測協(xié)議實現(xiàn)實際處理邏輯的測試效率低下。

      為了驗證上述問題在實際測試中的嚴(yán)重程度,本文使用基于變異的協(xié)議模糊測試的一個典型模糊器AFLNET對live555服務(wù)器進(jìn)行測試,收集其中可以通過live555自身的檢測進(jìn)入實際處理邏輯的測試用例的占比。具體地,本文在使用Ubuntu 18.04系統(tǒng)、配備24個Intel Xeon E5-2620 v3內(nèi)核和256 GB 內(nèi)存的服務(wù)器上對live555進(jìn)行為期1 h的模糊測試。在測試中,每隔1 min采樣一次,記錄截止到目前為止產(chǎn)生的所有測試用例中被服務(wù)器接受的比例。為了提高測試結(jié)果的可信程度,本文重復(fù)進(jìn)行該實驗3次。測試結(jié)果如圖2所示。

      可以看到,AFLNET對報文進(jìn)行整體變異產(chǎn)生的測試用例確實大部分完全不符合協(xié)議的基本要求,且隨著測試時間的推移,產(chǎn)生可以被被測協(xié)議實現(xiàn)接受的測試用例的概率持續(xù)下降。實際上,對于RTSP協(xié)議這種具有較多字段的報文而言,測試用例接受率的下降速度是非常驚人的。開始測試10 min后,測試用例的平均接受率就已經(jīng)低于10%;此后,測試用例接受率進(jìn)一步下降,在開始測試1 h后,平均測試用例接受率跌破5%。

      換言之,AFLNET產(chǎn)生的測試用例只有不到5%的比例可以進(jìn)入live555實際的報文處理邏輯中,這樣的比例明顯過低,顯然會降低基于變異的協(xié)議模糊測試的效率。在某種意義上來說,適當(dāng)提高基于變異的協(xié)議模糊測試產(chǎn)生的測試用例符合協(xié)議基本要求的比例,在功效上相當(dāng)于加快了協(xié)議模糊測試處理測試用例的速度。

      綜上所述,現(xiàn)有基于變異的協(xié)議模糊測試生成的測試用例中能被被測協(xié)議實現(xiàn)接受的比例過低,嚴(yán)重影響了測試效率。因此,為基于變異的協(xié)議模糊測試提出一種能夠提高測試用例被接受率的方法,是提高測試效率的必然需求。

      2 解決方案

      基于變異的協(xié)議模糊測試都存在測試用例被被測協(xié)議實現(xiàn)直接拒絕的比例過高的問題,這是由于此類協(xié)議模糊測試方法變異粒度(整個報文)過粗導(dǎo)致的固有問題。而基于生成的協(xié)議模糊測試使用人工輸入的報文模板指導(dǎo)測試用例的生成,可以知道每個報文包含哪些字段、每個字段的類型及每個字段的默認(rèn)取值等關(guān)鍵信息,生成的測試用例被拒絕的概率遠(yuǎn)低于基于變異的協(xié)議模糊測試。但基于生成的協(xié)議模糊測試對測試人員提出了很高的要求,需要測試人員給出被測協(xié)議的所有報文模板和完整的狀態(tài)機(jī),實際使用困難較大。

      為此,本文在基于變異的模糊測試中引入模板學(xué)習(xí)的概念,提出一種基于變異加生成的全新協(xié)議模糊測試方法。在保留基于變異的協(xié)議模糊測試易于使用的優(yōu)點(diǎn)的同時,自動學(xué)習(xí)協(xié)議報文模板,并使用模板指導(dǎo)測試用例的生成和狀態(tài)機(jī)的構(gòu)建,提高測試用例被被測協(xié)議實現(xiàn)接受的比例,從而提高測試效率。該方法的核心在于對報文進(jìn)行有針對性的變異,其與傳統(tǒng)基于變異的協(xié)議模糊測試方法的核心區(qū)別如圖3所示。

      從整體上看,本文通過模板學(xué)習(xí)獲取報文的字段信息和每個字段的合法取值,以此減小生成測試用例時的變異粒度;通過字段變異能量度量每個字段是否適合進(jìn)行字段級的變異,將更多測試時間用于更適合變異的字段。此外,本文還通過基于請求消息類型的狀態(tài)刻畫方法,利用已經(jīng)學(xué)習(xí)到的模板信息對被測協(xié)議狀態(tài)進(jìn)行更細(xì)粒度的刻畫,提高狀態(tài)機(jī)的準(zhǔn)確性。

      2.1 報文模板學(xué)習(xí)方法

      如前所述,為了提高生成的測試用例符合被測協(xié)議基本要求的概率,本文在傳統(tǒng)的基于變異的協(xié)議模糊測試中引入了模板學(xué)習(xí)的概念。協(xié)議通常會對報文包含的字段數(shù)量及關(guān)鍵字段的取值進(jìn)行檢查,一旦發(fā)現(xiàn)當(dāng)前報文不符合協(xié)議的要求,就會將其拒絕。為了提高測試用例被被測協(xié)議實現(xiàn)接受的概率,就必須同時考慮這兩個方面。因此,模板學(xué)習(xí)方法同樣需要包含報文字段劃分和字段合法取值學(xué)習(xí)兩個方面。

      2.1.1 字段劃分

      為了獲取報文包含的字段信息,本文提出了基于分隔符的字段劃分方法。

      文本協(xié)議與二進(jìn)制協(xié)議不同,單個報文包含的字段數(shù)量和每個字段的長度通常都是不固定的,各個字段之間直接使用分隔符進(jìn)行區(qū)分。因此,本文直接利用文本協(xié)議的這一特點(diǎn),在將種子加入隊列前,根據(jù)分隔符,將其中的每個報文劃分為字段列表。其中,分隔符單獨(dú)作為一個字段。這種方式可以獲取被測協(xié)議報文的大致報文結(jié)構(gòu),雖然可能出現(xiàn)將部分字段內(nèi)部的符號誤認(rèn)為分隔符,導(dǎo)致該字段被截斷的問題,但實際對生成有效測試用例的影響較小。

      對于種子中的每個報文進(jìn)行劃分的方法可以用算法1描述。依次讀入當(dāng)前種子的每個報文(第2行),每當(dāng)讀入一個報文,即對該報文進(jìn)行劃分。完成讀入過程,則完成了整個種子所有報文的劃分,最終信息存放在一個結(jié)構(gòu)體中(第28行)。對于當(dāng)前要劃分的報文,則:首先記錄當(dāng)前報文的長度(第4和5行)。然后初始化當(dāng)前檢查的字節(jié)位置(第7行)和截止到目前為止劃分出的最后一個字段的結(jié)束字節(jié)位置(第8行)。然后,依次讀入當(dāng)前報文的每個字節(jié)(第10行),如果當(dāng)前讀入的字節(jié)不是分隔符,則繼續(xù)讀入下一個字節(jié)(第24行);否則,如果當(dāng)前字節(jié)前不存在沒有被分配到字段的字節(jié),則將當(dāng)前字節(jié)作為一個字段添加到種子結(jié)構(gòu)體中(第14~16行),否則,將當(dāng)前字節(jié)之前所有未被分配的字節(jié)作為一個字段、當(dāng)前字節(jié)作為另一個字段,依次添加到種子結(jié)構(gòu)體中(第18~20行)。

      算法1 基于分隔符的字段劃分算法

      輸入:AFLNET為當(dāng)前種子構(gòu)建的結(jié)構(gòu)體q;當(dāng)前被測協(xié)議使用的分隔符的集合D。

      輸出:添加了字段信息的當(dāng)前種子的結(jié)構(gòu)體q。

      1 //依次讀入當(dāng)前種子的每個報文

      2 for r in q->regions do

      3 //將實際報文讀入為字符串,并記錄報文長度

      4 r_text=readFile(q->fname,r->start_byte,r->end_byte)

      5 r_length =r->end_byte -r->start_byte

      6 //初始化報文劃分的位置

      7 last_byte=-1

      8 now_byte=0

      9 //依次讀取當(dāng)前報文的每個字節(jié)

      10 while last_byte <r_length do

      11 //找到屬于分隔符的字節(jié)

      12 if r_text[now_byte] in D then

      13 /*判斷當(dāng)前需要添加的是一個字段還是兩個字段,并將字段添加到當(dāng)前種子對應(yīng)報文的結(jié)構(gòu)體中*/

      14 if last_byte =now_byte-1 then

      15 r->fields.add(r_text,now_byte, 1, is_delimiter)

      16 r->field_count += 1

      17 else

      18 r->fields.add(r_text,last_byte+1,now_byte–last_byte-1)

      19 r->fields.add(r_text,now_byte, 1, is_delimiter)

      20 r->field_count +=2

      21 end if

      22 last_byte =now_byte

      23 end if

      24 now_byte++

      25 end while

      26end for

      27//返回更新了字段信息的結(jié)構(gòu)體

      28return q

      2.1.2 字段字典學(xué)習(xí)

      為了學(xué)習(xí)報文每個字段的合法取值,本文提出了字段字典值學(xué)習(xí)方法。如前文所述,文本協(xié)議單個報文包含的字段數(shù)量通常不是固定的。因此,需要首先確定設(shè)置字段字典的數(shù)量。通常情況下,文本協(xié)議的一個報文可以包含固定字段、選項和數(shù)據(jù)這三類字段,其中固定字段的位置和個數(shù)一般都是確定的,且通常位于報文的開頭,而選項和數(shù)據(jù)部分通常位于固定字段之后,且可以包含也可以不包含,可以包含一個也可以包含多個,是不能確定的。同時,報文的固定字段更有可能取值受限,而后續(xù)的選項和數(shù)據(jù)部分則沒有太大的限制。因此,關(guān)鍵是為每個固定字段分別建立字段字典,而對于其余的選項或數(shù)據(jù)字段,可以使用一個統(tǒng)一的字典。

      基于這一思想,本文將初始種子中單一報文包含的最少字段數(shù)定義為必要字段數(shù),將所有報文的前必要字段數(shù)個字段定義為必要字段,而將其余字段定義為非必要字段。前述的固定字段大概率被分為了必要字段。因此,本文為每個必要字段單獨(dú)構(gòu)建一個字段字典,而對于所有非必要字段,則使用一個統(tǒng)一的字段字典。

      在測試準(zhǔn)備階段讀入所有初始種子后,開始構(gòu)建初始的字段字典,具體的構(gòu)建方法如算法2所示。首先,創(chuàng)建必要字段數(shù)量加1個字段字典,共同組成字段字典列表,其中每個字段字典初始均為空(第2行)。然后,遍歷初始種子隊列中每個種子中的每個報文(第4~6行),每遍歷一個報文,則遍歷其中的每個字段(第8行)。如果當(dāng)前字段的值已經(jīng)存在于對應(yīng)的字段字典中,則將該取值的計數(shù)加1(第10、11行);否則,將該取值添加到對應(yīng)的字段字典中并設(shè)置計數(shù)為1(第12~14行)。遍歷完所有種子后,即完成全部字段字典的構(gòu)建。

      算法2 字段字典構(gòu)建算法

      輸入:初始種子隊列queue;必要字段數(shù)min_fields。

      輸出:每個字段對應(yīng)的字段字典組成的列表d_list。

      1 //創(chuàng)建空的字段字典列表

      2 d_list=createDicts(min_fields+1)

      3 //遍歷種子隊列中的每個種子

      4 for q in queue do

      5 //遍歷當(dāng)前種子包含的每個報文

      6 for r in q->regions do

      7 //遍歷當(dāng)前報文的所有字段

      8 for index in len(r->field_count) do

      9 /*添加到對應(yīng)的字段字典中,如果已經(jīng)存在當(dāng)前取值,則計數(shù)加1,否則,設(shè)置計數(shù)為1*/

      10 if r->fields[index] in d_list[index] then

      11 d_list[index][r->fields[index]] +=1

      12 else

      13 d_list[index].add (r->fields[index])

      14 d_list[index][r->fields[index]]=1

      15 end if

      16 end for

      17 end for

      18end for

      19return d_list

      在模糊測試階段會對字段字典進(jìn)行動態(tài)更新。當(dāng)發(fā)現(xiàn)新的種子時,使用產(chǎn)生當(dāng)前種子所變異報文的每個字段值更新字段字典。更新過程如算法2的第7~16行。

      2.2 變異策略及變異能量度量

      如前所述,本文方法的核心在于學(xué)習(xí)報文模板,并根據(jù)學(xué)習(xí)到的報文模板進(jìn)行細(xì)粒度的變異,以提高產(chǎn)生有效測試用例的概率。因此,本文在保留基于變異的協(xié)議模糊測試原始的變異策略外,還引入了字段級的變異策略。

      同時,不同的字段進(jìn)行隨機(jī)變異的價值不同。例如,對于取值受限的關(guān)鍵字段進(jìn)行隨機(jī)變異,產(chǎn)生的絕大部分測試用例都將完全不符合被測協(xié)議的基本要求,價值較低。因此,在對報文進(jìn)行變異時,需要計算其中每個字段的變異能量,確定對每個字段進(jìn)行隨機(jī)變異的次數(shù),將更多測試時間用于變異潛在價值更大的字段。

      2.2.1 變異策略

      本文引入的字段級變異策略可以分為確定性字段變異和非確定性字段變異兩大類。其中,確定性變異策略作用的結(jié)果是可以預(yù)測的,對任意一個種子使用此類策略能夠產(chǎn)生的測試用例的數(shù)量都是確定的。因此,每個種子僅在第一次變異時使用確定性變異策略。而非確定性變異策略產(chǎn)生的測試用例難以預(yù)測,每次應(yīng)用都能產(chǎn)生不同的測試用例,因此每次對種子進(jìn)行變異時都會使用。但正因為如此,非確定性變異沒有明確的變異次數(shù)限制,對一個種子進(jìn)行多少非確定性變異需要模糊器指定。此外,由于使用非確定性變異策略的結(jié)果難以預(yù)料,為了減少對報文格式的破壞,本文僅對非分隔符字段使用非確定性變異。

      具體地,本文使用的字段變異策略如下:

      1)確定性變異策略

      對于分隔符字段依次使用兩種策略。a)字段字典替換:依次將當(dāng)前字段替換為對應(yīng)的字段字典中的各個值;b)特殊字符替換:依次將當(dāng)前字段替換為預(yù)先定義好的一系列特殊字符值。對于非分隔符字段則依次使用以下兩種策略。a)一位翻轉(zhuǎn):依次翻轉(zhuǎn)當(dāng)前字段值的每一位;b)字典值替換/插入。依次將當(dāng)前字段替換為各個字典值(包括人工提供的字典和自動構(gòu)建的字段字典),再依次在當(dāng)前字段前/后插入這些字典值。

      2)非確定性變異策略

      對于非分隔符字段依次使用以下三種策略,每種策略生成的測試用例數(shù)由字段變異能量決定。a)超長特殊字符:隨機(jī)使用預(yù)先定義好的容易導(dǎo)致崩潰的特殊字符的大量重復(fù)(長c0e2b2fafd85271a622777a41318a692aac38a5f164833ce839d730cb468d665度隨機(jī))來替換當(dāng)前字段;b)字段重復(fù):從當(dāng)前報文中隨機(jī)復(fù)制一個字段,并隨機(jī)拼接到當(dāng)前字段的前面或后面;c)字段級大破壞:類似于Havoc策略[19],根據(jù)字段長度隨機(jī)一個變異次數(shù),對當(dāng)前字段進(jìn)行這一次數(shù)的累積變異。其中,每次變異的方法包括:(a)一位翻轉(zhuǎn);(b)隨機(jī)設(shè)置其中一個字節(jié)的值;(c)隨機(jī)刪除一些連續(xù)字節(jié)(長度隨機(jī));(d)隨機(jī)插入一些連續(xù)字節(jié)(長度隨機(jī));(e)隨機(jī)替換一些連續(xù)字節(jié)。

      2.2.2 變異能量度量

      如前所述,對不同字段進(jìn)行非確定性變異的價值是不同的。為了提高測試效率,將更多測試時間用于潛在價值更大的字段,需要為每個實際進(jìn)行非確定性變異的字段計算一個字段變異能量,以確定每個字段進(jìn)行非確定性變異的次數(shù)(其中,超長特殊字符策略和字段重復(fù)策略分別分到1/5的字段變異能量,字段級大破壞策略分到3/5的字段變異能量)。

      在實際測試中,本文觀察到,特定種子的特定字段的潛在變異價值主要受兩個方面的因素影響:a)該字段本身是否適合隨機(jī)變異;b)當(dāng)前種子及種子中該字段的取值是否有趣。首先,如前所述,協(xié)議實現(xiàn)對不同字段的約束強(qiáng)度是不同的,這就導(dǎo)致了對不同字段隨機(jī)變異的價值不同。例如,有的字段可能只有少數(shù)幾個合法的取值,對這樣的字段進(jìn)行隨機(jī)變異的價值顯然比較低。而有些字段能夠影響協(xié)議實現(xiàn)的處理邏輯,但本身的取值可以在一個范圍內(nèi)變化。對這樣的字段進(jìn)行隨機(jī)變異,顯然更有可能觸發(fā)被測協(xié)議多種處理邏輯,對全面測試被測協(xié)議有很大幫助。其次,實際每個種子本身的價值也有所不同,這會影響到對其中每個字段進(jìn)行變異的價值。更關(guān)鍵的是,當(dāng)前種子中各個字段的實際取值會影響保留該字段不進(jìn)行變異的價值。例如,某個字段有兩種合法的取值,其中該字段取值為a的種子有99個,而取值為b的種子僅1個。此時,對該字段取值為b的種子進(jìn)行測試時,就不應(yīng)該對該字段進(jìn)行過多的變異。

      根據(jù)上述思想,本文將字段變異能量分為字段基礎(chǔ)變異能量和字段實際變異能量。其中,字段基礎(chǔ)變異能量是全局的,用于刻畫字段本身的隨機(jī)變異價值。而字段實際變異能量是每個報文單獨(dú)的,使用所屬種子的變異價值和該報文中每個字段取值的稀有度對字段基礎(chǔ)變異能量進(jìn)行了修正。

      1)字段基礎(chǔ)變異能量

      在測試準(zhǔn)備階段中,當(dāng)構(gòu)建完字段字典后開始計算每個字段的基礎(chǔ)變異能量。和構(gòu)建字段字典時一致,所有非必要字段共用一個基礎(chǔ)變異能量,且由于非必要字段的特殊性,計算其基礎(chǔ)變異能量的方式與必要字段略有不同。通常情況下,一個字段在所有種子中出現(xiàn)過的合法取值越少,這個字段是取值受限字段的可能性就越大,應(yīng)該分配更少的字段變異能量。因此,本文根據(jù)每個字段的取值多樣性計算其基礎(chǔ)變異能量,并在模糊測試過程中逐漸更新。

      首先,根據(jù)每個字段對應(yīng)的字段字典中包含的合法取值數(shù)量及構(gòu)建該字段字典使用的報文數(shù)量計算每個字段在初始種子中的多樣性。特別地,對于非必要字段而言,由于所有非必要字段共用一個字段字典,所以在計算其取值多樣性時需要考慮該字段字典實際包含的字段數(shù)量的最大值。具體計算方法如式(1)所示。

      D(x)=values(x)Rtotal x∈[1,fmin]

      values(x)Rtotal×(fmax-fmin)x=fmin+1(1)

      其中:D(x)表示當(dāng)前計算的是第x個字段的多樣性;values(x)表示第x個字段在初始種子中出現(xiàn)過的取值數(shù)量;Rtotal構(gòu)建當(dāng)前字段字典時使用的報文總數(shù);fmin表示必要字段數(shù);fmax表示構(gòu)建字段字典的種子中單個報文包含的最大字段數(shù)。

      根據(jù)筆者以往的測試經(jīng)驗,每個字段的變異次數(shù)在幾十次時,整體測試效率較好。因此,需要將取值為[0,1]的字段多樣性映射到一條取值為[1,100]的光滑曲線上,以此作為字段基礎(chǔ)變異能量??紤]到字段多樣性的取值接近0或1的概率很低,為了凸顯中間取值的字段的差異,本文使用sigmoid函數(shù)的變形來實現(xiàn)此映射。具體如式(2)所示。

      Eb(x)=φ(D(x)) x∈[1,fmin]

      φ(D(x))×(fmax-fmin)x=fmin+1(2)

      其中:Eb(x)為計算得到的第x個字段的基礎(chǔ)變異能量;fmin表示必要字段數(shù);fmax表示用于構(gòu)建字段字典的種子中單個報文包含的最大字段數(shù);φ(d)為未經(jīng)修正的映射函數(shù),具體為

      φ(d)=1+99d×(f(d)-f(0))f(1)-f(0)(3)

      其中:f(d)是sigmoid函數(shù)的變形,如式(4)所示。

      f(d)=1001+e-10(d-0.5)(4)

      通過上述方式可以在測試準(zhǔn)備階段得到每個字段的基礎(chǔ)變異能量,但是在模糊測試過程中,還需要根據(jù)實際測試情況,對每個字段的基礎(chǔ)變異能量進(jìn)行更新。具體地,如果對某個字段進(jìn)行非確定性變異產(chǎn)生了新種子,則可以認(rèn)為,對該字段進(jìn)行非確定性變異確實具有潛在價值,應(yīng)該增大該字段的基礎(chǔ)變異能量。此外,一般認(rèn)為,發(fā)現(xiàn)新種子所用的變異次數(shù)越少,則該字段的潛在價值越大;同樣地,歷史上對該字段進(jìn)行非確定性變異產(chǎn)生的種子越多,則該字段的潛在價值也越大?;谶@一思想,在每次發(fā)現(xiàn)新種子時,使用式(5)對當(dāng)前進(jìn)行非確定性變異的字段進(jìn)行的基礎(chǔ)變異能量更新:

      Eb(x)′=Eb(x)+Seedn(x)M(x)(5)

      其中:Eb(x)′代表第x個字段更新后的字段基礎(chǔ)變異能量;Eb(x)代表第x個字段更新前的字段基礎(chǔ)變異能量;Seedn(x)代表對當(dāng)前字段進(jìn)行非確定性變異產(chǎn)生的種子的數(shù)量;M(x)代表本次測試對當(dāng)前字段進(jìn)行非確定性變異的次數(shù)。

      2)字段實際變異能量

      如前所述,在模糊測試階段中,每次對當(dāng)前選擇的報文進(jìn)行變異前,都需要根據(jù)當(dāng)前變異的報文所屬的種子本身的價值(種子整體的變異能量)和當(dāng)前報文中每個字段實際取值的稀有程度來修正字段基礎(chǔ)變異能量,得到每個字段的實際變異能量。根據(jù)之前的分析,對于整體價值大的種子中的所有字段,都應(yīng)該分配更多的實際變異能量;對于取值稀有的字段,則應(yīng)該分配更少的實際變異能量。

      基于這一思想,首先根據(jù)每個字段的當(dāng)前取值在字段字典中是否出現(xiàn)或記錄的出現(xiàn)次數(shù),計算字段取值的稀有度。如果出現(xiàn)過,則稀有度為其出現(xiàn)的次數(shù)占所有取值總出現(xiàn)次數(shù)的比例,否則,規(guī)定為所有取值總出現(xiàn)次數(shù)的倒數(shù)的十分之一。具體計算方法如式(6)所示。

      R(x)=valuetimes(x)Rtotal 字段字典中存在當(dāng)前取值

      0.1Rtotal字段字典中不存在當(dāng)前取值(6)

      其中:R(x)表示第x個字段當(dāng)前取值的稀有度;valuetimes(x)表示第x個字段的取值在對應(yīng)的字段字典中的計數(shù)(出現(xiàn)次數(shù));Rtotal表示所有構(gòu)建字段字典時使用的報文總數(shù)。

      之后,根據(jù)當(dāng)前種子本身的變異能量、每個字段當(dāng)前的基礎(chǔ)變異能量和每個字段當(dāng)前取值的稀有度,計算每個字段的實際變異能量。同計算字段基礎(chǔ)變異能量時相同,對于非必要字段,仍需要使用單個報文最多包含多少非必要字段進(jìn)行修正。特別的,如前所述,本文不會對分隔符字段使用非確定性變異策略,因此規(guī)定分隔符字段的實際變異能量為-1。計算方法為

      E(x)=Es×Eb(x)×R(x)100 x∈[1,fmin]

      Es×Eb(x)×R(x)100×(fmax-fmin)x=fmin+1

      -1第x個字段是分隔符字段(71p2tIxkB8MtR+2vPeYH/dA==

      其中:E(x)表示第x個字段的實際變異能量;Es代表當(dāng)前種子的整體能量;Eb(x)代表第x個字段的基礎(chǔ)變異能量;R(x)表示第x個字段當(dāng)前取值的稀有度;fmin表示必要字段數(shù);fmax表示構(gòu)建字段字典的種子中單個報文包含的最大字段數(shù)。

      2.3 基于請求消息類型的狀態(tài)刻畫方法

      通常情況下,協(xié)議實現(xiàn)對不同類型的請求報文具有不同的處理邏輯。因此,在成功處理不同類型的請求報文后,協(xié)議實現(xiàn)的實際狀態(tài)通常也是不同的。然而,一些文本協(xié)議只要正確處理收到的請求報文都會返回相同的響應(yīng)報文,導(dǎo)致以協(xié)議實現(xiàn)的響應(yīng)碼刻畫協(xié)議狀態(tài)的方法無法區(qū)分協(xié)議實現(xiàn)正確處理不同類型的請求后的狀態(tài),顯然會影響測試效果。如圖4(a)的例子所示,在以options→setup→play→errtype的順序向RTSP協(xié)議實現(xiàn)live555發(fā)送報文后(其中,errtype不是一種真實存在的報文類型,而是代表請求類型字段取值不合法的任意報文),AFLNET無法區(qū)分live555服務(wù)器在接受options報文、setup報文和play報文后的狀態(tài)。然而,live555服務(wù)器在接受這些報文后,允許接受的報文類型的集合都是不同的,表明這些狀態(tài)實際并不相同。

      因此,本文提出了基于請求消息類型的狀態(tài)刻畫方法,對上述被混淆的狀態(tài)進(jìn)行細(xì)分,從而更準(zhǔn)確地指導(dǎo)測試狀態(tài)和對應(yīng)種子的選擇。對于表示正確處理了請求報文的響應(yīng)碼對應(yīng)的狀態(tài),該方法使用被測協(xié)議實現(xiàn)當(dāng)前接受并處理的請求報文的類型字段的值進(jìn)行細(xì)分。具體地,將前一個請求報文的類型字段(可以人工指定,默認(rèn)是報文的第一個字段)的值和響應(yīng)碼拼接成一個字符串,然后對該字符串進(jìn)行哈希運(yùn)算,將得到的值作為細(xì)分后的狀態(tài)。對于其他響應(yīng)碼(主要是各種類型的錯誤代碼)代表的狀態(tài),則僅對該響應(yīng)碼進(jìn)行哈希,以此作為被測協(xié)議實現(xiàn)的狀態(tài)。如圖4(b)所示,同樣以options→setup→play→errtype的順序向RTSP協(xié)議實現(xiàn)live555發(fā)送報文后,該方法可以區(qū)分live555服務(wù)器在接受每個報文后的狀態(tài)。這表明這種狀態(tài)刻畫方法比AFLNET刻畫的狀態(tài)更為精準(zhǔn),有利于在模糊測試中指導(dǎo)測試狀態(tài)和本次變異種子的選擇。

      上述細(xì)粒度狀態(tài)刻畫方法可以使用算法3描述。在發(fā)送當(dāng)前測試用例并獲得AFLNET給出的響應(yīng)碼序列(狀態(tài)序列)后,首先創(chuàng)建與原始狀態(tài)序列等長的空的細(xì)粒度狀態(tài)序列(第2行)。然后,遍歷當(dāng)前測試用例中的每個報文(第4行),如果協(xié)議實現(xiàn)處理當(dāng)前報文后返回表示正確的響應(yīng)碼,則將當(dāng)前報文的請求類型和響應(yīng)碼拼接,然后將其哈希值作為細(xì)粒度狀態(tài)添加到細(xì)粒度狀態(tài)序列中(第6~8行);否則,直接將響應(yīng)碼的哈希值作為細(xì)粒度狀態(tài)添加到細(xì)粒度狀態(tài)序列中(第9、10行)。遍歷完當(dāng)前測試用例中的所有報文,則細(xì)粒度狀態(tài)序列構(gòu)建完成。

      算法3 基于請求消息類型的狀態(tài)刻畫算法

      輸入:當(dāng)前測試用例的報文序列kl_message;原始的狀態(tài)序列S_sequence;當(dāng)前協(xié)議表示成功接受報文的響應(yīng)碼的集合S_code;當(dāng)前協(xié)議的關(guān)鍵字段編號key。

      輸出:細(xì)分后的狀態(tài)序列FS_sequence。

      1 創(chuàng)建細(xì)分后的狀態(tài)序列(此時所有值為空)

      2 FS_sequence=createSequence(len(S_sequence))

      3 /*遍歷報文序列和對應(yīng)的原始狀態(tài)序列(省略兩者不對齊(即有的報文沒有收到響應(yīng))時的處理邏輯)*/

      4 for i in len(S_sequence) do

      5 /*如果當(dāng)前狀態(tài)表示成功接受報文,則進(jìn)行細(xì)分,否則直接使用響應(yīng)碼(為了統(tǒng)一格式,兩者都需要散列)*/

      6 if S_sequence[i] in S_code then

      7 F_state=str(S_sequence[i])+kl_message[i]->fields[key]

      8 FS_sequence[i]=hash32(F_state)

      9 else

      10 FS_sequence[i] = hash32(str(S_sequence[i]))

      11 end if

      12end for

      13return FS_sequence

      2.4 整體流程

      本文對典型的基于變異的協(xié)議模糊框架AFLNET的測試流程進(jìn)行修改,得到基于字段感知的文本協(xié)議灰盒模糊測試方法,其測試流程如圖5所示。

      可以看到,F(xiàn)PFuzzer的整個測試流程可以分為測試準(zhǔn)備階段和模糊測試階段。其中,測試準(zhǔn)備階段逐一讀入初始種子并進(jìn)行相應(yīng)的處理以構(gòu)建種子隊列。在讀入所有種子后,初始化字段字典并設(shè)置字段基礎(chǔ)變異能量。而模糊測試階段則是一個無限循環(huán)。每次選擇一個狀態(tài)和其對應(yīng)的一個種子進(jìn)行變異,產(chǎn)生大量測試用例。在測試過程中,不斷保存新種子、更新字段字典和狀態(tài)機(jī),以供后續(xù)測試使用。

      具體地,實際進(jìn)行模糊測試時,F(xiàn)PFuzzer首先進(jìn)入測試準(zhǔn)備階段。在該階段中,F(xiàn)PFuzzer首先依次讀入初始種子語料庫中的每個種子,每讀入一個種子,就將其對應(yīng)的報文序列發(fā)送給被測協(xié)議實現(xiàn),獲取被測協(xié)議實現(xiàn)的回復(fù)報文序列。之后,一方面將當(dāng)前種子轉(zhuǎn)換為結(jié)構(gòu)體,然后解析其中每個報文的字段,將字段信息保存在結(jié)構(gòu)體中,將更新后的結(jié)構(gòu)體加入種子隊列中;另一方面,解析得到的回復(fù)報文序列,提取每個回復(fù)報文的響應(yīng)碼,組成響應(yīng)碼序列,然后使用當(dāng)前種子每個報文的字段劃分結(jié)果對響應(yīng)碼序列進(jìn)行增強(qiáng),得到細(xì)粒度的狀態(tài)轉(zhuǎn)換并以此更新狀態(tài)機(jī)。在讀入所有初始種子后,F(xiàn)PFuzzer根據(jù)初始種子中單個報文包含的最少字段數(shù)確定必要字段數(shù)。然后,F(xiàn)PFuzzer使用種子隊列中所有種子已經(jīng)劃分好的字段信息,構(gòu)建每個字段對應(yīng)的字段字典。最后,根據(jù)字段字典,計算每個字段的初始基礎(chǔ)變異能量。

      完成上述準(zhǔn)備工作后,F(xiàn)PFuzzer正式進(jìn)入模糊測試階段。在該階段中,F(xiàn)PFuzzer每次根據(jù)協(xié)議狀態(tài)機(jī)選擇一個測試狀態(tài),然后在該狀態(tài)對應(yīng)的種子中選擇一個進(jìn)行變異。之后,F(xiàn)PFuzzer根據(jù)當(dāng)前待變異的報文每個字段的取值及該種子本身的變異能量,為每個字段計算一個實際變異能量。然后,依次使用各種變異策略,生成大量測試用例。每當(dāng)生成一個測試用例,就將其發(fā)送給被測協(xié)議實現(xiàn),獲取覆蓋率反饋和狀態(tài)轉(zhuǎn)換序列。如果該測試用例覆蓋了新分支,則將其保存為新種子,然后根據(jù)本次變異的字段更新字段基礎(chǔ)變異能量并使用本次變異的報文嘗試更新字段字典,如果出現(xiàn)新的狀態(tài)轉(zhuǎn)換,則更新狀態(tài)機(jī)。當(dāng)完成對當(dāng)前種子所有測試用例的測試后,重新選擇下一個測試狀態(tài)。整個模糊測試過程始終保持上述循環(huán),直到耗盡測試人員給定的所有測試時間。

      3 實驗評估

      為了評估本文方法的有效性,通過在AFLNET中添加5 500多行C代碼實現(xiàn)了模糊器原型FPFuzzer。該模糊器原型除第2章提到的策略外,其余部分與AFLNET完全相同。因此,之后的實驗以AFLNET為基準(zhǔn),避免其他策略對結(jié)果的干擾。

      根據(jù)FPFuzzer的設(shè)計思想,需要驗證以下兩個問題:

      問題1:FPFuzzer是否可以提高測試用例的接受率?

      問題2:FPFuzzer是否可以提高模糊測試效率?

      1)測試數(shù)據(jù)集

      為了盡可能地保證對比的公平性,本文選用與AFLNET的論文中相同的協(xié)議和具體實現(xiàn)作為被測對象,包括RTSP協(xié)議和FTP(file transfer protocol)協(xié)議兩個文本協(xié)議。選擇的RTSP協(xié)議實現(xiàn)為live555,具體測試目標(biāo)為其中的live555MediaServer。而選擇的FTP協(xié)議實現(xiàn)為LightFTP,具體測試目標(biāo)為其中的fftp。

      2)實驗環(huán)境和實驗參數(shù)

      本文在配備24個Intel Xeon E5-2620 v3內(nèi)核和256 GB內(nèi)存且系統(tǒng)為Ubuntu 18.04的服務(wù)器上進(jìn)行全部的實驗。在測試時,每個模糊器都僅在一個內(nèi)核上運(yùn)行,但不限制內(nèi)存占用量。

      為了提高評估結(jié)果的可信度,在以下所有實驗中,啟動模糊測試的參數(shù)設(shè)置(包括單個測試用例的超時時長、清理腳本、狀態(tài)選擇算法、種子選擇算法、是否使用假陰性減少模式等)全部與AFLNET項目文檔中給出的建議相同。

      3.1 測試用例接受率

      本文的出發(fā)點(diǎn)在于:基于變異的協(xié)議模糊測試產(chǎn)生的測試用例中能被被測協(xié)議實現(xiàn)接受的比例過低,嚴(yán)重影響測試效率。因此,為了評估本文方法的有效性,需要首先評估FPFuzzer是否可以提高生成的測試用例能被被測協(xié)議實現(xiàn)接受的比例。

      具體地,在每個被測協(xié)議實現(xiàn)上進(jìn)行了3次實驗,每次實驗測試1 h。在實驗中,每隔1 min采樣一次,統(tǒng)計截止到當(dāng)前時刻為止產(chǎn)生的所有測試用例中被被測協(xié)議實現(xiàn)接受的比例。最終得到的在模糊測試過程中測試用例被被測協(xié)議實現(xiàn)接受的比例隨時間的變化趨勢,如圖6所示。

      可以看到,原始的AFLNET產(chǎn)生的測試用例能被接受的比例很低。即使是在報文結(jié)構(gòu)非常簡單的FTP協(xié)議中,截止到測試1 h為止,產(chǎn)生的測試用例的平均接受率也不足10%。而使用FPFuzzer,在RTSP協(xié)議上,可以實現(xiàn)40.37%的測試用例接受率,是AFLNET的9倍以上。在FTP協(xié)議中使用FPFuzzer,則可以實現(xiàn)31.40%的測試用例接受率,是AFLNET的3倍以上。這表明,F(xiàn)PFuzzer確實可以顯著提高測試用例被被測協(xié)議實現(xiàn)接受的比例。

      3.2 模糊測試效率

      如前所述,基于變異的協(xié)議模糊測試生成的測試用例被被測協(xié)議實現(xiàn)接受的比例過低,能夠?qū)Ρ粶y協(xié)議實現(xiàn)的實際處理邏輯進(jìn)行測試的測試用例占比太低,最終嚴(yán)重影響整體測試效率。因此,從理論上看,應(yīng)該可以通過提高測試用例被接受的比例的方式,實現(xiàn)大幅提高測試效率的最終目標(biāo)。然而,雖然實驗已經(jīng)證明FPFuzzer可以大幅提高測試用例被接受的比例,但實際是否可以實現(xiàn)大幅提高測試效率的預(yù)期目標(biāo)仍有待實驗證明。

      因此,本文通過實驗比較了AFLNET和FPFuzzer覆蓋分支的效率。具體地,在每個被測協(xié)議實現(xiàn)上進(jìn)行3次實驗,每次實驗測試10 h,然后比較了AFLNET和FPFuzzer測試1 h、2 h、5 h和10 h時平均覆蓋的分支數(shù),并計算了FPFuzzer當(dāng)前覆蓋的分支數(shù)占AFLNET測試10 h所達(dá)到的最終覆蓋分支數(shù)的比例。結(jié)果如表1所示。

      可以看到,對于RTSP協(xié)議而言,F(xiàn)PFuzzer只需要測試1 h就可以達(dá)到AFLNET測試10 h的分支覆蓋水平,實現(xiàn)了10倍加速。對于FTP協(xié)議而言,F(xiàn)PFuzzer也只需要測試2 h就可以達(dá)到AFLNET測試10 h的分支覆蓋水平,實現(xiàn)5倍加速。FPFuzzer在這兩個被測協(xié)議上表現(xiàn)出的加速倍率與測試用例接受率的提高比例高度相關(guān),完全符合預(yù)期。這表明本文方法確實和第1章中分析的一致,可以通過提高生成的測試用例被被測協(xié)議實現(xiàn)接受的比例來大幅提高整體測試效率。

      此外,由于FPFuzzer大幅提高了測試效率,同樣測試10 h所能覆蓋的分支數(shù)也會受益。因此,本文還額外比較了AFLNET和FPFuzzer測試10 h最終能夠覆蓋的分支數(shù),并計算了其顯著性。本文使用未配對的t-test來計算顯著性,并假設(shè)每個模糊器在每個被測協(xié)議上的測試結(jié)果都符合高斯分布,每次測試的結(jié)果是從具有相同標(biāo)準(zhǔn)差的總體中進(jìn)行抽樣的。顯著性水平以“*”表示,其中“ns”表示P值≥0.05,“*”表示P值<0.05,“**”表示P值<0.01,“***”表示P值<0.001。測試結(jié)果如表2所示。

      可以看到,在RTSP和FTP協(xié)議上,F(xiàn)PFuzzer分別比AFLNET多覆蓋2.79%和4.30%的分支。雖然提升比例不高,但均具有顯著性,表明該提升非常穩(wěn)定并非偶然。這表明FPFuzzer在大幅提高測試效率后,確實可以提高模糊測試的最終效果。

      3.3 案例研究

      為了明確本文方法在實際測試中的作用,本文以對FTP協(xié)議的“USER”報文的測試為例予以說明。

      根據(jù)FTP協(xié)議的規(guī)定,與服務(wù)器連接后,客戶端首先需要發(fā)送“USER”報文來進(jìn)行登錄。其中,可以使用真實的用戶名進(jìn)行登錄,例如用戶名為“User1”,則登錄報文為“USER User1\r\n”。也可以使用匿名方式登錄,登錄報文統(tǒng)一為“USER anonymous\r\n”。無論使用何種登錄方式,發(fā)送的登錄報文均包含4個字段,其中第一個字段是請求類型,此時的值為“USER”;第二個字段為分隔符,此時的值為“ ”;第三個字段是用戶名,可以取各種值,最后一個字段為報文結(jié)束標(biāo)識,此時的值為“\r\n”。

      對該類報文的一個實例“USER ubuntu\r\n”分別使用AFLNET的方法和本文方法進(jìn)行變異,產(chǎn)生的測試用例的典型實例如圖7所示。

      可以看到,AFLNET對整個報文不加區(qū)分地進(jìn)行變異,產(chǎn)生的測試用例基本完全失去了報文原有的結(jié)構(gòu),甚至連報文結(jié)束標(biāo)志“\r\n”都可能被變異掉。因此,正如第1章中分析的那樣,傳統(tǒng)的基于變異的協(xié)議模糊測試產(chǎn)生的測試用例中能夠被被測協(xié)議實現(xiàn)接受并進(jìn)行實際處理的報文的比例是很低的。與此同時,F(xiàn)PFuzzer產(chǎn)生的典型測試用例有較大概率保留報文的基本格式,更有可能產(chǎn)生能夠被被測協(xié)議實現(xiàn)接受的報文。

      從上述實例中可以看到,本文方法確實可以提高生成的測試用例被被測協(xié)議實現(xiàn)接受的概率。因此,使用本文方法進(jìn)行測試有更多機(jī)會探索被測協(xié)議實現(xiàn)的實際報文處理邏輯,從而大幅提高測試效率。

      4 相關(guān)工作

      4.1 基于變異的協(xié)議模糊測試

      基于變異的協(xié)議模糊測試不需要人工提供的協(xié)議模板與狀態(tài)機(jī),而是將真實流量作為初始種子,通過對種子的變異來探索被測協(xié)議實現(xiàn)并動態(tài)構(gòu)建被測協(xié)議實現(xiàn)的狀態(tài)機(jī)。

      AFLNET[11]是首個基于變異的協(xié)議模糊測試框架(AFLNWE是無狀態(tài)的,不是真正意義上的協(xié)議模糊器),給出了基于變異的協(xié)議模糊器的基本工作流程和整體思想。它使用真實流量作為初始種子,使用被測協(xié)議實現(xiàn)返回的消息的響應(yīng)碼作為被測協(xié)議實現(xiàn)的當(dāng)前狀態(tài),可以自動構(gòu)建狀態(tài)機(jī),提高了協(xié)議模糊測試的便捷程度。

      協(xié)議模糊測試中發(fā)送測試用例需要通過網(wǎng)絡(luò)(一般通過TCP套接字),這一過程是比較耗時的。為了加快發(fā)送測試用例的過程,增加協(xié)議模糊測試的吞吐量,SnapFuzz[16]提出了將TCP套接字替換為UNIX套接字的方法。

      協(xié)議模糊測試每次發(fā)送變異產(chǎn)生的測試報文前,需要先發(fā)送一系列的前綴報文,使服務(wù)器到達(dá)被測狀態(tài),而這個過程是很耗時的。為了解決這一問題,提出了使用虛擬機(jī)來保存已經(jīng)到達(dá)目標(biāo)狀態(tài)的服務(wù)器的工作SNPSFuzzer(fuzzer for stateful network protocols using snapshots)[12]和Nyx-Net[11]。

      由于很多協(xié)議的響應(yīng)碼種類很有限,AFLNET提出的基于服務(wù)器響應(yīng)碼的狀態(tài)機(jī)是比較粗略的。為了提高狀態(tài)機(jī)的精度,StateAFL[14]和NSFuzz[15]提出了使用被測協(xié)議實現(xiàn)的部分長期變量的值來刻畫狀態(tài)的方法。它們各自提出了一系列狀態(tài)變量應(yīng)該滿足的條件,以此查找協(xié)議實現(xiàn)中可能用于表示狀態(tài)的長期變量,然后通過將這些變量值進(jìn)行散列來表示狀態(tài),使得狀態(tài)機(jī)更加細(xì)粒度。

      上述工作都是對基于變異的協(xié)議模糊測試的有益改進(jìn)。然而,它們都將待變異的報文視為字節(jié)流,沒有考慮協(xié)議對報文格式的要求,導(dǎo)致測試用例的有效率低。本文著力于此提出了字段感知方法,通過基于分隔符的字段劃分方法和字段字典值學(xué)習(xí)方法,顯著提高了測試用例的被接受率。

      4.2 輸入有格式的基于變異的模糊測試

      在軟件模糊測試中,也存在輸入是有格式的文件(例如jpg、elf、MP3等)的情況,使用傳統(tǒng)的基于變異的模糊測試方法同樣存在測試用例大概率通不過被測軟件的檢測,無法進(jìn)入實際處理的問題。為此,有研究提出了針對輸入是有格式的文件的軟件進(jìn)行模糊測試的基于變異的模糊方法。

      針對這一問題,AFLsmart[20]首先給出了一種解決方案,使用Peach Pit描述被測程序所需輸入的格式、取值范圍等,在模糊測試時,使用這些信息解析要變異的種子,然后根據(jù)結(jié)構(gòu)信息對種子進(jìn)行針對性變異,大概率保持生成的測試用例的結(jié)構(gòu)完整性和語義完整性。

      這種方式需要提供格式模板,使基于變異的模糊測試的一大優(yōu)點(diǎn)——易用性,受到巨大的挑戰(zhàn)。而且,與有格式文件相比,協(xié)議格式是更加復(fù)雜的,人工書寫協(xié)議的格式文件實際上很難保證完全正確。本文著力于解決在沒有人工提供報文模板的前提下,猜測被測協(xié)議可能的格式要求。

      而ProFuzzer[21]提出了一種基于字節(jié)猜測的解決方案。在開始測試前,它先對種子的每一個字節(jié)的256種可能的取值分別進(jìn)行測試,得到每個字節(jié)取值對整體分支覆蓋數(shù)影響的分布,并合并相鄰且分布相似的字節(jié)組成字段。之后,再根據(jù)分布的具體模式,將每個字段分為6大類(斷言、原始數(shù)據(jù)、枚舉、循環(huán)計數(shù)、偏移量、大?。?,并記錄每個字段允許的取值范圍。在測試時,根據(jù)字段的種類分配不同的變異能量,且對于關(guān)鍵類型的字段,在變異時大概率使其符合其取值范圍。

      這種方式適用的前提是每個字段的長度相對固定,否則,將無法得到較為通用的協(xié)議模板。而如果對于每個種子都要重新猜測字段,則其消耗是不可接受的。因此,這種方法可能適用于二進(jìn)制協(xié)議,但對字段長度、字段數(shù)量都不固定的文本協(xié)議來說,是不適用的。本文著力于根據(jù)文本協(xié)議的特點(diǎn),提出專門針對文本協(xié)議的字段感知方法。

      5 結(jié)束語

      基于變異的協(xié)議模糊測試,沒有考慮被測協(xié)議對報文格式的要求,導(dǎo)致產(chǎn)生的測試用例被接受率過低,影響測試效率。為了解決這一問題,本文提出了基于字段感知的文本協(xié)議灰盒模糊測試方法,通過字段感知方法學(xué)習(xí)報文模板,提高生成的測試用例的被接受率。在此基礎(chǔ)上,本文還提出了字段級變異策略、字段變異能量度量方法和基于請求消息類型的狀態(tài)刻畫方法,進(jìn)一步提高測試效率。實驗表明,基于本文方法所實現(xiàn)的模糊器原型FPFuzzer確實可以有效提高生成的測試用例被被測協(xié)議實現(xiàn)接受的比例,并大幅提高整體測試效率。

      參考文獻(xiàn):

      [1]Zhu Xiaogang, Wen Sheng, Seyit C,et al. Fuzzing: a survey for roadmap[J]. ACM Computing Surveys, 2022, 54(11s): 1-36.

      [2]Liang Hongliang, Pei Xiaoxiao, Jia Xiaodong,et al. Fuzzing: state of the art[J]. IEEE Trans on Reliability, 2018, 67(3): 1199-1218.

      [3]喻波, 蘇金樹, 楊強(qiáng), 等. 網(wǎng)絡(luò)協(xié)議軟件漏洞挖掘技術(shù)綜述[J]. 軟件學(xué)報, 2023, 35(2): 1-27. (Yu Bo, Su Jinsu, Yang Qiang,et al. Survey on vulnerability mining techniques of network protocol software[J]. Journal of Software, 2023, 35(2): 1-27.)

      [4]李東, 郝艷妮, 彭升輝, 等. 國家自然科學(xué)基金委員會網(wǎng)絡(luò)安全現(xiàn)狀與展望[J]. 網(wǎng)絡(luò)與信息安全學(xué)報, 2022, 8(6): 90-101. (Li Dong, Hao Yanni, Peng Shenghui,et al. Network security of the national natural science foundation of China: today and prospects[J]. Chinese Journal of Network and Information Security, 2022, 8(6): 92-101.)

      [5]李艷, 王純子, 黃光球, 等. 網(wǎng)絡(luò)安全態(tài)勢感知分析框架與實現(xiàn)方法比較[J]. 電子學(xué)報, 2019, 47(4): 927-945. (Li Yan, Wang Chunzi, Huang Guangqiu,et al. A survey of architecture and implementation method on cyber security situation awareness analysis[J]. Acta Electonica Sinica, 2019, 47(4): 927-945.)

      [6]Mamdouh A, Sadiq A. Security risks in the software development lifecycle[J]. International Journal of Recent Technology and Engineering, 2019, 8(3): 7048-7055.

      [7]Shipra P, Rajesh K S, Angappa G,et al. Cyber security risks in globalized supply chains: conceptual framework[J]. Journal of Global Operations and Strategic Sourcing, 2020, 13(1): 103-128.

      [8]Eddington M. peach-fuzzer-community[EB/OL]. (2021-03-30)[2024-04-02]. https://gitlab.com/peachtech/peach-fuzzer-community.

      [9]Joshua P, Maximilian L, Ryan,et al. BooFuzz: network protocol fuz-zing for humans[EB/OL]. (2023-10-09) [2024-04-02]. https://github.com/ jtpereyda/boofuzz.

      [10]Luo Zhengxiong, Yu Junze, Zuo Feilong,et al. BLEEM: packet sequence oriented fuzzing for protocol implementations[C]//Proc of USENIX Security Symposium. Berkeley, CA: USENIX Association Press, 2023: 4481-4498.

      [11]Van Thuan P, Marcel B, Abhik R. AFLNET: a greybox fuzzer for network protocols[C]//Proc of the 13th International Conference on Software Testing, Validation and Verification. Piscataway, NJ: IEEE Press, 2020: 460-465.

      [12]Li Junqiang, Li Senyi, Sun Gang,et al. SNPSFuzzer: a dast greybox fuzzer for stateful network protocols using snapshots[J]. IEEE Trans on Information Forensics and Security, 2022, 17: 2673-2687.

      [13]Sergej S, Cornelius A, Andrea J,et al. NYX-Net: network fuzzing with incremental snapshots[C]//Proc of the 7th European Conference on Computer Systems. New York: ACM Press, 2022: 166-180.

      [14]Roberto N. StateAFL: greybox fuzzing for stateful network servers[J]. Empirical Software Engineering, 2022, 27(7): 191.

      [15]Qin Shisong, Hu Fan, Ma Zheyu,et al. NSFuzz: towards efficient and state-aware network service fuzzing[J]. ACM Trans on Software Engineering and Methodology, 2023, 32(6): 1-26.

      [16]Anastasios A, Cristian C. SnapFuzz: high-throughput fuzzing of network applications[C]//Proc of the 31st ACM SIGSOFT International Symposium on Software Testing and Analysis. New York: ACM Press, 2022: 340-351.

      [17]張冠宇, 尚文利, 張博文, 等. 一種結(jié)合遺傳算法的工控協(xié)議模糊測試方法[J]. 計算機(jī)應(yīng)用研究, 2021, 38(3): 680-684. (Zhang Guanyu, Shang Wenli, Zhang Bowen,et al. Fuzzy test me-thod for industrial control protocol combining genetic algorithm[J]. Application Research of Computers, 2021, 38(3): 680-684.)

      [18]徐威, 李鵬, 張文鑌, 等. 網(wǎng)絡(luò)協(xié)議模糊測試綜述[J]. 計算機(jī)應(yīng)用研究, 2023, 40(8): 2241-2249. (Xu Wei, Li Peng, Zhang Wenbin,et al. Survey of network protocol fuzzing[J]. Application Research of Computers, 2023, 40(8): 2241-2249.)

      [19]Wu Mingyuan, Jiang Ling, Xiang Jiahong,et al. One fuzzing strategy to rule them all[C]//Proc of the 44th International Conference on Software Engineering. New York: ACM Press, 2022: 1634-1645.

      [20]Van Thuan P, Marcel B, Andrew E S,et al. Smart greybox fuzzing[J]. IEEE Trans on Software Engineering, 2019, 47(9): 1980-1997.

      [21]You Wei, Wang Xueqiang, Ma Shiqing,et al. ProFuzzer: on-the-fly input type probing for better zero-day vulnerability discovery[C]//Proc of IEEE Symposium on Security and Privacy. Piscataway, NJ: IEEE Press, 2019: 769-786.

      杭锦旗| 云安县| 安庆市| 阜宁县| 慈利县| 滁州市| 华坪县| 建湖县| 兰西县| 江西省| 凌海市| 外汇| 石家庄市| 宁远县| 东乡县| 高要市| 报价| 玉树县| 聂荣县| 大新县| 腾冲县| 乐都县| 湘西| 湟源县| 柳林县| 聂荣县| 达日县| 乌兰浩特市| 利津县| 松潘县| 新兴县| 苍溪县| 三亚市| 崇义县| 定陶县| 沛县| 砚山县| 定远县| 洛阳市| 镇赉县| 东安县|