僅供教育參考,不構成投資或資安建議。稽核報告、工具結果、已修正的發現或相符的原始程式檔,都不是認證、保險、賠償承諾,也無法證明正式環境的部署安全。
直接答案
智慧合約稽核是在明定期間內,對指定需求、原始程式碼、建置輸入、部署邏輯與安全假設所做的有限審查。稽核人員運用互補方法識別缺失、展示可利用路徑、評估影響並檢查建議修正。結論只適用於報告載明的稽核快照與證據。
快照應鎖定程式碼儲存庫與提交或目錄樹雜湊、子模組與相依套件鎖定檔、編譯器及設定、產生的程式碼、部署腳本、目標鏈與位址、代理、實作或信標、建構函式或初始化函式資料、程式庫、管理員、時間鎖,以及某一區塊或時間點。明確的排除項目與納入項目同樣重要:前端、keeper、預言機、跨鏈橋、治理流程或鏈下簽署者即使不在稽核範圍內,也可能主導風險。
稽核需要威脅模型與規格。應識別資產、參與者、特權角色、信任邊界、攻擊者能力、排序與重組假設、外部相依項目、狀態轉換,以及精確的安全性與活性性質。缺少單位、前提條件、量詞與例外的不變量,可能完美地證明或測試錯誤行為。
應維護四本帳:範圍、建置與部署身分帳;需求、威脅與不變量帳;發現、證據與複測帳;殘餘風險、接受與揭露帳。報告沒有 critical 發現不等於資安認證,標示為 resolved 的發現未必已部署,而證明也只涵蓋其編碼的性質、模型與假設。
運作方式
人工審查追蹤架構、資金流、跨函式狀態與經濟意圖。靜態分析尋找模式與資料流,但可能產生偽陽性和偽陰性。單元、整合、分叉與差異測試比較具體行為。有狀態模糊測試與不變量測試探索產生的呼叫序列,但結果取決於處理器、選擇器、種子、語料庫、執行次數、深度與建模環境。
符號執行與形式驗證可在受支援的語意和假設下確立特定斷言。求解器傳回 unknown、逾時或遇到不支援的行為,都不構成證明。即使性質已獲證明,也可能遺漏預言機經濟機制、治理、部署設定、鏈上行為,或團隊真正想實現的需求。規格與解讀仍由人工審查負責;AI 產生的觀察並不是獨立的保證方法。
每項發現都應指出受影響的成品與部署、前提條件、最小證明、利用路徑、可達性、所需權限、攻擊者資本、可重複性、經濟影響、嚴重度標準與修正建議。可利用性或發生可能性與影響是兩個不同面向。理論最大值、漏洞名稱或工具標籤不能證明可執行損失。
open、acknowledged、risk accepted、partially fixed、resolved 與 retested 等狀態並非通用標準。可信的結案應把原發現連結至精確修正提交,記錄已測試的變更路徑與相鄰路徑,並說明由誰在何時複測哪些項目。已接受風險仍然是風險,有限複測不會把原稽核範圍擴大至所有新增程式碼。
可升級部署需要專項核對。應解析代理、實作或信標與管理員儲存槽;驗證初始化與再初始化行為、實作合約鎖定、儲存配置相容性、升級授權、時間鎖或緊急繞過、遷移與回復。從受稽建置重現建立位元碼和執行時期位元碼,再於每條鏈上比較連結程式庫、參數、角色與已初始化狀態。
最終報告應說明修訂版、稽核人員與日期、精確範圍、方法與設定、限制、發現、證據、修正狀態、未解決或已接受風險及揭露條款。發布後應監控實作雜湊、角色、參數、相依項目與事件。任何重大變更都會產生需審查的新差異;附在舊報告上的徽章不會自動跟隨未來程式碼。
請依下列流程執行:
- 凍結稽核清單:程式碼儲存庫、提交、相依項目、編譯器與設定、產生和部署程式碼、鏈、位址、代理架構、參數、區塊、報告修訂版、納入項目與排除項目。
- 定義資產、參與者、特權角色、信任邊界、攻擊者能力、生命週期、排序與活性假設、外部相依項目和可衡量不變量。
- 重現建置並梳理架構、儲存、資料、資金與控制流;核對原始碼、成品、程式庫、建立與執行時期位元碼、初始化函式、角色和正式環境部署。
- 組合執行人工、靜態、單元、整合、分叉、差異、模糊、不變量、符號或形式化方法,並記錄工具版本、設定、種子、語料庫、涵蓋率、逾時和未知結果。
- 記錄每項問題的受影響成品、前提、證明、可利用性、影響、嚴重度方法、部署曝險、建議與機密證據,不把工具標籤當作判斷。
- 凍結修正提交並複測問題、相鄰路徑和不變量;驗證代理儲存、初始化、遷移、回復、可重現建置及部署收據,再賦予有證據支持的狀態。
- 發布範圍、方法、限制與殘餘風險;將受稽成品和每條正式運作的鏈逐項核對,並隨系統變更持續更新監控、揭露、事件應變與漏洞懸賞控制。
範例
- 金庫通膨路徑需要完整帳本。 攻擊者透過首次存入分支投入
1 asset並取得1 share,接著捐贈1,000,000 assets;總量成為1,000,001 assets與1 share。受害者存入500,000 assets,不安全的向下捨入計算得到floor(500,000 * 1 / 1,000,001) = 0 shares。若系統接受零份額存入,金庫會持有1,500,001 assets;攻擊者贖回全部資產並獲利500,000 assets,其投入為1,000,001-asset。若實作會在零份額時回復交易,這條特定損失路徑便不會執行。 - 檔案涵蓋率不等於部署涵蓋率。 清單包含
24 source units、4 deployment scripts與3 keeper services,合計31 items。稽核納入20 source units和2 scripts,所以按數量計算的涵蓋率為22 / 31 = 70.96774194%;其餘9 items被排除。若正式環境的代理指向由排除單元建置的實作,該正式實作的涵蓋率是0%,即使標題數字是70.96774194%。 - 模糊測試觀察不構成不存在性證明。 一次有狀態測試執行
2,000 sequences * 64 calls = 128,000 calls;不變量在3 sequences中失敗,占產生序列的觀察比例3 / 2,000 = 0.15%。修正後,10,000 sequences * 64 calls = 640,000 calls未出現失敗。這表示該語料庫中為零,而非證明;在獨立且產生器穩定的教學假設下,三倍法則給出的近似95%上限是每個產生序列3 / 10,000 = 0.03%。 - 發現結案與部署身分彼此獨立。 報告有
12 findings:2 critical、3 high、4 medium與3 low。複測結案2 + 2 + 3 + 2 = 9項,按數量計算的結案率為9 / 12 = 75%;仍有一項高、一項中和一項低未結案。受稽執行時期雜湊為H1,但正式環境實作是H2,所以無論結案率如何,部署驗證都失敗。換成精確的H1並匹配代理儲存槽、初始化函式和角色,只能證明受檢區塊時點的身分一致。
風險
- 程式碼儲存庫、提交、子模組或產生的原始碼過時或含糊。
- 編譯器版本、最佳化工具設定、程式庫或相依項目未鎖定。
- 部署腳本、建構函式資料、初始化函式或 CREATE2 salt 被排除。
- 審查了錯誤的鏈、位址、代理、信標或實作。
- 原始碼、成品、建立位元碼與執行時期位元碼無法相互核對。
- 威脅模型遺漏參與者、權限、資產或信任邊界。
- 規格或不變量使用錯誤的單位、前提條件或例外。
- 管理員、守護者、時間鎖、暫停、升級或遷移路徑被遺漏。
- 預言機、代幣、跨鏈橋、keeper、治理或鏈上假設失效。
- 靜態分析產生未經分類核驗的偽陽性。
- 人工審查、測試或模糊測試遺漏未產生的路徑。
- 模糊測試工具、選擇器、種子、語料庫、深度或狀態模型有偏差。
- 求解器逾時、不支援的語意或
unknown被誤認為證明。 - 正確的證明形式化了錯誤需求或不完整系統。
- 嚴重度依據漏洞名稱,而不是可利用性與影響。
- 理論風險價值被誤認為可達損失或攻擊者利潤。
- 修正引入相鄰迴歸或破壞經濟不變量。
- 代理儲存、初始化函式、升級或遷移破壞正式環境狀態。
- 已接受、未結案或僅部分修正的問題被「通過稽核」徽章掩蓋。
- 報告被視為保險、認證、賠償承諾或永久涵蓋。
常見迷思
- 「沒有重大發現就代表合約安全。」 這只描述有限範圍、期間與方法下報告的發現,並非所有可能缺失。
- 「測試涵蓋率高或模糊測試零失敗,就證明沒有漏洞。」 這些只是對選定程式碼和產生路徑的量測,不是不存在性證明。
- 「形式驗證證明整個協定安全。」 它只證明模型在假設下編碼的性質;規格和周邊系統仍可能有誤。
- 「已修正代表所有正式環境部署都已完成修補。」 結案需要獨立複測,並逐一核對每個部署的建置、位元碼、代理、參數與角色。
- 「知名稽核機構會保證賠償或未來升級。」 責任取決於稽核契約,使用者未必是受益人,後續程式碼或設定不在舊快照範圍內。
相關主題
來源
- OWASP Smart Contract Security Verification Standard (SCSVS) - OWASP (查閱日期: 2026-08-13)
- Security Considerations - Solidity (查閱日期: 2026-08-13)
- Slither, the smart contract static analyzer - Crytic (查閱日期: 2026-08-13)
- Invariant Testing - Foundry (查閱日期: 2026-08-13)
- Certora User’s Guide - Certora (查閱日期: 2026-08-13)
- ERC-1967: Proxy Storage Slots - Ethereum Improvement Proposals (查閱日期: 2026-08-13)
- Writing Upgradeable Contracts - OpenZeppelin (查閱日期: 2026-08-13)
- Contract Metadata - Solidity (查閱日期: 2026-08-13)