Smart Contracts Fuzzing: Current Problems and Proposed Solutions
三句話摘要
以 LLM 引導的三層模糊測試框架,系統性挖掘智能合約的經濟型漏洞。 將 LLM 靜態分析、CFG 引導狀態池、GPU 平行執行組合成三層框架,是目前最有潛力系統性覆蓋智能合約經濟型漏洞的模糊測試路徑。 漏洞的本質是狀態操控:所有智能合約攻擊最終都是「改變特定儲存槽狀態」再「觸發漏洞函數」,因此模糊測試的核心是找出最優函數序列與輸入參數的組合,兩者缺一不可。
重點整理
重點- 1
漏洞的本質是狀態操控:所有智能合約攻擊最終都是「改變特定儲存槽狀態」再「觸發漏洞函數」,因此模糊測試的核心是找出最優函數序列與輸入參數的組合,兩者缺一不可。
- 2
現有工具對複雜類型束手無策:傳統 fuzzer(如 Harvey、libAFL)面對動態元組、動態陣列、calldata 嵌套等 ABI 類型時,參數空間爆炸,且無法推導「呼叫者參數」如何影響「被呼叫者參數」的外部呼叫鏈依賴關係。
- 3
LLM 可扮演智能靜態分析器:透過讓 LLM 解析源碼,識別哪條控制流路徑通往潛在漏洞基本塊,再用 assembly 插樁(如 `0x7777F7` 標記)對應到 CFG 的具體節點,讓 fuzzer 知道「要進哪個分支」。
- 4
狀態多樣性是覆蓋率的關鍵:引入「狀態池」概念,記錄每次執行後的有趣儲存槽快照;再透過重新執行 callchain 組合不同狀態,生成更多樣的測試起點,解決傳統 fuzzer 只能從初始狀態出發的侷限。
實用技巧與重點
乾貨- Core 漏洞:將第一個 action 設為借貸、第二個設為 null(無效 opcode),即可繞過 solvent check,損失 170 萬美元
- Realt Protocol 漏洞:for 迴圈重複 50–53 次買賣操作推高價格;實際上只需 1–5 次即可偵測到價格操控行為
- Balancer 漏洞路徑:`batchSwap` → `bestSwap` → 內部 `swap` → pool 合約 `bar` → 觸發 upscale → 舍入誤差(rounding error)
- Moonbirds Hack 範例:攻擊者以 calldata 作為輸入,解碼後注入惡意地址繞過驗證,資金約在 300k 區塊被提取
- 距離度量(Distance Metric):操作碼層級比較(如 balance > 1),fuzzer 從 1,000,000 開始,根據與目標值的距離決定增/減方向
- 工具與方法:Harvey mutator、libAFL、CFG(控制流圖)分析、EVM GPU 平行執行(參考 MU 學術論文)、Echidna / Smartian 狀態快照機制
- 三層架構:① LLM(T 分析 + 外部呼叫追蹤 + calldata 生成 + 動態執行時資訊)② 狀態模糊測試(CFG 三階段引導 + 狀態池 + 狀態多樣性)③ EVM 轉 GPU 平行代碼執行
結論
結論“將 LLM 靜態分析、CFG 引導狀態池、GPU 平行執行組合成三層框架,是目前最有潛力系統性覆蓋智能合約經濟型漏洞的模糊測試路徑。”
完整解析
詳細智能合約的安全問題長期阻礙加密貨幣大規模普及,講者 Andy Mley 基於此動機創辦安全公司,試圖從根本上解決合約漏洞挖掘的效率問題。他首先將「漏洞利用」重新定義為一個雙層優化問題:第一層是選擇正確的函數序列(例如「存入抵押品 → 清算 → 移除抵押品」),第二層是在確定序列後,找出每個函數的最佳輸入參數。這兩步的組合構成了所謂的「價值提取」,也是所有經濟型漏洞的本質。
為了說明模糊測試為何能找到真實漏洞,講者以三個案例展開論述。Core 協議的漏洞起因於將一個無效操作碼作為 action 陣列的第二個元素,從而繞過了清算者驗證,造成 170 萬美元損失;Realt Protocol 的攻擊者用 50 次迴圈交替買賣來操縱價格,而講者指出實際上只需 1–5 次循環 fuzzer 就能偵測到異常,這體現了「降維」思路;Balancer 的漏洞則深藏在多層內部函數呼叫中,`batchSwap` 最終觸發了 upscale 導致舍入誤差,難點在於如何讓 fuzzer 知道該走這條深層路徑。
現有模糊測試工具的核心痛點在於無法處理複雜的參數類型與依賴關係。動態陣列、動態元組、嵌套 calldata(如 Moonbirds 攻擊中以原始位元組作為輸入再解碼)使參數空間爆炸;跨合約的外部呼叫讓 fuzzer 無法推導「入口函數參數」與「下游被呼叫函數參數」之間的映射關係;代理合約、多地址協議、以及 Uniswap v4 hook 這類動態連接又進一步放大了搜索空間。
針對上述問題,講者提出三層解決方案。第一層以 LLM 作為智能靜態分析器:識別源碼中的潛在漏洞基本塊,透過在源碼插入 assembly 標記(如 `0x7777F7`)將 LLM 的語義理解對應到 CFG 的具體節點;同時讓 LLM 分析外部呼叫鏈,自動推導出入口函數中哪個參數會影響下游的關鍵字段,並生成複雜 calldata 的編碼腳本。第二層是狀態引導的模糊測試:透過解析 CFG 的跳轉操作碼確定進入目標分支所需修改的儲存槽,並將每次執行的有趣狀態存入「狀態池」,再通過重組 callchain 生成多樣化起始狀態,解決傳統工具只能從初始零狀態出發的限制。第三層則將 EVM 位元組碼轉換為 GPU 可平行執行的代碼,大幅提升測試吞吐量。問答環節中講者進一步說明距離度量是引導參數變異的核心機制,讓 fuzzer 能像二元搜索一樣,根據與分支條件的距離決定參數的增減方向。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

