編譯:登鏈翻譯計劃
介紹
由區塊鏈技術支持的智能合約通過提供去中心化和自動化的功能徹底改變了各個行業。然而,它們也給去中心化應用程序的操作和設計帶來了新型的安全挑战。
在本文中,我們將探討开發人員和審計人員應該注意的十大最常見的智能合約漏洞,以便構建安全、強大的智能合約。
注意:通過 Immunefi 提交的大多數項目和錯誤都使用基於 EVM 的區塊鏈[4]。因此,本文將重點討論這些技術。然而,這些分類可通用擴展到任何區塊鏈技術。
進入此列表的漏洞是通過分析 2023 年第一季度的黑客攻擊和通過 Immunefi 發現的錯誤修復來確定的。
V01: 輸入驗證不正確
概述
不正確的輸入驗證是通過 Immunefi 提交的大量已確認漏洞報告以及在外被利用的主要原因。輸入驗證是一項關鍵的安全實踐,涉及驗證系統數據輸入的完整性、准確性和安全性。未能正確驗證輸入可能會爲攻擊者利用和操縱系統行爲开闢途徑。
描述
當智能合約無法充分驗證和清理(sanitize)用戶輸入時,就會發生不正確的輸入驗證,從而使他們容易受到各種類型的攻擊。此類漏洞可被利用來操縱合約邏輯、注入惡意數據或導致意外行爲。正確的輸入驗證可確保合約僅處理有效且預期的數據,從而降低被利用的風險。
預防
爲了防止此類漏洞,开發人員應該實施全面的輸入驗證例程。這包括驗證數據類型、檢查邊界條件以及清理用戶輸入以防止發生意外情況。爲了確保穩健的輸入驗證,必須考慮所有可能的輸入場景,包括邊緣情況和意外輸入。一些可以幫助开發人員防止遺漏邊緣情況的工具和技術是模糊測試[5]或符號執行[6]。這些工具可以幫助开發人員測試各種輸入,以確保惡意輸入不會破壞智能合約的不變量或執行。
例子
Beanstalk Logic 錯誤修復審計[7]展示了缺少輸入驗證漏洞的示例。Beanstalk Token Facet 合約的 transferTokenFrom()
函數中存在漏洞,其中 msg.sender
的授權額度在 `EXTERNAL` [8]模式下未正確驗證。該缺陷允許攻擊者從之前已批准 Beanstalk 合約的受害者账戶中轉移資金。
參考文章
https://medium.com/immunefi/sovryn-loan-vulnerability-postmortem-ffaf4d1d688f
https://medium.com/immunefi/zapper-arbitrary-call-data-bug-fix-postmortem-d75a4a076ae9
https://medium.com/immunefi/cream-finance-insufficient-validation-bug-fix-postmortem-1ec7248e8865
https://medium.com/immunefi/pancakeswap-logic-error-bug-fix-postmortem-f2d02adb6983
https://medium.com/immunefi/mcdex-insufficient-validation-bug-fix-postmortem-182fc6cab899
https://medium.com/immunefi/polygon-lack-of-balance-check-bugfix-postmortem-2-2m-bounty-64ec66c24c7d
https://medium.com/immunefi/notional-double-counting-free-collateral-bugfix-review-28b634903934
https://medium.com/immunefi/port-finance-logic-error-bugfix-review-29767aced446
https://medium.com/immunefi/aurora-withdrawal-logic-error-bugfix-review-c5b4e30a9160
https://medium.com/immunefi/aurora-improper-input-sanitization-bugfix-review-a9376dac046f
https://medium.com/immunefi/mt-pelerin-double-transaction-bugfix-review-503838db3d70
https://medium.com/immunefi/balancer-logic-error-bugfix-review-74f5edca8b1a
https://medium.com/immunefi/beanstalk-logic-error-bugfix-review-4fea17478716
https://medium.com/immunefi/hack-analysis-platypus-finance-february-2023-d11fce37d861
V02: 計算錯誤
概述
在我們在 Immunefi 上看到的已確認錯誤報告中,計算錯誤緊隨其後。
智能合約中不正確或不一致的計算可能會導致意想不到的後果,例如代幣余額不准確、獎勵分配不正確或合約執行期間出現意外結果。不正確的計算通常與未充分探索的代碼路徑配對,並且與不正確的輸入驗證錯誤密切相關。然而,不正確的計算處理的是一些漏洞,其中本打算讓用戶能夠執行某些操作,但由於不正確的計算,用戶可能會從該操作中獲得比預期更多的回報。
描述
在智能合約中,當數學運算執行不正確時,就會發生錯誤的計算,從而導致意外或不正確的結果。這些漏洞可能由多種原因引起,例如對精度、值範圍的錯誤假設,或合約不同部分的計算不一致。當合約未能考慮邊緣情況或正確處理極端情況時,也可能會出現錯誤的計算。在某些情況下,合約可能無法考慮極值,或者無法處理溢出或下溢,從而導致意外行爲或安全風險。攻擊者可以利用這些漏洞來操縱計算或在合約中獲得未經授權的優勢。適當的數學精度和對極端情況的仔細考慮對於防止此類漏洞至關重要。
預防
單元測試以及模糊測試[9]或符號執行[10]可以幫助缺少丟失的邊緣情況滲透到代碼庫中。此外,數學方程的形式驗證將有助於爲可能存在的狀態提供保證。使用經過充分測試且安全的數學庫或區塊鏈平台提供的內置函數來准確地執行計算。這些庫通常具有針對常見計算錯誤(例如上溢或下溢)的內置保護。
例子
88MPH 盜竊無人認領[11]的 MPH 獎勵 Bugfix Review 演示了一種計算不正確的情況,其中 MPH 獎勵是使用不正確的 rewardPerToken
計算的,這將允許攻擊者完全耗盡 MPH 獎勵合約無人認領的資金。
參考文章
https://medium.com/immunefi/armorfi-bug-bounty-postmortem-cf46eb650b38
https://medium.com/immunefi/vesper-rebase-vulnerability-postmortem-and-bug-bounty-55354a49d184
https://medium.com/immunefi/pods-finance-bug-fix-postmortem-61a576897ebd
https://medium.com/immunefi/tidal-finance-logic-error-bug-fix-postmortem-3607d8b7ed1f
https://medium.com/immunefi/belt-finance-logic-error-bug-fix-postmortem-39308a158291
https://medium.com/immunefi/cronos-theft-of-transactions-fees-bugfix-postmortem-b33f941b9570
https://medium.com/immunefi/apwine-incorrect-check-of-delegations-bugfix-review-7e401a49c04f
https://medium.com/immunefi/polygon-consensus-bypass-bugfix-review-7076ce5047fe
https://medium.com/immunefi/synthetix-logic-error-bugfix-review-40da0ead5f4f
https://medium.com/immunefi/building-a-poc-for-the-uranium-heist-ec83fbd83e9f
https://medium.com/immunefi/hack-analysis-saddle-finance-april-2022-f2bcb119f38
https://medium.com/immunefi/88mph-theft-of-unclaimed-mph-rewards-bugfix-review-1dec98b9956b
V03: 預言機/價格操縱
概述
智能合約通常依賴於稱爲預言機的外部數據源來做出明智的決策。如果這些預言機受到損害或操縱,可能會導致兌換定價不正確、獎勵計算不正確、借入的資產超過抵押比率允許的資產,或金融交易的其他一般問題。對這些外部數據源的操縱是鏈上發生 DeFi 攻擊的主要原因之一。選擇可信的預言機並實施安全的數據驗證機制對於減輕與預言機/價格操縱相關的風險至關重要。
描述
由於許多協議會根據用戶操作更新資產定價,因此這可能是一個明顯但容易被忽視的漏洞,因爲價格預計會根據用戶交互進行更新。然而,當協議依賴於這些內部或外部定價機制時,應仔細考慮以確保現貨價格不會被濫用。價格操縱能否有效執行也很大程度上取決於當前的鏈上狀況。流動性較弱的資金池比流動性較高的資金池面臨更高的操縱風險。仔細選擇可信的預言機並實施安全的數據驗證機制至關重要。過期檢查、平均定價機制和只讀重入保護可能是實現外部定價機制穩健集成的重要功能。數據源的多樣化還可以防止單一協議中的漏洞對整個區塊鏈生態系統造成嚴重破壞。
預防
爲了防止預言機/價格操縱漏洞,开發人員應仔細選擇具有良好記錄的可信預言機。實施安全數據驗證機制,例如加密證明或多數據源聚合,有助於確保接收數據的准確性和完整性。定期審核和監控預言機合約及其與智能合約的交互也可以幫助識別潛在的漏洞。不應對從外部預言機返回的數據的准確性做出假設,並且應採取保護措施以防止臨時價格操縱或陳舊數據影響協議的運行。
例子
BonqDAO[12] 經歷了價格預言機操縱攻擊,攻擊者可以暫時擡高 WALBT 代幣的價格,以便借入比有權借入的更多的穩定幣 (BEUR)。然後,攻擊者再次操縱價格,將其降低到非常小的值,以清算 30 多個抵押不足的持倉。BonqDAO 容易受到攻擊的原因並不是其價格報告機制的無許可性質,而是它將協議合約的現貨價格視爲最後記錄的價值。因此,任何人都可以暫時誇大或縮小給定喂價的價值。
參考文章
https://medium.com/immunefi/fei-protocol-vulnerability-postmortem-483f9a7e6ad1
https://medium.com/immunefi/fei-protocol-flashloan-vulnerability-postmortem-7c5dc001affb
https://medium.com/immunefi/mushrooms-finance-theft-of-yield-bug-fix-postmortem-16bd6961388f
https://medium.com/immunefi/enzyme-finance-price-oracle-manipulation-bug-fix-postmortem-4e1f3d4201b5
https://medium.com/immunefi/hack-analysis-cream-finance-oct-2021-fc222d913fc5
https://medium.com/immunefi/hack-analysis-bonqdao-february-2023-ef6aab0086d6
V04: 弱訪問控制
概述
薄弱的訪問控制機制可能會導致未經授權的用戶或惡意行爲者未經授權地訪問智能合約中的關鍵功能或數據。訪問控制對於確保只有授權實體才能與特定功能交互或修改關鍵參數至關重要。
描述
必須實施適當的訪問控制措施,例如基於角色的權限和強大的身份驗證機制,以防止未經授權的訪問。清楚地記錄系統內參與者的這些限制和能力可以幫助突出哪些操作面臨嚴重漏洞的風險。此類文檔可以促進改進的單元測試和潛在衝突的識別,確保系統按預期運行,並最大限度地減少因單個缺失檢查而導致嚴重漏洞的風險。項目還應確保角色在允許的操作中受到盡可能的限制,以防止來自 web2 世界的風險對整個系統造成不可挽回的損害。如果角色不夠精細,或者協議嚴重依賴集中化作爲安全模型,那么私鑰被盜將造成極其嚴重的破壞。
預防
爲了防止弱訪問控制漏洞,开發人員應該實施基於角色的訪問控制機制。在合約文檔中明確定義角色及其相關權限。實施強大的籤名驗證並使用經過驗證和測試的庫。定期審查和更新訪問控制機制,以應對系統要求或用戶角色的任何變化。
例子
Enzyme Finance[13] 獎勵了一位研究人員,因爲該研究人員發現了與名爲 “Gas Station Network” 的外部組件集成所產生的漏洞。Gas Station Network 是一個去中心化的中繼網絡,允許 dApp 代替個人用戶支付交易費用。Paymaster (代用戶發起交易的角色)缺少對可信轉發器的驗證,該轉發器返回中繼使用的待退款資金金額。如果你喜歡視頻,我們建議你觀看我們對 Sense Finance 5 萬美元賞金支付的分析[14]。
參考文章
https://medium.com/immunefi/88mph-function-initialization-bug-fix-postmortem-c3a2282894d3
https://medium.com/immunefi/mushrooms-finance-logic-error-bug-fix-postmortem-780122821621
https://medium.com/immunefi/alchemix-access-control-bug-fix-debrief-a13d39b9f2e0
https://medium.com/immunefi/openzeppelin-bug-fix-postmortem-66d8c89ed166
https://medium.com/immunefi/sense-finance-access-control-issue-bugfix-review-32e0c806b1a0
https://medium.com/immunefi/enzyme-finance-missing-privilege-check-bugfix-review-ddb5e87b8058
V05: 重放攻擊/籤名延展性
概述
密碼學是所有智能合約功能的核心。協議中實現的加密原語通常基於鏈以無需許可的方式操作的相同原語。然而,它們有時可能會被錯誤地使用,導致操作執行的次數超過預期,從而導致財務損失或合約狀態不正確。
描述
當攻擊者重放有效交易或消息以欺騙智能合約多次執行某項操作時,就會發生重放攻擊。基於 EVM 的鏈可以訪問原語 ecrecover
,它允許智能合約驗證某些數據是否已由恢復的地址驗證和籤名。然而,這個函數不實現任何類型的重放保護。
通常,重放保護是通過引入隨機數 Nonce(使用過一次的數字)來實現的,該隨機數在使用籤名時遞增,防止一旦更新隨機數就再次使用原始籤名。籤名延展性(Signature malleability)是指可修改籤名而不使其失效的能力,允許籤名使用兩次。當對數據進行編碼或在類型之間進行轉換時,可能會使用籤名延展性,其中在檢查籤名時會忽略值的某些部分或位,但會整體使用它來防止重放攻擊。
預防
爲了防止重放攻擊和籤名延展性漏洞,开發人員應該實現基於隨機數 nonce 的交易管理。Nonce 可以確保每筆交易都是唯一的並防止重放攻擊。此外,實施適當的籤名驗證檢查(例如驗證籤名的完整性和真實性)可以幫助防止籤名延展性攻擊。合約設計還應包括防止重復意外操作的機制,例如一次性使用代幣或唯一交易標識符。
例子
當時歷史上支付最高的賞金,Polygon 的雙花漏洞,處理的是 Polygon 的 WithdrawManager
中的一個錯誤,該錯誤驗證了先前區塊中銷毀交易的包含性和唯一性。編碼的方法 branchMask
允許將多個唯一分支掩碼編碼爲相同的退出 ID。這種籤名的延展性允許攻擊者僅存入 10 萬美元並重復使用籤名,從而導致 2230 萬美元的損失。
參考文章
https://medium.com/immunefi/polygon-double-spend-bug-fix-postmortem-2m-bounty-5a1db09db7f1
https://medium.com/immunefi/hack-analysis-nomad-bridge-august-2022-5aa63d53814a
https://medium.com/immunefi/hack-analysis-binance-bridge-october-2022-2876d39247c1
V06: 舍入誤差
概述
浮點運算和舍入誤差處理不當可能會導致財務差異或合約邏輯被利用。精確處理數值運算,在適用的情況下使用定點算術,對於避免此類漏洞至關重要。通常,這些漏洞可能出現在無需許可的兌換協議中,其中非標准小數位數(decimal)值可能會帶來不可預見的後果。
描述
當智能合約執行涉及浮點算術的計算並且無法考慮精度或舍入時,就會出現舍入錯誤。這些錯誤可能會導致財務差異、資金損失或合約中計算的獎勵不正確。智能合約應使用定點算術或替代機制來准確處理小數計算,確保最小化或消除舍入誤差。
預防
爲了防止舍入錯誤,开發人員應使用定點算術或提供精確數值運算的庫。定點算術使用整數值來表示小數,避免了與浮點算術相關的不精確性。此外,對數值運算(包括邊界條件和極端情況)的徹底測試和驗證可以幫助識別和解決潛在的舍入錯誤。
例子
值得注意的是,DFX Finance[15] 修復了一個漏洞,該漏洞包括由於非標准小數位數(2 位)而導致 EURS 代幣出現舍入錯誤。Assimilators 對於 DFX Finance 的自動做市商來說是必要的,因爲所有資產都與 USDC 配對。Assimilator V2 合約負責將所有金額轉換爲計價單位,或用於跨協議計算的基礎值。當整數除法導致從用戶轉移零代幣時,就會出現問題,盡管用戶仍然收到代表他們在曲线池中的部分的曲线代幣。
參考文章
https://medium.com/immunefi/moonbeam-astar-and-acala-library-truncation-bugfix-review-1m-payout-41a862877a5b
https://medium.com/immunefi/dfx-finance-rounding-error-bugfix-review-17ba5ffb4114
V07: 重入攻擊
概述
重入攻擊在以太坊中有着悠久的歷史,是造成 The DAO Hack 的漏洞類別,DAO Hack 是 2016 年早期以太坊網絡上最大的攻擊之一。重入允許攻擊者在上一次調用完成之前重復調用易受攻擊的合約,從而導致意外的情況發生。狀態變化和未經授權的資金轉移。
描述
當合約允許在執行期間對其進行外部調用而沒有正確管理狀態更改和執行流程時,就會出現重入漏洞。重入攻擊是允許攻擊者在上一次調用完成之前重復調用易受攻擊的合約,從而導致意外的狀態更改和未經授權的資金轉移。實施安全狀態管理模式並應用互斥鎖可以降低重入攻擊的風險。一些可以幫助你識別合約中可能存在重入的工具包括 Slither[16]、Mythril[17] 和 Pyrometer[18]。你可以在這篇文章《可重入終極指南》[19]中閱讀有關重入的更多信息。
預防
爲了防止重入漏洞,开發人員應遵循安全狀態管理模式,例如“檢查-效果-交互”(CEI) 模式。此模式可確保在執行任何外部調用之前進行所有狀態更改,從而防止重入攻擊。此外,實現互斥鎖或使用“ReentrancyGuard[20]”模式可以通過阻止重入調用來進一步防止重入。
例子
Omni Protocol[21] 遭遇黑客攻擊,由於其以太坊智能合約遭到重入攻擊,導致 140 萬美元損失。易受攻擊的代碼使用了 ERC721 的 safeTransferFrom
方法,該方法調用實現 onERC721Received
接口的智能合約。此外部調用將執行權移交給接收者,並引入了重入漏洞。
參考文章
https://medium.com/immunefi/hack-analysis-omni-protocol-july-2022-2d35091a0109
V08: 搶跑
概述
搶跑交易(Frontrunning)是一種攻擊者利用觀察到待處理交易與將其包含在區塊之間的時間延遲的技術。通過在受害者的交易之前將自己的交易設置爲更高的 Gas 價格,攻擊者可以爲了自己的利益而操縱某些合約交互的結果。搶跑交易是去中心化交易所、拍賣或任何涉及交易順序的場景的一個問題。
描述
當攻擊者通過先於其他人執行交易而獲得優勢時,尤其是當他們知道即將包含在區塊中的待處理交易時,就會發生搶跑交易。在智能合約的背景下,在交易順序影響結果的情況下,搶跑交易可能是有害的。例如,在去中心化交易所中,攻擊者可以觀察受害者旨在以特定價格購买特定代幣的待處理交易。然後,他們可以快速提交自己的較高 Gas[22] 價格的交易,以便在受害者的交易執行之前以較低的價格購买相同的代幣。這使得攻擊者可以通過犧牲受害者的利益來從價格差異中獲益。搶跑交易可以由觀察內存池的任何人執行,但也可以源自區塊生產者本身。一些鏈具有可以降低風險的私有 RPC,但私有內存池中的驗證者和區塊生產者也可能有錯誤的信任假設。开發人員應該在智能合約層面減少潛在的搶跑交易機會,而不是依賴外部緩解措施,因爲外部緩解措施部分依賴於信任或一致的激勵措施來保護其協議。
預防
防止搶跑交易需要結合技術和設計考慮。一些預防措施包括使用祕密或提交披露方案、實施在交易確認之前對價格或出價等敏感信息保密的方案、鏈下訂單匹配、使用允許用戶將交易捆綁在一起的 flashbots 以及將它們直接提交給礦工,減少搶跑者的機會,並優化費用以減少被搶跑者出價超過的可能性。
例子
在各種 DeFi 協議中都觀察到了搶跑交易攻擊。RocketPool 和 Lido[23] 已獲悉存在可能影響兩者質押服務的漏洞。惡意節點運營商可以通過使用相同的 validator bls key
來使用先前准備的 deposit data
和所需的最低限度的 deposit value
搶先存款來竊取用戶存款。
參考文章
https://medium.com/immunefi/rocketpool-lido-frontrunning-bug-fix-postmortem-e701f26d7971
V09: 未初始化的代理
概述
在沒有正確初始化的情況下使用代理合約可能會引入漏洞,因爲攻擊者可以操縱未初始化的存儲變量。實施安全代理模式並進行全面的初始化檢查對於防止未經授權訪問未初始化的合約狀態至關重要。未初始化的代理錯誤已導致迄今爲止最高的 1000 萬美元賞金支出。
描述
未初始化的代理合約是指代理合約的狀態變量在使用前未正確初始化的情況。這可能會產生安全漏洞,因爲未初始化的存儲變量可能包含敏感數據或控制關鍵合約行爲。攻擊者可以通過操縱未初始化的存儲變量來利用這些漏洞,以獲得未經授權的訪問或執行意外的操作。爲了減輕這種風險,確保代理合約在生產環境中使用之前正確初始化至關重要。
預防
爲了防止未初始化的代理漏洞,开發人員應確保在部署和使用代理之前正確初始化代理合約中的所有存儲變量。這包括初始化敏感數據、訪問控制權限和任何其他關鍵狀態變量。开發人員還應該在代理合約中實施全面的初始化檢查,以驗證所有必需的變量和依賴項是否已正確初始化。他們還應該實施監控工具來提供二級驗證,確保初始化已正確發生。這可以通過構造函數或初始化函數來實現,這些函數或初始化函數在部署後通過自動化腳本或交易捆綁調用。
例子
蟲洞未初始化代理[24]錯誤報告是迄今爲止歷史上支付最高的賞金:向提交該報告的白帽黑客支付了 1000 萬美元。當部署 UUPS 代理合約時,“構造函數”是實現中存在的常規 Solidity 函數。該實現提供了初始化所有者的 initialize()
函數。蟲洞沒有初始化其實現的實現合約,這將允許攻擊者獲得對實現合約的控制,並自毀合約,這將導致代理合約無法繼續執行,因爲它們指向的邏輯合約不再存在。
參考文章
https://blog.openzeppelin.com/the-transparent-proxy-pattern
https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades
https://medium.com/immunefi/harvest-finance-uninitialized-proxies-bug-fix-postmortem-ea5c0f7af96b
https://medium.com/immunefi/wormhole-uninitialized-proxy-bugfix-review-90250c41a43a
V10: 治理攻擊
概述
治理攻擊是指操縱或利用去中心化協議或智能合約系統中的治理機制。這些攻擊旨在破壞治理系統的決策過程、投票系統或參數調整,使攻擊者獲得不當的控制權或從協議中獲益。
描述
治理攻擊可以採取多種形式,包括允許在沒有法定人數的情況下執行提案、允許在沒有任何投票步驟的情況下執行提案,或者直接操縱其他參與者的投票。這些攻擊可能會損害協議的去中心化性質並導致權力集中,或者爲攻擊者帶來經濟利益。治理攻擊在去中心化自治組織(DAO)中尤其重要,因爲決策權分布在代幣持有者之間。
預防
爲了防止治理攻擊,重要的是建立一個強大的、定義明確的和透明的治理框架,概述決策過程、投票機制和參與規則。實施安全、防篡改的投票系統,確保投票的完整性。這可能涉及使用加密技術、零知識證明或多重籤名方案來增強安全性。確保代幣的公平和去中心化分配,避免投票權集中在少數實體手中。考慮使用代幣歸屬或鎖定期等機制來阻止短期操縱行爲。確保大多數治理代幣不會分布在交易所之間,以便惡意行爲者可以獲得足夠的代幣來一致通過提案。
例子
治理攻擊的一個著名例子是對 Beanstalk 的攻擊,這是一種無需許可的 FIAT 穩定幣協議。黑客提交了兩份 Beanstalk 改進提案:BIP18 和 BIP19。第一個提案建議將資金全部轉移給攻擊者,第二個建議將價值 25 萬美元的 $BEAN 代幣發送到烏克蘭的官方加密捐贈地址。攻擊者從 Aave、Uniswap 和 SushiSwap 借出了超過 10 億美元,以獲得足夠的投票權(至少 ⅔ 多數)來觸發緊急治理執行。
參考文章
https://medium.com/immunefi/hack-analysis-beanstalk-governance-attack-april-2022-f42788fc821e
結論
隨着智能合約不斷發展並獲得廣泛採用,开發人員和審計人員及時了解最新的漏洞和安全最佳實踐至關重要。通過解決這十大智能合約漏洞,利益相關者可以增強其智能合約的安全狀況,並爲基於區塊鏈的系統的整體信任和可靠性做出貢獻。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。