国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

2024-10-14 00:00:00孫語韜徐向華
計算機應用研究 2024年10期

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

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

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

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

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

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

本文的主要貢獻如下:

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

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

1 研究動機

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

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

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

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

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

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

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

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

2 解決方案

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

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

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

2.1 報文模板學習方法

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

2.1.1 字段劃分

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

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

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

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

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

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

1 //依次讀入當前種子的每個報文

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 //依次讀取當前報文的每個字節(jié)

10 while last_byte <r_length do

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

12 if r_text[now_byte] in D then

13 /*判斷當前需要添加的是一個字段還是兩個字段,并將字段添加到當前種子對應報文的結(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 字段字典學習

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

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

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

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

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

輸出:每個字段對應的字段字典組成的列表d_list。

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

2 d_list=createDicts(min_fields+1)

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

4 for q in queue do

5 //遍歷當前種子包含的每個報文

6 for r in q->regions do

7 //遍歷當前報文的所有字段

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

9 /*添加到對應的字段字典中,如果已經(jīng)存在當前取值,則計數(shù)加1,否則,設置計數(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

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

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

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

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

2.2.1 變異策略

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

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

1)確定性變異策略

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

2)非確定性變異策略

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

2.2.2 變異能量度量

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

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

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

1)字段基礎變異能量

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

首先,根據(jù)每個字段對應的字段字典中包含的合法取值數(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)表示當前計算的是第x個字段的多樣性;values(x)表示第x個字段在初始種子中出現(xiàn)過的取值數(shù)量;Rtotal構(gòu)建當前字段字典時使用的報文總數(shù);fmin表示必要字段數(shù);fmax表示構(gòu)建字段字典的種子中單個報文包含的最大字段數(shù)。

根據(jù)筆者以往的測試經(jīng)驗,每個字段的變異次數(shù)在幾十次時,整體測試效率較好。因此,需要將取值為[0,1]的字段多樣性映射到一條取值為[1,100]的光滑曲線上,以此作為字段基礎變異能量??紤]到字段多樣性的取值接近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個字段的基礎變異能量;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)

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

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

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

2)字段實際變異能量

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

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

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

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

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

之后,根據(jù)當前種子本身的變異能量、每個字段當前的基礎變異能量和每個字段當前取值的稀有度,計算每個字段的實際變異能量。同計算字段基礎變異能量時相同,對于非必要字段,仍需要使用單個報文最多包含多少非必要字段進行修正。特別的,如前所述,本文不會對分隔符字段使用非確定性變異策略,因此規(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代表當前種子的整體能量;Eb(x)代表第x個字段的基礎變異能量;R(x)表示第x個字段當前取值的稀有度;fmin表示必要字段數(shù);fmax表示構(gòu)建字段字典的種子中單個報文包含的最大字段數(shù)。

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

通常情況下,協(xié)議實現(xiàn)對不同類型的請求報文具有不同的處理邏輯。因此,在成功處理不同類型的請求報文后,協(xié)議實現(xiàn)的實際狀態(tài)通常也是不同的。然而,一些文本協(xié)議只要正確處理收到的請求報文都會返回相同的響應報文,導致以協(xié)議實現(xiàn)的響應碼刻畫協(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服務器在接受options報文、setup報文和play報文后的狀態(tài)。然而,live555服務器在接受這些報文后,允許接受的報文類型的集合都是不同的,表明這些狀態(tài)實際并不相同。

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

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

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

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

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

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

2 FS_sequence=createSequence(len(S_sequence))

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

4 for i in len(S_sequence) do

5 /*如果當前狀態(tài)表示成功接受報文,則進行細分,否則直接使用響應碼(為了統(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的測試流程進行修改,得到基于字段感知的文本協(xié)議灰盒模糊測試方法,其測試流程如圖5所示。

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

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

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

3 實驗評估

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

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

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

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

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

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

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

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

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

3.1 測試用例接受率

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

具體地,在每個被測協(xié)議實現(xiàn)上進行了3次實驗,每次實驗測試1 h。在實驗中,每隔1 min采樣一次,統(tǒ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)的實際處理邏輯進行測試的測試用例占比太低,最終嚴重影響整體測試效率。因此,從理論上看,應該可以通過提高測試用例被接受的比例的方式,實現(xiàn)大幅提高測試效率的最終目標。然而,雖然實驗已經(jīng)證明FPFuzzer可以大幅提高測試用例被接受的比例,但實際是否可以實現(xiàn)大幅提高測試效率的預期目標仍有待實驗證明。

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

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

此外,由于FPFuzzer大幅提高了測試效率,同樣測試10 h所能覆蓋的分支數(shù)也會受益。因此,本文還額外比較了AFLNET和FPFuzzer測試10 h最終能夠覆蓋的分支數(shù),并計算了其顯著性。本文使用未配對的t-test來計算顯著性,并假設每個模糊器在每個被測協(xié)議上的測試結(jié)果都符合高斯分布,每次測試的結(jié)果是從具有相同標準差的總體中進行抽樣的。顯著性水平以“*”表示,其中“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ī)定,與服務器連接后,客戶端首先需要發(fā)送“USER”報文來進行登錄。其中,可以使用真實的用戶名進行登錄,例如用戶名為“User1”,則登錄報文為“USER User1\r\n”。也可以使用匿名方式登錄,登錄報文統(tǒng)一為“USER anonymous\r\n”。無論使用何種登錄方式,發(fā)送的登錄報文均包含4個字段,其中第一個字段是請求類型,此時的值為“USER”;第二個字段為分隔符,此時的值為“ ”;第三個字段是用戶名,可以取各種值,最后一個字段為報文結(jié)束標識,此時的值為“\r\n”。

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

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

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

4 相關工作

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

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

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

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

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

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

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

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

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

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

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

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

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

5 結(jié)束語

基于變異的協(xié)議模糊測試,沒有考慮被測協(xié)議對報文格式的要求,導致產(chǎn)生的測試用例被接受率過低,影響測試效率。為了解決這一問題,本文提出了基于字段感知的文本協(xié)議灰盒模糊測試方法,通過字段感知方法學習報文模板,提高生成的測試用例的被接受率。在此基礎上,本文還提出了字段級變異策略、字段變異能量度量方法和基于請求消息類型的狀態(tài)刻畫方法,進一步提高測試效率。實驗表明,基于本文方法所實現(xiàn)的模糊器原型FPFuzzer確實可以有效提高生成的測試用例被被測協(xié)議實現(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]喻波, 蘇金樹, 楊強, 等. 網(wǎng)絡協(xié)議軟件漏洞挖掘技術綜述[J]. 軟件學報, 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]李東, 郝艷妮, 彭升輝, 等. 國家自然科學基金委員會網(wǎng)絡安全現(xiàn)狀與展望[J]. 網(wǎng)絡與信息安全學報, 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)絡安全態(tài)勢感知分析框架與實現(xiàn)方法比較[J]. 電子學報, 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]. 計算機應用研究, 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)絡協(xié)議模糊測試綜述[J]. 計算機應用研究, 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.

集安市| 潜江市| 渝北区| 苏州市| 车致| 呈贡县| 光泽县| 喀什市| 建瓯市| 镇雄县| 固原市| 二连浩特市| 平罗县| 宁晋县| 卓资县| 安吉县| 巴里| 手游| 曲阳县| 永登县| 西宁市| 个旧市| 南岸区| 安图县| 石嘴山市| 清水县| 上杭县| 个旧市| 德清县| 白银市| 贵溪市| 铜川市| 永和县| 大余县| 陆川县| 北辰区| 余江县| 淮滨县| 南乐县| 奉化市| 连云港市|