論文分享 | PromptFuzz:用于模糊測試驅動程序生成的提示模糊測試

大語言模型擁有的強大能力可以用來輔助多種工作,但如何有效的輔助仍然需要人的精巧設計。分享一篇發表于2024年CCS會議的論文PromptFuzz,它利用模型提示生成模糊測試驅動代碼,并將代碼片段嵌入到LLVM框架中執行模糊測試。

論文摘要

制作高質量的模糊測試驅動程序不僅耗時而且還需要對被測目標有深入的了解,即使是最先進的自動化模糊測試驅動程序生成技術也未能達到預期。雖然用被測目標代碼派生(OSS-Fuzz)的方式可以達到深度狀態,但是程序邏輯的覆蓋范圍有限。解釋性模糊測試(Hopper)可以探索多數接口調用,不過需要在較大的搜索空間進行多次嘗試。

論文提出了 PromptFuzz ,一種覆蓋引導的模糊器,它可以迭代生成模糊測試驅動程序來探索未被發現的庫程序代碼。通過使用大模型提示詞探索被測程序的接口調用,本文提出了幾種關鍵技術,包括:1)指導程序生成,2)錯誤程序驗證,3)覆蓋引導的提示變異,4)變量約束的模糊器調度。PromptFuzz 在 14 個真實的庫程序上進行了評估,模糊測試驅動程序的分治覆蓋率相比于 OSS-Fuzz 和 Hopper 分別高出 1.61 倍和 1.63 倍。此外,所提方案在 49 次崩潰中檢測到了 33 個新的漏洞,其中 30 個漏洞已得到相應社區的確認。

1 背景介紹

模糊測試對軟件的安全性和可靠性至關重要。OSS-Fuzz為開源軟件部署了最先進的模糊測試器,截至2023年2月,已在850個項目中發現并解決了8900多個漏洞和28000個錯誤。開發者會選擇合適的模糊測試器(Fuzzer)并編寫高質量的模糊測試驅動程序(Fuzz Driver),驅動程序會解析來自模糊測試器的輸入并調用被測目標(Target or Library)的程序代碼。然而,編寫高質量的模糊測試驅動程序具有挑戰性,因為它既耗時又需要對被測目標有深入的了解。手動編寫的模糊測試驅動程序通常只調用了被測目標的一小部分功能,限制了模糊測試的能力。

與手動編寫的模糊測試驅動程序相比,自動化技術通過從源代碼或運行時反饋中學習被測目標的接口調用情況,從而派生出模糊測試驅動程序。FUDGE,FuzzGen,UTopia方案從源代碼中采用靜態分析的方式提取接口調用代碼,而APICraft,WINNIE則從進程執行中動態跟蹤記錄接口的調用順序。Hopper是最先進的模糊測試驅動程序生成解決方案(與本文同一團隊的工作,發表于2023年CCS會議),它會將對被測目標的模糊測試問題轉化為解釋性模糊測試問題,從接口調用的動態反饋中學習有效的接口使用情況。盡管可以覆蓋到大多數接口函數,但Hopper需要在廣闊的搜索空間中進行多次嘗試,才能找到有用且滿足深度的接口調用序列。

大語言模型(LLM)在生成代碼方面有出色的表現,可以在不依賴被測目標代碼的情況下可以有效地探索接口使用情況。以GPT系列為例,它們在廣泛的代碼預料庫上進行過訓練,能夠生成符合用戶意圖的代碼。之前的工作也嘗試使用LLM生成模糊測試驅動程序,但它們設計的指令僅限于特定場景,生成的驅動程序在接口調用上多樣性較低,無法覆蓋不常用代碼或深度狀態。本文引入了PromptFuzz,一種覆蓋引導的模糊測試器,它會迭代地改變提示詞以探索未發現的庫程序代碼。

2 基礎概念

  • 庫程序模糊測試

