智能合約安全與審計
靜態分析
靜態分析在從不執行合約的情況下,檢視其原始碼或編譯後的形式以找出已知的壞模式,很像拼字檢查器閱讀文章找錯、卻不照著文字行動。它快速、便宜且可重複,因而成為自動化防禦的第一道防線,也天然契合持續整合:每一次提交都能在數秒內被掃描。Solidity 世界裡最知名的工具是 Slither,此外還有 Mythril、Semgrep 與 solhint 這個 linter。
就機制而言,靜態分析器把合約解析成抽象語法樹與一個中介表示(Slither 會編譯成自己的 SlithIR),再對那個結構跑一整批偵測器。每個偵測器尋找某一類漏洞的指紋:狀態更新前的外部呼叫(可能的重入)、用 tx.origin 授權、未初始化的儲存指標、變數遮蔽、未檢查的 transfer 回傳值、危險的 delegatecall、或對餘額做嚴格相等比較。它也能浮現程式碼品質與 gas 問題,並產出繼承圖與呼叫圖以輔助人工審查。
其取捨在於精確度。由於它推理的是模式、而非執行期行為,靜態分析既會產生偽陽性(標記符合某模式的安全程式碼)、也會產生偽陰性(漏掉不符合任何偵測器的漏洞)。它無法理解你協議所欲的經濟,也抓不到你設計獨有的邏輯錯誤。正確的心智模型是:綠燈輸出代表沒有已知模式被命中,而非合約安全;靜態分析做分流、做互補,但絕不取代人工審查、模糊測試與形式化方法。
$ slither . # Reentrancy in Bank.withdraw() (Bank.sol#21-27) # Bank.login() uses tx.origin for authorization (Bank.sol#33) # Bank.pay() ignores return value of token.transfer(...) (Bank.sol#40)
偵測器輸出把審查者指向可疑的行。
靜態分析快速又免費、該放進 CI,但它只能找到它有偵測器的模式,也無法理解你協議的經濟。把一次乾淨的執行當成沒有已知模式被命中,而非安全。
又称
另见