- 【參考文獻】Xia C S, Paltenghi M, Le Tian J, et al. Fuzz4all: Universal fuzzing with large language models[C]//Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024: 1-13.
- 【注】本文僅為作者個人學習筆記,如有冒犯,請聯系作者刪除。
目錄
Abstract
1、Introduction
2、Background and Related Work
2.1、LLM
2.2、Fuzzing and Testing
3、Fuzz4All Approach
3.1、Autoprompting
3.1.1、Autoprompting Algorithm
3.1.2、Example: Autoprompting
3.1.3、Comparison with Existing Autoprompting Techniques
3.2、Fuzzing Loop
3.2.1、Fuzzing Loop Algorithm
3.2.2、Example: Fuzzing Loop
3.2.3、Oracle
4、Experimental Design
4.1、Implementation
4.2、Systems Under Test and Baselines
4.3、Experimental Setup and Metrics
5、Results
5.1、RQ1: Comparison against Existing Fuzzers
5.1.1、Coverage over Time
5.1.2、Generation Validity, Number, and Coverage
5.2、RQ2: Effectiveness of Targeted Fuzzing
5.3、RQ3: Ablation Study
5.4、RQ4: Bug Finding
5.4.1、Examples
6、Threats to Validity
7、Conclusion
Abstract
- 以編程或正式語言作為輸入的被測試系統(SUTs),例如編譯器、運行時引擎、約束求解器和具有可訪問API的軟件庫,尤為重要,因為它們是軟件開發的基本構建模塊。
- 現有針對此類系統的模糊測試工具通常只針對特定的語言,因此難以應用于其他語言,甚至是同一語言的不同版本。此外,現有模糊測試工具生成的輸入通常僅限于輸入語言的特定特性,因此難以揭示與其他或新特性相關的錯誤。
- 本文提出了Fuzz4All,這是第一個具有普遍性的模糊測試工具,能夠針對多種不同的輸入語言及其各種特性。Fuzz4All背后的關鍵思想是利用大語言模型(LLM)作為輸入生成和變異引擎,從而使該方法能夠為任何實際相關的語言生成多樣且真實的輸入。
- 為了實現這一潛力,我們提出了一種新穎的自動提示技術,該技術創建適合模糊測試的LLM提示,并引入了一種新穎的LLM驅動的模糊測試循環,該循環通過迭代更新提示來創建新的模糊測試輸入。
- 我們在接受九個系統測試的情況下評估了Fuzz4All,這些系統接受六種不同的語言(C、C++、Go、SMT2、Java和Python)作為輸入。評估結果顯示,在所有六種語言中,普遍模糊測試的覆蓋率都高于現有的語言特定模糊測試工具。此外,Fuzz4All在廣泛使用的系統中發現了98個錯誤,如GCC、Clang、Z3、CVC5、OpenJDK和Qiskit量子計算平臺,其中64個錯誤已被開發人員確認是先前未知的。
1、Introduction
- 傳統模糊測試方法面臨以下限制和挑戰:
- 與目標系統和語言緊密耦合
- 傳統的模糊器通常是針對特定的語言或特定的SUT而設計的。然而,設計和實現一個模糊器是非常耗時的。從一種輸入語言為另一種輸入語言重用實現模糊器的工作通常是不簡單的。此外,對一個SUT有效的模糊策略可能對另一個SUT根本不起作用。
- 缺乏進化支持
- 現實世界的系統都在不斷發展,例如,向輸入語言添加新的特性。為特定語言或SUT版本或SUT設計的傳統模糊器可能會在新版本上失去有效性,也不能輕易地用于測試新實現的特性。
- 生產能力受限
- 即使在特定目標語言的范圍內,基于生成和基于突變的模糊化往往也不能覆蓋很大一部分的輸入空間。
- 基于生成的模糊器嚴重依賴于輸入語法來合成有效的代碼,此外還配備了語義規則,以確保合成代碼的有效性。為了生成大量有效的模糊輸入或偏離困難的斷層模型語言特征,基于生成的模糊器通常使用完整語言語法的一個子集,這限制了它們只測試所有語言特征的一個子集。
- 同樣,基于突變的模糊器也受到其突變操作符的限制,需要難以獲得的高質量的種子。
- 與目標系統和語言緊密耦合
- 我們提出了Fuzz4All,這是第一個通用的模糊器,因為它可以針對許多不同的輸入語言和這些語言的不同特性。我們的方法與現有的通用模糊器不同,例如,AFL和libFuzzer,它們使用極其簡單的突變方式,并且不知道目標語言,因此難以產生有意義的編程語言模糊輸入。相反,我們的關鍵思想是利用一個大型語言模型(LLM)作為輸入生成和突變引擎。因為LLM對各種編程語言和其他形式語言中的大量示例進行了預訓練,所以它們伴隨來了對這些語言的語法和語義的隱含理解。
- Fuzz4All的輸入是用戶提供的描述SUT的文檔,以及可選擇關注的SUT的特定特性。例如,以文檔、示例代碼或正式規范的形式。但是,這些用戶輸入可能過于冗長,無法直接用作LLM的提示符。我們不要求用戶手動設計提示,而是提供一個自動提示步驟,自動將所有用戶提供的輸入提煉為簡潔有效的模糊提示。此提示符是對生成模糊輸入的LLM的初始輸入。
- 由于在相同的提示下連續采樣會導致許多類似的模糊輸入,我們提出了一個LLM驅動的模糊循環,它迭代地更新提示以生成一組不同的模糊輸入。為此,Fuzz4All將之前迭代中生成的模糊輸入與自然語言指令結合起來,例如,要求修改這些輸入。然后,LLM生成的模糊輸入傳遞給SUT,我們根據用戶提供的測試預測對其進行驗證,例如檢查系統崩潰。
- Fuzz4All解決了前面討論的傳統模糊器的局限性和挑戰。
- Fuzz4All通過使用LLM作為生成引擎,而不是精心設計一個單一用途的模糊器,可以應用于廣泛的SUT和輸入語言。
- 與現有的針對特定版本的SUT或輸入語言的模糊器相比,Fuzz4All可以很容易地隨著目標而進化。例如,為了模糊地測試一個新實現的特性,用戶可以簡單地提供與該特性相關的文檔或示例代碼。
- 為了解決傳統模糊器受限的生成能力,Fuzz4All利用了llm對數十億個代碼片段進行了預先訓練的這一事實,使它們能夠創建大量可能服從的示例輸入語言的句法和語義約束。最后,Fuzz4All不需要任何SUT的插樁,這使得該方法在實踐中易于應用。
- 本文貢獻如下:
- Universal fuzzing:我們引入了一個模糊測試的新維度,它直接利用LLM的多語言功能來對許多具有廣泛有意義的輸入的SUT進行模糊測試。
- Autoprompting for fuzzing:我們提出了一個新的自動提示階段,來支持一般和目標模糊。通過自動提取用戶輸入為一個提示,該提示能夠有效生成SUT輸入的提示。
- LLM-powered fuzzing loop:我們提出了一種算法,通過選擇的例子和生成策略迭代修改提示,不斷生成新的模糊輸入。
- Evidence of real-world effectiveness:我們通過六種流行語言和九種真實的SUT(例如,GCC、CVC5、Go、javac和Qiskit)展示,與最先進的模糊器相比,我們的方法顯著提高了覆蓋率(平均36.8%),檢測到98個錯誤,其中64個已經被確認為之前未知。
2、Background and Related Work
2.1、LLM
- 自然語言處理(NLP)的最新發展導致了大型語言模型(LLMs)對自然語言和代碼任務的廣泛采用。最先進的LLMs基于transformers,可分為decoder-only(如GPT3和StarCoder)、encoder-only(如BERT和CodeBERT)和encoder-decoder(BART和CodeT5)模型。最近,基于指令的LLMs(例如,ChatGPT和GPT4)和使用來自人類反饋(RLHF)的強化學習進行微調的LLMs被證明可以理解和遵循復雜的指令。
- LLM通常要么是經過微調的,要么是提示執行特定的任務。微調通過對特定于任務的數據集的進一步訓練來更新模型的權重。然而,合適的數據集可能無法獲得,而且隨著LLM的規模的持續增長,對LLM的微調也越來越昂貴。另一方面,提示不需要顯式地更新模型權重,但為LLM提供了任務的描述,并可選地提供了一些解決任務的示例。選擇輸入(即提示)的過程被稱為提示工程,即用戶嘗試不同的輸入指令,直到找到一個工作良好的輸入指令。最近,研究人員提出了自動提示,一種使用LLM梯度來選擇軟提示的自動過程,即連續向量嵌入,或硬提示,即自然語言文本。甚至最近,研究人員通過計算有效性的代理分數來代替基于梯度的方法。
- 這項工作利用LLM來解決模糊測試的重要問題。與傳統的自動提示和基于代理的方法不同,我們的自動提示策略直接使用GPT4綜合提示,并根據一個模糊的特定目標對它們進行評分。
2.2、Fuzzing and Testing
- 最近,研究人員還直接利用LLM來模糊特定的庫,例如,TitanFuzz使用Codex生成種子程序,InCoder執行基于模板的突變以模糊深度學習庫。
- 與之前的基于學習和LLM的模糊器不同,Fuzz4All可以很容易地應用于許多編程語言。以前的工作是訓練特定于語言的模型或需要特定于語言的解析。即使是TitanFuzz,也是專門為具有手工提示和突變模式的深度學習庫設計的,因此不能輕易擴展到其他SUT。此外,與現有的以特定語言生成一般模糊輸入的技術不同,Fuzz4All還支持目標模糊,它可以生成專注于選定特性的代碼片段。
- 除模糊測試外,LLM還被應用于單元測試生成的相關問題。CodaMosa將傳統的基于搜索的軟件測試與查詢Codex相結合,以便在達到覆蓋平臺時生成新的單元測試。TestPilot使用方法源代碼和示例用法提示Codex以生成單元測試并修復錯誤生成的測試。與這些基于LLM的測試生成器相比,它們需要特定類型的輸入(例如,函數源代碼),并且只用于單元測試,通過使用我們的新型自動提示階段,Fuzz4All可以接受任意格式的輸入,用于一般和目標的模糊。此外,這種單元測試發生器通常需要手動工作來檢查或完成測試,因為它們受到自動生成的測試神諭的限制,即使是最先進的也不能總是可靠地產生。相反,Fuzz4All利用了廣泛使用的模糊oracles,比如崩潰,并且是完全自動化的。
3、Fuzz4All Approach
- 圖 1 概述了我們的方法。Fuzz4All 首先接收任意的用戶輸入,這些輸入描述了要生成的模糊測試輸入,例如,被測試系統(SUT)的文檔、示例代碼片段或規范。由于用戶輸入可能冗長、冗余且部分不相關,該方法將其提煉為一個簡潔但信息豐富的模糊測試提示。為此,Fuzz4All 通過使用一個大型的、最先進的提煉語言模型執行自動提示步驟(第 3.1 節),以采樣多個不同的候選提示。每個候選提示都會傳遞給生成語言模型來生成代碼片段(即模糊測試輸入)。然后,Fuzz4All 選擇生成最高質量模糊測試輸入的提示。
- Fuzz4All建立在兩個模型之上,一個是減少給定用戶輸入的提煉LLM,另一個是創建模糊輸入的生成LLM,以平衡不同LLM提供的成本和收益之間的權衡。因為提煉LLM需要理解和提取任意的用戶輸入,所以我們使用了一個具有很強的自然語言理解能力的高端的、大型的基礎模型。然而,由于自回歸生成的高推理成本,直接使用這樣一個大的模型進行輸入生成將是低效的。相反,為了執行高效的模糊測試,Fuzz4All使用了一個更小的模型作為生成LLM。我們使用最先進的GPT4和StarCoder實現了Fuzz4All。
- 使用通過自動提示選擇的最佳提示作為生成語言模型的初始輸入提示,接下來我們進入模糊測試循環(第 3.2 節),在這個循環中,Fuzz4All 不斷對生成語言模型進行采樣以生成模糊測試輸入。為避免生成許多相似的模糊測試輸入,Fuzz4All 在每次迭代中不斷更新輸入提示。具體來說,該方法選擇一個先前生成的輸入作為示例,該示例展示了我們希望模型生成的未來輸入的類型。除了該示例,Fuzz4All 還會在初始提示中附加一個生成指令,以引導模型生成新的模糊測試輸入。這個過程會不斷重復,同時將生成的模糊測試輸入傳遞到被測試系統(SUT)中,并根據用戶定義的斷言(例如崩潰)檢查其行為。
3.1、Autoprompting
- 下面介紹Fuzz4All如何通過自動提示將給定的用戶輸入提煉的提示來進行模糊測試。用戶輸入可以描述一般的SUT,或要測試的SUT的特定特性。如圖1所示,用戶輸入可以包括技術文檔、示例代碼、規范,甚至是不同模式的組合。傳統的模糊器需要輸入遵循特定的格式,例如,代碼片段作為種子或格式良好的規范,Fuzz4All可以直接理解用戶輸入中的自然語言描述或代碼示例。然而,用戶輸入中的一些信息可能是冗余的或不相關的,因此,直接使用用戶輸入作為生成LLM的提示可能是無效的,我們在第5.3節中的消融研究證實了這一點。因此,自動提示的目標是生成一個精煉的輸入提示,以實現有效的基于LLM的模糊測試。
3.1.1、Autoprompting Algorithm
- 算法1描述了Fuzz4All的自動提示過程。輸入的內容是用戶輸入和要生成候選提示的數量。最終輸出是選擇用于模糊活動的輸入提示。由于我們的目標是使用提煉LLM生成提示,提取用戶提供的信息,我們給提煉LLM以下自動提示指令:“Please summarize the above information in a concise manner to describe the usage and functionality of the target”。設 MD 為提煉語言模型,userInput 為用戶輸入,APInstruction 為自動提示指令。生成的提示 prompt 可以形式化為條件概率:MD (prompt | userInput, APInstruction)。
- Fuzz4All 首先使用temperature為 0 的貪心采樣生成一個候選提示(第 2 行)。通過首先以低temperature采樣,該算法以高置信度獲得一個合理的解決方案。這種方法在其他領域也被普遍使用,例如程序綜合,其中首先評估貪心輸出以檢查它是否能解決問題。
- 然后,該算法繼續以更高的temperature進行采樣以獲得更多樣化的提示=?5 行),如先前的工作所做的那樣。與貪心方法相比,高temperature采樣會產生不同的提示,每個提示都可以為用戶輸入提供獨特的提煉總結。每個生成的提示都會添加到候選提示列表中(第 6 行),直到算法達到所需的候選數量。
- 為了挑選在模糊測試步驟中使用的最佳輸入提示,該算法通過執行一個小規模的模糊測試實驗來評估每個候選提示。具體來說,該方法將每個提示作為生成語言模型的輸入,為每個提示生成多個代碼片段。然后,Fuzz4All 根據一個評分函數為每個提示生成的代碼片段打分。雖然評分函數可以基于各種不同的指標,例如覆蓋率、漏洞發現或生成的模糊測試輸入的復雜性,但為了使該方法輕量且通用,我們的評分函數是有效(即被目標被測試系統(SUT)接受)的獨特生成代碼片段的數量。選擇這個指標是因為對于模糊測試,我們希望模糊測試輸入對于 SUT 內部深處的邏輯是有效的或接近有效的。設 MG 為生成語言模型,p 為候選提示,isValid 是一個函數,如果生成的代碼 c 有效則返回 1,否則返回 0。我們的默認評分函數定義為:∑_{c∈MG(p)} [isValid(c, SUT)] 。最后,Fuzz4All 選擇得分最高的輸入提示(第 7 行)作為用于模糊測試的初始輸入提示。總之,我們的自動提示步驟結合了提示生成和評分,這使得 Fuzz4All 能夠自動生成并選擇適合模糊測試目標的提示。
3.1.2、Example: Autoprompting
- 圖 2 展示了一個由我們的自動提示算法生成的輸入提示的示例。該示例是針對模糊測試 C++編譯器的,特別聚焦于 C++23 中引入的新特性 std::expected。
- 作為用戶輸入,我們將原始的 cppreference 文檔[2]傳遞給 Fuzz4All,它跨越多個屏幕長度,包含小表格和冗長的描述(498 個單詞,3262 個字符)。相比之下,自動提示算法創建的提煉后的輸入提示提供了關于目標特性更簡潔的自然語言描述(214 個單詞,1410 個字符)。該輸入提示包含了關于如何使用 std::expected 的高級描述。例如,輸入提示包含了一個簡潔的句子(以橙色突出顯示),總結了該特性有用的情況。此外,輸入提示還包含了關于輸入的描述,以及該特性的不同用法(即成員函數)。例如,函數 and_then、transform、or_else 和 transform_error 在原始文檔中有非常相似的描述,并且每個函數都會重復。相反,在提煉后的輸入提示中,這些函數以簡潔的方式組合在一起,仍然說明了它們可以如何被使用。使用提煉后的輸入提示,Fuzz4All 能夠生成有效地針對 C++編譯器的 std::expected 特性的模糊測試輸入。
3.1.3、Comparison with Existing Autoprompting Techniques
- 據我們所知,我們是第一個使用黑箱自動提示從任意用戶輸入中為軟件工程任務自動提煉知識的。與自然語言處理和軟件工程中先前關于自動提示的工作(通過訪問模型梯度來優化提示)相比,我們的自動提示只需要對提煉語言模型進行黑箱式的采樣訪問。雖然使用評分函數來評估每個提示與自然語言處理中的最新工作類似,但我們的評分函數直接在生成有效代碼片段這一確切的下游任務上評估提示,而不是使用近似的代理評分函數。
3.2、Fuzzing Loop
- 給定在Fuzz4All的第一步中創建的輸入提示,模糊測試循環的目標是使用生成LLM生成不同的模糊測試輸入。然而,由于LLM的概率性質,使用相同的輸入進行多次采樣將產生相同或相似的代碼片段。對于模糊測試,我們的目標是避免這種重復的輸入,而是希望生成一組不同的模糊輸入,以覆蓋新的代碼和發現新的bug。為了實現這一目標,我們利用LLM的能力來利用示例和自然語言指令來指導生成。
- 模糊循環的最高思想是通過從以前迭代中選擇一個模糊輸入示例并指定生成策略,不斷增加原始輸入提示。使用示例的目的是演示我們希望LLM生成的代碼片段類型。生成策略被設計為說明如何處理所提供的代碼示例。這些策略受到傳統模糊器的啟發,模仿它們合成新的模糊輸入的能力(如基于生成的模糊器),并生成以前生成的輸入的變體(如基于突變的模糊器)。在模糊循環的每一次新迭代之前,Fuzz4All都向輸入提示添加一個示例和生成策略,使生成LLM能夠不斷創建新的模糊輸入。
3.2.1、Fuzzing Loop Algorithm
- 算法 2 描述了模糊測試循環。輸入為初始輸入提示和模糊測試預算。最終輸出是由用戶定義的斷言所識別的一組漏洞。首先,該算法初始化生成策略(生成新的、變異現有的和語義等價),這些策略將在模糊測試循環中用于修改輸入提示(第 2 行)。圖 3(右上角)列出了我們的三種生成策略及其相應的指令。對于生成語言模型 MG 的首次調用,該算法還沒有任何模糊測試輸入的示例。因此,它將“生成新的”生成指令附加到輸入提示中,引導模型生成第一批模糊測試輸入(第 3 行)。
- 接下來,算法進入主模糊測試循環(第 5 - 9 行),不斷更新提示以創建新的模糊測試輸入。為此,算法從前一批生成的模糊測試輸入中選擇一個示例,從所有對 SUT 有效的模糊測試輸入中隨機挑選(第 6 行)。除了該示例,算法還隨機選擇三種生成策略中的一種(第 7 行)。生成策略要么指示模型變異所選示例(變異現有的),生成一個與示例語義等價的模糊測試輸入(語義等價),要么想出一個新的模糊測試輸入(生成新的)。算法將初始輸入提示、所選示例和所選生成策略連接成一個新的提示,然后用這個提示查詢生成語言模型以生成另一批模糊測試輸入(第 8 行)。
- 主模糊測試循環會一直重復,直到算法用完模糊測試預算。對于每個創建的模糊測試輸入,Fuzz4All 將輸入傳遞給 SUT。如果用戶定義的斷言識別到意外行為,例如崩潰,那么算法將一份報告添加到檢測到的漏洞集合中(第 4 行和第 9 行)。
3.2.2、Example: Fuzzing Loop
- 圖 3 展示了我們的模糊測試循環如何使用輸入示例和生成策略來創建不同的模糊測試輸入。在這種情況下,我們正在對一個 SMT 求解器進行模糊測試,其中輸入是用 SMT2 語言編寫的邏輯公式。最初,沒有示例,因此,算法使用“generate-new”策略來合成新的模糊測試輸入。接下來,以一個生成的、有效的模糊測試輸入作為示例,算法基于“mutate-existing”策略查詢模型以創建一個新的輸入,該策略旨在對所選示例進行變異。我們觀察到新的模糊測試輸入通過交換變量的類型以及添加一些計算,對之前的輸入進行了細微的修改。在接下來的模糊測試迭代中,算法選擇之前生成的模糊測試輸入作為示例,并使用“semantic-equiv”生成策略,旨在創建一個不修改給定示例語義的輸入。這一次,我們觀察到新的模糊測試輸入只是向所選示例添加了一個語法標簽。事實上,示例中所示的生成策略的組合幫助 Fuzz4All 生成了一個導致 SMT 求解器意外崩潰的模糊測試輸入。該崩潰暴露了 Fuzz4All 在我們的評估期間檢測到的一個真實世界的漏洞,該漏洞已被開發人員確認并修復。
3.2.3、Oracle
- 在模糊測試循環期間,Fuzz4All 生成的模糊測試輸入可用于根據斷言檢查被測試系統(SUT)的行為以檢測漏洞。每個 SUT 的斷言都是定制的,并且可以由用戶完全定義和定制。例如,在對 C 編譯器進行模糊測試時,用戶可以定義一個差異測試斷言,用于比較編譯器在不同優化級別下的行為。在本文中,我們關注簡單且易于定義的斷言,例如由于段錯誤和內部斷言失敗導致的崩潰,更多細節在第 4.2 節中討論。
4、Experimental Design
- 我們根據以下研究問題對Fuzz4All進行了評估:
- RQ1:Fuzz4All與現有的模糊器相比如何?
- RQ2:Fuzz4All在執行目標模糊化方面的效果如何?
- RQ3:不同的組件如何促進Fuzz4All的有效性?
- RQ4:Fuzz4All發現了什么真實的漏洞?
4.1、Implementation
- Fuzz4All 主要是用 Python 實現的。Fuzz4All 的自動提示和模糊測試循環組件僅包含 872 行代碼(LoC)。與傳統的模糊測試器(如 Csmith(> 80K LoC))相比,后者在實現生成器時需要大量的人工工作,Fuzz4All 的實現非常輕量。Fuzz4All 使用 GPT4作為提煉語言模型來執行自動提示,因為該模型在廣泛的基于自然語言處理的推理任務中是最先進的。具體來說,我們通過OpenAI API使用 gpt-4-0613 檢查點,最大令牌數(max_token)為 500。max_token 強制提示始終適合生成語言模型的上下文窗口。對于自動提示,我們采樣四個候選提示,每個生成 30 個模糊測試輸入,并使用基于有效率的評分函數進行評估(如第 3.1.1 節所述)。對于模糊測試循環,我們使用 Hugging Face 實現的 StarCoder模型作為生成語言模型,該模型在超過 80 種語言的超過一萬億個代碼令牌上進行了訓練。在生成模糊測試輸入時,我們的默認設置使用溫度為 1,批處理大小為 30,最大輸出長度為 1024,使用核采樣,top-p 為 1。
4.2、Systems Under Test and Baselines
- 為了展示 Fuzz4All 的通用性,我們在六種輸入語言和九個被測試系統(SUT)上對其進行評估。表 1 展示了每種語言、SUT 以及相應的基準工具。請注意,我們對每種語言的一個 SUT 進行覆蓋率的比較,表 1 的最后一列顯示了用于覆蓋率測量的 SUT 版本。
4.3、Experimental Setup and Metrics
- Fuzzing campaigns。對于 RQ1,我們使用 24 小時的模糊測試預算(包括自動提示)。為了考慮方差,我們對 Fuzz4All 和基線都重復實驗五次。由于實驗成本較高,對于后續的研究問題(RQs),我們使用 10,000 個生成的模糊測試輸入作為模糊測試預算,并在消融研究中重復四次。
- Environment。實驗在一個具有 256GB 內存、運行 Ubuntu 20.04.5 LTS 操作系統的 64 核工作站上進行,配備 4 個 NVIDIA RTX A6000 GPU(每次模糊測試運行僅使用一個 GPU)。
- Metrics。我們使用廣泛采用的代碼覆蓋率指標來評估模糊測試工具。為了統一,我們報告評估中所研究的每個目標的行覆蓋率。遵循先前的工作,我們使用Mann-Whitney U-test來計算統計顯著性,并在適用的表(表 2 和表 4)中用*表示顯著(p < 0.05)的覆蓋率結果。我們還測量輸入的有效率(%有效),即生成的有效且唯一的模糊測試輸入的百分比。由于 Fuzz4All 支持通用和有針對性的模糊測試,為了評估有針對性的模糊測試的有效性,我們報告命中率,即使用特定目標特征(通過簡單的正則表達式檢查)的模糊測試輸入的百分比。最后,我們還報告模糊測試最重要的指標和目標:Fuzz4All 為我們的九個被測試系統(SUT)中的每個所檢測到的漏洞數量。
5、Results
5.1、RQ1: Comparison against Existing Fuzzers
5.1.1、Coverage over Time
5.1.2、Generation Validity, Number, and Coverage
5.2、RQ2: Effectiveness of Targeted Fuzzing
5.3、RQ3: Ablation Study
5.4、RQ4: Bug Finding
5.4.1、Examples
6、Threats to Validity
- 內部
- 主要的內部威脅來自于Fuzz4All的實施。為了解決這個問題,我們進行了代碼審查和測試,以確保正確性。此外,我們盡可能地從它們提供的復制包中運行每個基線。
- 外部
- 主要的外部威脅是我們的評估目標。為了支持我們的一般性主張,我們在Fuzz4All應用于六種語言的九種不同的sut上。此外,為了解釋長時間的模糊運行的差異,我們重復24小時的模糊運動5次,并檢查有統計學意義的結果。由于一代LLM利用了在去年完成的培訓中獲得的知識,使用本工作中使用的LLM(StarCoder)的精確檢查點重新應用Fuzz4All可能會由于數據轉移而降低未來的有效性。Fuzz4All都可以使用自動提示步驟來緩解這種情況,其中更最新的文檔/示例代碼允許模型生成最新的模糊輸入。另一個威脅來自于使用提煉LLM來產生初始輸入,其中LLM可能會產生“幻覺”,即產生化妝或不準確信息。這種限制對于大多數使用LLM的管道來說都是常見的,我們希望在未來的工作中解決這個問題。
7、Conclusion
- 我們提出了 Fuzz4All,這是一個通用的模糊測試器,利用大語言模型(LLMs)支持對接受多種編程語言的任意被測試系統(SUT)進行通用和有針對性的模糊測試。Fuzz4All 使用了一個新穎的自動提示階段來生成輸入提示,簡潔地總結了用戶提供的輸入。在其模糊測試循環中,Fuzz4All 迭代地使用代碼示例和生成策略更新初始輸入提示,旨在生成多樣化的模糊測試輸入。對六種不同語言的九個不同 SUT 的評估結果表明,與最先進的工具相比,Fuzz4All 能夠顯著提高覆蓋率。此外,Fuzz4All 能夠檢測到 98 個漏洞,其中 64 個已被開發人員確認為先前未知的。