庫程序在軟件開發中被廣泛使用,因此針對它的模糊測試變得越來越重要。與命令行程序不同,庫程序擁有多個訪問入口點,即程序接口函數,這些入口有嚴格的格式約束規范。為了能夠利用現有的模糊測試器,相應的模糊測試驅動程序被開發出來,驅動程序從模糊測試器接受隨機字節,然后將這些字節轉換成結構良好的接口調用參數,喂給被測目標執行模糊測試。

論文給出了一個模糊測試驅動程序的例子,該驅動程序嵌入在LLVM框架中,每次執行一個測試用例。驅動程序接受數據和大小兩個參數,被測目標為視頻解碼庫libvpx,驅動程序執行初始化和數據轉換操作,調用庫程序的接口函數進行視頻解碼。

#include <vpx/vp8dx.h>
#include <vpx/vp8cx.h>
#include <vpx/vpx_decoder.h>extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {// Create the decoder configurationvpx_codec_dec_cfg_t dec_cfg = {0};...// Initialize the decodervpx_codec_ctx_t decoder;vpx_codec_iface_t *decoder_iface = vpx_codec_vp8_dx();vpx_codec_err_t decoder_init_res = vpx_codec_dec_init_ver(&decoder, decoder_iface, &dec_cfg, 0, VPX_DECODER_ABI_VERSION);if (decoder_init_res != VPX_CODEC_OK) {return 0;}// Process the input datavpx_codec_err_t decode_res = vpx_codec_decode(&decoder, data, size, NULL, 0);if (decode_res != VPX_CODEC_OK) {vpx_codec_destroy(&decoder);return 0;}// Get the decoded framevpx_image_t *img = NULL;vpx_codec_iter_t iter = NULL;while ((img = vpx_codec_get_frame(&decoder, &iter))!= NULL) {// Process the framevpx_img_flip(img);...}// Cleanupvpx_codec_destroy(&decoder);return 0;
}

  • 大語言模型

LLM是一種深度學習模型,具有非常復雜的架構和大量的參數,使得它們能夠從大量文本數據中獲取知識,GPT3,ChatGPT,GPT4是當前十分具有代表性的LLM。大語言模型被訓練為預測下一個詞,表示為 w n + 1 w_{n+1} wn+1?,給定一個詞序列 w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1?,w2?,...,wn?,最大化語言模型的目標函數,如下列公式。

P ( w 1 , w 2 , . . . , w n ) = ∏ i = 1 n P ( w i ∣ w 1 , w 2 , . . . , w i ? 1 ) P(w_1,w_2,...,w_n)=\prod^n_{i=1}P(w_i|w_1,w_2,...,w_{i-1}) P(w1?,w2?,...,wn?)=i=1n?P(wi?w1?,w2?,...,wi?1?)

在推理階段,LLM利用廣泛參數中學習到的模型權重,基于先前的token w 1 , w 2 , . . . , w n w_1,w_2,...,w_n w1?,w2?,...,wn?,自動回歸地生成下一個token w n + 1 w_{n+1} wn+1?,用戶提供的起始token被稱為提示詞。為了確保LLM產生的輸出與用戶給定指令保持一致,一系列LLM已通過強化學習訓練得到增強,例如ChatGPT和GPT4。

  • 基于大語言模型的模糊測試驅動程序生成

最近,出現一些利用LLM來增強模糊測試的研究,其主要的挑戰包括自動構造提示詞和對模型輸出的驗證。在基于LLM的模糊測試驅動程序生成中,提示詞通常由任務描述和上下文信息組成。為了盡可能提供信息和指導模型,任務描述應至少制定被測目標庫程序,以及包含在其中的接口函數。在早期的嘗試中,每個提示詞僅分配一個接口函數作為目標,過于簡單而且難以有效果。另一方面,LLM生成的代碼無法直接用于模糊測試,因為它產生的代碼很容易出錯。依賴編譯器或簡單規則進行輸出的驗證,只能報告語法或淺層邏輯錯誤,當其用作模糊測試驅動程序時,這種缺陷代碼會產生許多誤報。

