撰文:ChainLink
智能合約審計用於整個DeFi 生態系統,通過對協議代碼的深入審查,可以幫助解決識別錯誤、低效代碼以及這些問題。智能合約具有不可篡改的特點,這使得審計成為任何區塊鏈項目安全流程的關鍵部分。
代碼審計對任何應用程序都很重要,但它們對去中心化應用程序(dApp) 尤其重要,因為它們建立在其之上的區塊鍊是不可變的。如果代碼漏洞導致用戶資金丟失,這些資金將無法找回。迄今為止,DeFi 中的黑客已經損失了超過50 億美元。
在本文中,我們研究了智能合約審計到底是什麼、如何進行審計、需要注意的常見智能合約漏洞、Solidity gas 優化策略、流行的審計工具等等。
什麼是智能合約審計?
智能合約審計包括對一個協議的智能合約代碼進行詳細分析,以識別安全漏洞、不良的編碼實現方式和低效代碼,然後再提出解決這些問題的解決方案。審計有助於確保跨Web3 的去中心化應用程序的安全性、可靠性和性能。
在智能合約審核期間,安全專家團隊將以自動和人工的方式,審查應用程序的代碼、邏輯、架構和安全措施,以識別任何潛在問題。他們專門尋找可能容易受到惡意攻擊的任何代碼,以及任何需要改進的部分。
智能合約代碼最終將部署到Avalanche、BNB Chain 或Ethereum 等區塊鏈中。一旦合約生效,任何人都可以訪問它們——從終端用戶到惡意攻擊者——這就是為什麼在啟動或更新去中心化應用程序之前必須解決所有漏洞。
審計完成後,審計師會發布一份摘要報告,其中提供有關審計結果、解決方法和任何其他問題的詳細信息,以及未來解決現存問題的路線圖。經過全面的智能合約審計後,項目可以放心地部署他們的合約,因為應用程序的安全性有了保證,用戶資金也受到保護。
如何審計智能合約
智能合約審計利用各種技術和工具來減少風險點並使協議更加健壯。
步驟1. 收集文檔
被審計的項目必須先凍結代碼,並向審計員提供技術文檔,包括代碼庫、白皮書、架構和任何其他相關材料。該文檔應該為審計員提供有關代碼旨在實現的目標、範圍和具體實施的詳細指南。
步驟2. 自動化測試
也稱為形式化驗證引擎,自動化測試檢查智能合約的每個可能狀態,並針對可能攻擊合約功能性或安全性的問題發出警報。審核員還可以對單個功能進行集成測試、單元測試,以及探測安全漏洞的滲透測試。
步驟3. 人工審核
安全專家團隊仔細檢查每一行代碼,找出錯誤和漏洞。雖然自動化測試可以很好地識別代碼中的錯誤,但人類工程師更有能力檢測合約邏輯或架構的問題、技術上正確且通過自動化測試的不良編碼實現、gas 優化以及常見攻擊點(比如說搶先交易)。
步驟4. 合約錯誤分類
每個錯誤都根據它可能被利用的漏洞嚴重性進行分類:
- 嚴重— 影響協議的安全運行。
- 重大— 可能導致用戶資金或協議控制損失的中心化和邏輯錯誤。
- 中等— 影響平台的性能或可靠性。
- 次要— 不會使應用程序的安全受到威脅的低效代碼。
- 信息性— 與代碼風格或行業最佳實踐相關的錯誤。
步驟5. 初始報告
審計員起草一份初步報告,總結代碼缺陷和其他問題,以及項目團隊如何解決這些問題的反饋。一些智能合約服務提供商擁有一個專家團隊,可以幫助修復發現的每個錯誤。通過解決所有問題,項目可以確保其智能合約的安全性,並且做好部署的準備。
步驟6. 發布最終審計報告
審計員在詳細將所有發現的問題寫入最終報告中,所有問題都被標記為已解決或未解決。該報告將提供給項目團隊並同時會被公開,以便協議的用戶和其他利益相關者俱有完全的透明度。
常見的智能合約漏洞
以下是當前智能合約審計清單的一部分的常見漏洞。
重入問題
當智能合約函數被不受信任的外部合約調用時,可能會發生重入攻擊。重入攻擊中,使該外部合約能夠通過遞歸調用原始合約來耗盡用戶資金或進行其他惡意操作。
整數上溢和下溢
當智能合約執行算術運算輸出超過當前存儲容量的數字時,可能會發生整數溢出或下溢,從而導致計算錯誤。
搶先交易機會
設計不合理的代碼可能會洩露有關dApp 尚未發生的的交易信息,其他用戶可以先行運行這些信息,以犧牲協議為代價鎖定利潤。
重放攻擊
當數據被惡意延遲或重複時,就會發生重播攻擊,尤其是在硬分叉事件期間,攻擊者可以使用新的系統上的消息從遺留系統中提取資金。
隨機數漏洞
如果dApp 使用公開的數字(例如塊哈希)來播種隨機數,則它很容易受到利用,這就是為什麼許多協議使用Chainlink VRF 來實現隨機性。
函數可見性錯誤
打算私有的函數必須定義為私有的,因為Solidity中的默認可見性屬性是公共的。如果是公開的,任何人都可以調用該函數。
中心化風險
中心化機制有單點故障的問題,如果單個私鑰或類似密鑰被洩露,可能會破壞協議的安全性。時間鎖和授予DAO 特權是處理中心化風險的常用技術。
未鎖定編譯器版本
Solidity 有許多編譯器版本。 dApps 應該鎖定他們使用的編譯器版本,這樣用戶就不能用不同的版本編譯它,否則這可能會導致不同的字節碼和意想不到的問題。
Solidity gas 優化
Gas 是指在以太坊網絡上進行特定操作所需的費用。 Gas 優化是降低智能合約代碼執行成本的過程,隨著項目規模的擴大和需要更多的Gas 來運行,這一點變得越來越重要。它還有助於防止協議被濫用。
Solidity gas 優化技術包括:
- 啟用Solidity 編譯器優化器,最大限度地減少代碼的大小。
- 最小化所需的鏈上數據量。
- 釋放未使用的存儲空間。
智能合約審計工具
流行的智能合約安全審計工具包括:
- Echidna — 一個Haskell 程序,專為模糊測試的以太坊智能合約而設計。
- Ethlint — 分析Solidity 代碼的風格和安全問題並幫助解決這些問題。
- Mythril — EVM 字節碼安全分析工具,使用符號執行(symbolic execution)、SMT 求解(SMT solving)和污點分析(taint analysis)來檢測各種安全漏洞。
- MythX — 自動掃描以太坊和其他基於EVM 的區塊鏈智能合約中的安全漏洞。
- Rattle — 一個使用流敏感分析(flow-sensitive analysis)的EVM 二進制靜態分析框架。
- Slither — 針對安全漏洞和最佳實踐對Solidity 源代碼進行靜態分析。
- Solgraph — 生成一個DOT 圖,可視化功能控制流並顯示潛在的安全漏洞。
- Scribble — 規範語言和運行時驗證工具,可將高級規範轉換為Solidity 代碼。
常見問題
智能合約審計的費用是多少?
智能合約審計通常需要花費5,000 到15,000 美元,根據代碼複雜性和技術支持要求,還有可能更高。
如何成為智能合約審計師?
智能合約審計員必須對軟件工程有高層次的理解,了解特定區塊鏈環境的特定語言,如以太坊的Solidity,並了解去中心化金融等關鍵垂直領域。審計師的收入通常在10 萬到25 萬美元之間,有些人的收入超過40 萬美元。
如何準備智能合約審計?
通過清理代碼庫、收集所有文檔然後凍結代碼來準備智能合約審計。在Hacken 的這篇文章中了解更多信息。
審計智能合約需要多長時間?
完成智能合約安全審計的時間取決於代碼的大小和復雜性。雖然可以在48 小時內審核一個簡單的通證合約,但一個完整的去中心化應用程序可能需要數週的時間來審核。
如何選擇智能合約審計師?
如果你正在尋找審核員建議,也可以聯繫我們的技術專家。