業務邏輯漏洞在 DeFi 項目中最爲常見, 需對涉及代幣基本信息的函數及鑄幣、銷燬代幣、更改 owner 等特殊權限作嚴格審查。

原文標題:《DeFi 合約審計中的那些「套路」》
撰文:成都鏈安

DeFi 項目正式部署前,通過合約的安全審計,不僅可以對項目的代碼規範、漏洞情況以及業務邏輯等方面進行全局覈查。同時,項目審計對於項目方在投資市場的形象也具有一定塑造作用。

市場投資者在遴選項目時,如有項目方加持合約審計經歷,並對審計方、審計報告等信息進行公開披露,投資可信度無疑會大幅提高。並且,項目方完善的安全立場建設意識,在無形中也將賦予項目額外的價值。

DeFi 合約什麼漏洞最常見?初探審計流程與特點

與此同時,DeFi 項目方在運營過程中,保持與安全審計公司的長期業務合作,不論是對安全管理還是業務擴展都將大有裨益。畢竟,在項目長期發展過程中,階段性安全審計機制能夠及時發現和有效助力解決整體、局部的風險問題。

那麼,DeFi 合約審計的主要流程、內容以及特點,那些「套路」又是什麼呢?

套路 1:前期「把脈」

與 DeFi 項目方的合約審計合作關係達成後,在瞭解項目整體情況,包括構架、業務設計等方面的基礎上,指派具有相關項目審計經驗的安全測試團隊進行專項服務,同時,明確項目檢測範圍以及相應需求側重點。做好前期「把脈」,其主要內容包括:

  1. DeFi 項目方提供真實、有效且爲審計所需的各項技術、代碼、文檔等資料。
  2. 正式進入檢測環節前,安全團隊將對提供的材料進行全面評估,以確定週期。
  3. 確定測試服務範圍,包括定向模塊、局部代碼、全面安全審計等。
    4、. 完成相關需求對接,即對源代碼、應用程序、文件信息、測試環境的最終確認。

爲了對 DeFi 項目合約的代碼規範性、安全性以及業務邏輯等方面進行嚴格的安全審計,在測試明確後,處理合約審計的常規方式有:

  • 形式化驗證
  • 靜態分析
  • 動態分析
  • 典型案例
  • 人工審覈

套路 2:形式化驗證

形式化方法是實現安全、可信軟件的最可靠的手段,它利用基於數學的符號系統給出軟件正確性、安全性的嚴格定義和形式證明。其中,嚴格定義被稱爲形式化規範,是一種用清晰、簡明的手段來刻畫軟件功能或特性的邏輯表達式。

在合約審計中,形式化方法通過的是定性需求屬性,從而證明程序不存在某類安全漏洞。另一方面,傳統測試方法則是通過檢查代碼在一組選定的輸入上是否按照預期運行,以此說明程序是否存在安全漏洞,但這無法證明同類型安全漏洞不存在。

此外,傳統測試方法很容易漏掉在罕見或惡意構造場景下觸發的錯誤,以及由於大量「不可能事件」連續發生導致的錯誤。然而,形式化方法則可通過明確代碼意圖、提供輸入空間的完整覆蓋來發現上述微妙錯誤,進而實現程序的安全性、可靠性增強。

DeFi 合約什麼漏洞最常見?初探審計流程與特點傳統檢測 vs 形式化驗證

成都鏈安創始人、多年形式化驗證研究專家楊霞教授表示:

「傳統驗證手段無法窮盡可能的情況,而形式化驗證則可以做到窮舉,對智能合約漏洞檢測而言,該方法最爲可信和有效。

作爲針對以太坊智能合約安全檢測開發的定製化工具,成都鏈安的 Beosin-VaaS 一鍵式智能合約自動形式化驗證工具,可精確定位到含有風險的代碼位置並指出風險原因,有效檢測智能合約常規安全漏洞的精確度高達 97% 以上,爲智能合約代碼提供‘軍事級’的安全驗證。」

套路 3:代碼規範審計

在代碼規範審計中,主要測試項目有:

DeFi 合約什麼漏洞最常見?初探審計流程與特點

編譯器的版本問題可能會導致各種已知安全問題,開發者應在代碼中指定合約代碼採用最新的編譯器版本,並消除編譯器告警。

同時,Solidity 智能合約開發語言處於快速迭代中,部分關鍵字已被新版本的編譯器棄用,如 throw、years 等,爲消除其可能導致的隱患,當前編譯器版本已經棄用的關鍵字應被禁用。