3 系統設計

PromptFuzz通過覆蓋率引導的LLM提示詞生成高質量的模糊測試驅動程序以檢測庫程序錯誤,它會改變LLM提示詞以生成涵蓋更廣泛接口調用范圍的驅動程序,首先隨機選擇一個庫接口函數構造提示詞,然后根據覆蓋率反饋改變該提示詞,直到模糊測試達到被測目標的收斂,工作流程如圖1所示。

圖1 PromptFuzz模糊測試驅動程序生成流程

圖1 PromptFuzz模糊測試驅動程序生成流程

3.1 指導程序生成

論文選擇ChatGPT和GPT-4作為大語言模型來指導模糊測試驅動程序生成,盡管模型生成的程序并不總能夠嚴格遵循指令,但它們有助于探索有效的庫程序接口調用情況,可以用提示詞來引導大語言模型生成符合預期的程序。PromptFuzz使用目標庫程序和接口函數組合填充提示詞模板,如圖2所示包含以下組件。

  • 任務描述。說明了LLM應生成的驅動程序代碼,指定了庫程序的哪些接口函數在LLVMFuzzerTestOneInput函數中是必需的。
  • 庫程序上下文。包括了庫程序使用的頭文件,接口函數簽名,自定義類型等信息,通過整合對庫程序上下文的理解,顯著減少LLM產生幻覺的發生。
  • 庫程序說明。指導LLM生成符合庫程序所需指定模式的代碼,部分庫程序的接口函數可能從文件,文件流或描述符讀取輸入,對其進行相應規范。

圖2 提示詞模板

圖2 提示詞模板

3.2 錯誤程序驗證

PromptFuzz消除錯誤驅動程序通過如下三個步驟。

  1. 刪除C/C++編譯器識別出語法錯誤的驅動程序。
  2. 剩余的驅動程序編譯成可執行文件,結合多個運行時sanitizers,捕獲和分析與預期行為模式的偏差。
  3. 使用提供的語料庫對這些驅動程序進行模糊測試,刪除檢測到偏差的任何驅動程序。

在這部分模糊測試過程中,觸發獨特行為的輸入將添加到語料庫中,從而擴展進行更深入的運行時驗證。PromptFuzz同時還會計算驅動程序執行的代碼覆蓋率,刪除那些不符合代碼覆蓋標準的驅動程序,表明庫程序的接口函數得到了充分的利用,錯誤驅動程序驗證流程如圖3所示。

圖3 錯誤驅動程序驗證流程

圖3 錯誤驅動程序驗證流程

3.3 覆蓋引導的提示變異

為了創建連續多輪次的提示詞,PromptFuzz會改變前幾輪提示詞中的接口函數組合,生成不同的模糊測試驅動程序,同時以代碼覆蓋率作為反饋來生成有效的提示詞。

  • 能量分配

首先,PromptFuzz為每個接口函數分配相同的能量,在每次模糊測試迭代期間,更新訪問過的分支并計算接口函數的分支覆蓋率。

c o v ( i ) = 包含 i 的覆蓋的分支數 包含 i 的所有的分支數 cov(i)=\frac{包含i的覆蓋的分支數}{包含i的所有的分支數} cov(i)=包含i的所有的分支數包含i的覆蓋的分支數?

接著,按照AFLFast中的指數調度來更新其能量,令 s e e d ( i ) seed(i) seed(i)為調用接口函數 i i i的種子驅動程序數量, p r o m p t ( i ) prompt(i) prompt(i)表示為包含接口函數 i i i的提示詞數量,計算能量如下。

e n e r g y ( i ) = 1 ? c o v ( i ) ( 1 + s e e d ( i ) ) e × ( 1 + p r o m p t ( i ) ) e energy(i)=\frac{1-cov(i)}{(1+seed(i))^e \times (1+prompt(i))^e} energy(i)=(1+seed(i))e×(1+prompt(i))e1?cov(i)?

