智慧合約安全初篩系統 (SCSA)
以確定性 Slither AST 分析與 SQLite 證據圖譜為核心,嚴格約束 LLM 生成邊界的合約初篩輔助系統。
01 · 問題定義與威脅模型
使用生成式 AI 分析智慧合約的安全漏洞時,LLM 經常出現嚴重的幻覺:憑空捏造不存在的重入漏洞、虛構 CVE 編號,或是對編譯器語法樹層級的關鍵狀態變化視而不見。相反地,傳統靜態分析工具(如 Slither)產出的原始日誌過於龐雜且雜訊甚高,令開發者難以快速判讀。
SCSA 的建立旨在彌合此鴻溝。它建立了確定性的事實基礎:由靜態分析器掌握合約漏洞事實,將正規化後的分析結果存入不可竄改的本機 SQLite 證據圖譜(Evidence Graph),並嚴格限制 LLM 僅能針對已獲證明的證據節點進行解釋與補丁建議。
02 · 系統限制與非協商指標
LLM 絕不創造或升級漏洞事實。所有列入報告的缺失必須嚴格對應來自 Slither 的 AST 偵測證據。
預設停用本機編譯建構(Foundry/Hardhat),防止不受信任的外部專案在執行時夾帶惡意安裝腳本。
每一項報告中的漏洞皆可精確追溯至檔案路徑、AST 節點 ID、原始碼行號與偵測規則。
03 · 系統架構與證據約束機制
不受信任的 Solidity 原始碼通過受保護的匯入層進入 Slither AST 靜態分析。正規化後的結果寫入 SQLite 證據圖譜,形成本機 LLM 解釋的嚴格邊界。
確定性初篩與受約束解釋機制
01. 安全匯入:防範路徑遍歷與惡意腳本,本機編譯器預設拒絕(fail-closed),安全暫存未受信任的 Solidity 原始碼。
02. 語法樹分析:執行 27 項已對應的靜態偵測器,產出可嚴格驗證的 AST 程式碼區段與呼叫圖譜。
03. 規則正規化:將異質的分析器輸出對應至統一結構,標註 CWE/SWC 標準識別碼。
04. 證據圖譜:將驗證後的漏洞事實與合約關係持久化至 SQLite,作為不可竄改的事實驗證節點。
05. 受約束解釋:LLM 僅能在 SQLite 證據節點的嚴格邊界內生成解說與修復建議,絕不捏造漏洞。
04 · 三項關鍵技術決策
1. 分析器證據擁有漏洞事實,LLM 僅負責解釋
證據邊界背景與考量:直接將原始合約丟給 LLM 判斷安全性,結果往往充斥著極高誤報率與虛構的漏洞。
架構決策:僅允許 27 項經過精細對應的 Slither AST 偵測器將缺失升級至正式初篩報告。未對應的輸出保留於 SQLite 作為原始軌跡。生成模型被嚴格限制在解釋既有事實的範疇。
成效與取捨:在 50 個公開合約的 Slither50 v2 基準測試中,達成 100% 的召回率,且所有缺失皆具備可查驗的語法樹依據。
2. 本機編譯器建構預設拒絕(Fail-closed)
安全防護背景與考量:直接編譯不受信任的外部 Foundry 與 Hardhat 專案,可能會在開發者本機執行惡意的 Node.js 腳本或 Makefile 鉤子。
架構決策:系統預設僅透過 solc-select 進行單檔 AST 解析,停用專案建構腳本。完整建構必須由使用者明確加上 --allow-native-builds 參數與確認安全警示。
成效與取捨:在自動化 CI/CD 初篩掃描流程中,有效杜絕了沙盒逃逸與任意程式碼執行風險。
3. 具備確定性備援的本機 RAG 架構
系統韌性背景與考量:部分使用者並未配備 Apple Silicon 或本機高階 GPU,無法流暢運行大型本機模型。
架構決策:打造混合式解釋架構:若本機具備 Apple MLX 環境,則生成基於證據圖譜的上下文解說;若處於離線或純 CPU 環境,系統平滑降級至靜態索引的安全模式庫與 CWE 缺失文件。
成效與取捨:CLI 工具與審查工作台在完全沒有 LLM 執行環境或外部 API 金鑰的情況下,仍能保有 100% 的完整分析功能。
05 · 最具挑戰性的工程難題
將異質的 Slither AST 輸出正規化為統一證據圖譜
問題根本原因:Slither 內部不同偵測器輸出的 JSON 格式差異極大:部分僅參照單一表達式,部分參照變數宣告,而重入偵測器則參照跨合約繼承層級的多函式呼叫鏈。
工程解決方案:在 Python 中開發 AST 正規化引擎,將所有偵測器輸出映射至統一的 SecurityFinding 資料規格,提取對應原始碼片段、行號區間並計算雜湊去重,統一存入 SQLite 關聯證據圖譜。
實測驗證:透過 140 個 pytest 測試案例全面驗證,涵蓋鑽石代理合約(Diamond Proxy)、底層組合語言區塊(Yul/assembly)與自訂錯誤型別等複雜邊界情境。
06 · 誠實揭露之系統局限性與公開基準測試
有別於「100% 全自動安全」的行銷宣傳,SCSA 誠實公開其經驗數據界限。在公開 Slither50 v2 基準測試中,本系統達成了零漏報(100% 召回率),但產生了 4 起誤報。
07 · 測試、建構與驗證數據
100% 後端測試通過率,涵蓋 Slither 偵測器解析、solc 版本協商、SQLite 查詢與 CLI 命令。
前端測試組通過,驗證 React 審查工作台元件、缺失篩選器與程式碼差異視覺化。
透過 Hatchling 完成打包,驗證符合 PyPI 規範的原始碼發行檔(sdist)與 binary wheel。
統計學顯著分離:安全合約平均得分 8.2 分,存在漏洞合約平均得分 53.25 分。
08 · 專案回顧與反思
工程經驗總結:工程經驗總結:在智慧合約安全這種高風險領域,缺乏嚴謹事實驗證的流暢文字生成是一種系統性負債。將「事實引擎」(確定性 AST 分析器)與「表現引擎」(LLM)徹底解耦,既能杜絕虛構漏洞的風險,又能保留 AI 輔助說明的教育價值。
若重新開始我會做的調整:若重新開始我會做的調整:除了 Slither 之外,更早整合符號執行引擎(如 Manticore 或 Halmos),在人工審查介入前,先透過形式化約束求解自動過濾部分誤報。