在智能合約中,冗餘代碼會降低代碼可讀性,並可能需要消耗更多的 gas 用於合約部署,因此,必須找出並消除冗餘代碼。此外,合約中是否正確使用 SafeMath 庫內的函數進行數學運算需要嚴格檢查。

Solidity 使用狀態恢復異常來處理錯誤,該機制將會撤消對當前調用及其所有子調用中的狀態所做的所有更改,並向調用者標記錯誤。

函數 assert 和 require 可用於檢查條件並在條件不滿足時拋出異常。assert 函數只能用於測試內部錯誤,並檢查非變量。require 函數用於確認條件有效性,例如輸入變量,或合約狀態變量是否滿足條件,或驗證外部合約調用的返回值。

以太坊虛擬機執行合約代碼需要消耗 gas,當 gas 不足時,代碼執行會拋出 out of gas 異常,並撤銷所有狀態變更。合約開發者需要控制代碼的 gas 消耗,避免因爲 gas 不足導致函數執行一直失敗。

另外,合約函數的可見性是否符合設計要求,以及在當前合約中是否正確使用了 fallback 函數都需要進行嚴格檢查。

套路 4:DeFi 安全漏洞審計

目前,業務邏輯漏洞在 DeFi 項目中最爲常見。由於項目業務邏輯設計的不嚴謹,極可能導致項目在特定情況下出現內部失衡。

需要注意的是,DeFi 項目基於區塊鏈智能合約開發,具有很多傳統金融體系以外的特性,比如:

  • 單筆交易可發起多個內部交易,失敗可回滾
  • 具有通縮性質的代幣
  • 合約代碼不可修改

同時,審計中常見的還有合約權限錯誤,即合約中函數的可見性修飾錯誤。通常,這是由於調用者和參數沒有進行有效驗證,導致函數被惡意用戶調用,從而釀成巨大的損失。

類似傳統安全問題,錯誤的權限配置和無效的安全檢查都會給系統帶來巨大的風險。但不同的是,智能合約的不可修改性使得此類問題即便被發現也不一定能得到有效修復。

另外,重入漏洞也是審計的重點。具體而言,當合約向外發起 call 調用後,攻擊者可利用合約調用的特性反覆調用函數,導致合約預期的執行順序發生錯誤,以此竊取目標賬戶的資產。

在審計中,代碼錯誤出現頻率也很高。這主要是由於開發人員失誤導致的一些代碼編寫錯誤。常見的有單位錯誤、忘記乘以精度、& 使用錯誤等。在 YAM 漏洞事件中,代碼在進行彈性調整 rebase 時,其代碼正是忘記乘以精度,如圖所示:

DeFi 合約什麼漏洞最常見?初探審計流程與特點

在確保代碼和漏洞深度檢測的同時,項目業務方面也設置有業務邏輯和實現方面的相關審計,包括對 DeFi 項目中涉及代幣基本信息的檢查,以及代幣標準相關的函數的確認,特別是對鑄幣、銷燬代幣、更改 owner 及其它特殊權限的審查和風險分析。

很多項目中都存在代理轉賬的邏輯,在處理此類邏輯時,很多項目方會直接要求用戶授權最大值代幣給項目方的合約,如下圖所示:

DeFi 合約什麼漏洞最常見?初探審計流程與特點

如此一來,合約就有權將用戶資金全部轉走。此外,還有雙重授權的問題,項目方網站在進行授權時,發起了兩筆授權,一筆授權給合約地址,一筆授權給外部地址,如用戶對此沒有提防,將會面臨極大的資金風險。

套路 5:審計報告

合約審計最終服務於 DeFi 項目中的資金安全,而這方面諸多問題的出現都與函數、算法的不當存在關聯。因此,合約審計就是要指出可能引發資金風險的內容,也就是潛藏隱患以及亟需修正的代碼、漏洞、邏輯等問題。

在審計報告中,除了審計時間、歷時以及審計人等基本信息外,還會體現對項目的投資預警提示。審計報告的核心內容,是體現受檢智能合約在設計和代碼實現等多方面、多維度的審計結果。同時,報告將指出發現的各類風險問題,並將其告知項目方以便修復。

通過審計報告,合約的風險成分,包括潛在可遭遇的攻擊,不同級別、層面的漏洞將被詳盡提示。只不過,安全審計報告中醒目的「通過」二字,不應該作爲投資者僅有的投資判斷依據。

結語

合約審計並不屬於項目本身的利好消息,而是上線前必要的一項安全工作,無論是對項目方還是投資者都具有重大的意義。

投機市場或是狂暴或是蕭條,行走其間不按套路出牌,終將也會受制於「套路」。略瞥其中,唯有防患於未然的安全之峯,巍然。