執行越少次數的接口函數將被分配更高的能量,于是在未來的提示詞中包含該接口函數的概率就越高。

  • 變異策略

然后,PromptFuzz會改變提示詞中的接口函數組合以指導模糊測試驅動程序生成,這些策略與傳統的模糊測試器類似,例如在C組合中插入A函數Insert(C,A),替換C組合中的A函數為B函數Replace(C,A,B),合并C組合和S組合形成新的組合CrossOver(C,S)

在接口函數能量的指導下,PromptFuzz通過變異策略組合接口函數以生成之前未探索過的組合,用density表示調用顯式數據依賴的庫程序接口函數的最大數量,用unique branches表示驅動程序執行時觸發的獨立分支數量。計算quality(g)=density(g) x (1+unique_branches(g))用以量化驅動程序的質量,以質量值更高為目標來指導變異策略

圖4 接口函數組合變異算法

圖4 接口函數組合變異算法

在每次模糊測試迭代過程中,PromptFuzz都會探索驅動程序種子集合并更新這些種子驅動程序的質量,使用庫程序接口函數能量和種子驅動程序質量的反饋,應用如圖4所示算法來選擇下一次迭代中使用的新接口函數組合。

3.4 變量約束的模糊器調度

為了使得種子驅動程序能夠執行模糊測試,PromptFuzz對其中的接口函數參數進行約束類型推斷,將部分參數從常量轉換為從模糊測試器輸入的任意字節的變量,例如數組長度、文件名、格式化字符串等,一個簡單的實例如圖5所示。

圖5 約束參數轉換例子

圖5 約束參數轉換例子

最終,PromptFuzz將種子驅動程序整合到模糊測試器,根據其提供的幾個特定字節來調度每個種子驅動程序,3.2節中進行錯誤程序驗證的模糊測試語料將用來作為驅動程序的初始輸入。此外,轉換之前的參數常量值也將形成初始語料,配合以進行模糊測試器的執行。

4 實現驗證

PromptFuzz用Rust語言實現了大約1萬7千行代碼,開源在倉庫https://github.com/PromptFuzz/PromptFuzz中,其中使用了clang_ast做抽象語法樹的提取,額外實現了FSan插件來進行文件描述檢查。論文在14個廣泛使用的開源項目上對PromptFuzz進行了評估,總體實驗結果,發現的已知漏洞,消融實驗和變異策略的比較,可以詳細去看原論文,這里不再贅述。

學習筆記

這篇論文做了很好的嘗試,利用大語言模型來生成針對被測目標的驅動程序,再使用傳統的模糊測試器來執行測試,相關工作OSS-Fuzz也做過嘗試。論文偏工程,有一定啟發,方法比較雜,與近期部分LLM+Fuzz方向的研究類似,大語言模型用于輔助仍需要進行提純,通過算法篩選和糾偏,但確實在自動化和發散性方面比較有效。最后,附上文獻引用和DOI鏈接:

Lyu Y, Xie Y, Chen P, et al. Prompt Fuzzing for Fuzz Driver Generation[C]//Proceedings of the 2024 on ACM SIGSAC Conference on Computer and Communications Security. 2024: 3793-3807.

https://doi.org/10.1145/3658644.3670396

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64584.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64584.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64584.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用Python爬蟲獲取1688商品詳情的探索之旅

在當今數字化時代&#xff0c;數據已成為一種寶貴的資源。對于電商行業來說&#xff0c;獲取商品信息尤為重要。阿里巴巴旗下的1688平臺&#xff0c;作為中國領先的B2B電子商務平臺&#xff0c;提供了海量的商品信息。本文將帶你了解如何使用Python爬蟲技術&#xff0c;合法合規…

[算法] [leetcode-1137] 第 N 個泰波那契數

1137 第 N 個泰波那契數簡單 泰波那契序列 Tn 定義如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的條件下 Tn3 Tn Tn1 Tn2 給你整數 n&#xff0c;請返回第 n 個泰波那契數 Tn 的值。 示例 1&#xff1a; 輸入&#xff1a;n 4 輸出&#xff1a;4 解釋&#x…

macOS上怎么制作條形碼

推薦使用Barcode Flow APP&#xff0c;目前支持iOS、macOS、iPadOS 大家可以在app store里面搜索 支持幾乎所有條形碼的格式 gs128、code128、DataMaxitr等等。 導出和打印都可以。 還支持工具規則自動生成。

位運算與操作符應用

一.二進制與進制轉化 1.概念解析 我們常常能聽見2進制&#xff0c;8進制&#xff0c;16進制這些講法。他們都是數值的不同表達形式。根據不同的進制大小有著不同的權重比例。我們生活中常用的是10進制數&#xff0c;也就是逢10進1&#xff0c;由此推理至其他進制。例如2進制就…

適配器模式概述

大體介紹 適配器模式&#xff08;Adapter Pattern&#xff09;是一種結構型設計模式&#xff0c;其核心目的是通過提供一個適配器類來使得原本接口不兼容的類可以一起工作。它通過將一個類的接口轉換成客戶端所期望的接口&#xff0c;使得原本因接口不兼容而無法一起工作的類可…

計算機專業考研 408 學科學習方法

計算機專業考研 408 學科涵蓋數據結構、計算機組成原理、操作系統和計算機網絡四門核心課程&#xff0c;內容多且難度大。但只要掌握科學的學習方法&#xff0c;便能化繁為簡&#xff0c;穩步提升。以下為大家詳細介紹 408 學科的學習方法。 一、基礎夯實階段&#xff1a;全面…

C++ 設計模式:命令模式(Command Pattern)

鏈接&#xff1a;C 設計模式 鏈接&#xff1a;C 設計模式 - 訪問器模式 命令模式&#xff08;Command Pattern&#xff09;是一種行為型設計模式&#xff0c;它將請求封裝成一個對象&#xff0c;從而使你可以用不同的請求對客戶進行參數化&#xff0c;對請求排隊或記錄請求日志…

html+css+js網頁設計 美食 美食4個頁面帶js

htmlcssjs網頁設計 美食 美食4個頁面帶js 網頁作品代碼簡單&#xff0c;可使用任意HTML輯軟件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html編輯軟件進行運行及修改編輯等操作&#xff09;。 獲取源碼 1&#…

swagger,showdoc,apifox,Mock 服務,dubbo,ZooKeeper和dubbo的關系

Swagger、ShowDoc 和 Apifox 之間的區別與優勢 Swagger、ShowDoc 和 Apifox 都是用于 API 文檔管理和測試的工具&#xff0c;但它們各有特色和適用場景。以下是詳細的比較&#xff0c;并附上每個工具的具體用法示例。 1. Swagger 特點與優勢&#xff1a; 廣泛采用: Swagger…

邊沿檢測電路漏檢原因分析

邊沿檢測電路漏檢原因分析 常用結構如下&#xff1a; module edge_detect1( input clk, input signal, output pe, //上升沿 output ne, //下降沿 output de //雙邊沿 );reg reg1;always(posedge clk) beginreg1 < signal; endassign pe (~reg1) & signal; assign…

嵌入式硬件雜談(七)IGBT MOS管 三極管應用場景與區別

引言&#xff1a;在現代嵌入式硬件設計中&#xff0c;開關元件作為電路中的重要組成部分&#xff0c;起著至關重要的作用。三種主要的開關元件——IGBT&#xff08;絕緣柵雙極型晶體管&#xff09;、MOSFET&#xff08;金屬氧化物半導體場效應晶體管&#xff09;和三極管&#…

鴻蒙開發:了解正則表達式

前言 從給出的文本中&#xff0c;按照既定的相關規則&#xff0c;匹配出符合的數據&#xff0c;其中的規則就是正則表達式&#xff0c;使用正則表達式&#xff0c;可以使得我們用簡潔的代碼就能實現一定復雜的邏輯&#xff0c;比如判斷一個郵箱賬號是否符合正常的郵箱賬號&…

Kafka的acks機制和ISR列表

Kafka 是一個流行的分布式流處理平臺&#xff0c;用于構建實時數據流管道和應用程序。在 Kafka 中&#xff0c;acks 機制和 ISR&#xff08;In-Sync Replicas&#xff09;列表是兩個重要的概念&#xff0c;它們共同確保消息的持久性和可靠性。 acks 機制 acks 機制是 Kafka 生…

在 Ubuntu 下通過 Docker 部署 Caddy 服務器

嘿&#xff0c;伙伴們&#xff01;今天我們來聊聊如何在 Ubuntu 系統下通過 Docker 部署 Caddy 服務器。Caddy 是一個現代的 Web 服務器&#xff0c;支持自動 HTTPS&#xff0c;簡單易用&#xff0c;特別適合快速搭建網站。而 Docker 則是一個讓你可以隔離和管理應用的神器。結…

計算機網絡?自頂向下方法:網絡層介紹、路由器的組成

網絡層介紹 網絡層服務&#xff1a;網絡層為傳輸層提供主機到主機的通信服務 每一臺主機和路由器都運行網絡層協議 發送終端&#xff1a;將傳輸層報文段封裝到網絡層分組中&#xff0c;發送給邊緣路由器路由器&#xff1a;將分組從輸入鏈路轉發到輸出鏈路接收終端&#xff1…

Linux top指令

top指令概述 top 是 Linux 系統中用于實時監控系統性能和進程信息的命令&#xff0c;功能強大且靈活。它提供了系統資源的動態視圖&#xff0c;包括 CPU、內存、運行中的進程等。 這個指令可以說是Linux中最基本的工具了&#xff0c;用來監視系統的實時運行狀態&#xff0c;類…

Qt監控系統放大招/歷經十幾年迭代完善/多屏幕輔屏預覽/多層級設備樹/網絡登錄和回放

一、前言說明 近期對視頻監控系統做了比較大的更新升級&#xff0c;主要就是三點&#xff0c;第一點就是增加了輔屏預覽&#xff0c;這個也是好多個客戶需要的功能&#xff0c;海康的iVMS-4200客戶端就有這個功能&#xff0c;方便在多個屏幕打開不同的視頻進行查看&#xff0c…

網絡原理(六): UDP 協議

目錄 1. UDP 協議 1.1 協議特點 1.2 協議報文格式 1.2.1 UDP 長度 1.2.2 校驗和 1. UDP 協議 在進行網絡編程時, 我們已經對 UDP 協議進行了簡單了解. 并且應用層的很多操作, 需要調用傳輸層的提供的接口, 基于 socket api 來進行完成的. 1.1 協議特點 UDP 協議具有以…

前端頁面展示本電腦的攝像頭,并使用js獲取攝像頭列表

可以通過 JavaScript 使用 navigator.mediaDevices.enumerateDevices() 獲取電腦上的攝像頭列表。以下是一個示例代碼&#xff0c;可以展示攝像頭列表并選擇進行預覽。 HTML JavaScript 實現攝像頭列表展示和預覽 <!DOCTYPE html> <html lang"zh-CN">…

【漫話機器學習系列】028.CP

Mallows’ Cp&#xff1a;標準化公式解析與應用 Mallows’ Cp 是一種常用的模型選擇工具&#xff0c;用于在一系列候選模型中權衡擬合度和復雜性&#xff0c;幫助我們選擇性能最優的模型。本文將基于其標準化公式展開詳細解析&#xff0c;并探討其應用場景、實現方法、優點與局…