越來越多的人希望通過攻擊智慧合約來竊取資金,他們正在利用當智慧合約組合在一起時出現的漏洞進行攻擊。
2020年,對DeFi的攻擊中,被套取或盜取的總金額已經達到了3600萬美元。但因為dForce的攻擊者退還了被盜的2500萬美元,所以實際金額大約有 1100 萬美元。
與以太坊早期相比,每次駭客攻擊的平均損失價值已經明顯下降。在2020年的10次攻擊中,有8次的攻擊金額低於100萬美元。
與傳統的網路犯罪相比,區塊鏈上的資訊對攻擊者來說更有價值,因為對智慧合約的成功攻擊可以帶來直接的經濟回報。傳統被駭客攻擊的資訊,如被盜取的個人資訊,還需要通過出售來賺錢,但智慧合約上是直接存有資產的。
在以太坊早期,大多數攻擊都是基於找到個別漏洞,讓攻擊者有能力凍結或耗盡智能合約。2016年臭名昭著的DAO駭客事件就是如此,1.6億美元的ETH被盜,以太坊最終因此分叉。同樣,2017年的Parity多簽襲擊讓駭客盜取了3000萬美元,Parity錢包中1.5億美元被凍結,都是這類漏洞造成的後果。
這類智能合約的漏洞仍不時被人利用。最近,一名攻擊者成功地從代幣合約中竊取了所有的VETH,僅通過耗盡VETH-ETH Uniswap池就獲利了90萬美元。但這是VETH造成的一個簡單失誤,因為VETH修改ERC20代幣標準的方式有邏輯上的錯誤。
總的來說,現在的安全性有所提高,特別是那些關注度比較高的項目。它們的安全性提升是由於用戶對審計的期望和圍繞測試的工具改進推動的。最近DeFi中最大的安全問題是dForce 2500萬美元的數字資產在借貸市場中被盜。然而,由於攻擊者的IP位址被發現並與新加坡警方共用,因此這些資金被退了回去。
dForce的攻擊也可以認為是開發團隊特別嚴重的疏忽造成的結果,因為被利用的漏洞是重入(re-entrancy)。重入攻擊是DAO被耗盡的原因,這也一直是開發者在與ERC777代幣交互時需要考慮的一個眾所周知的問題。
ERC777代幣的一個顯著特點是可以通知將接收或發送資金的智慧合約–並允許合約根據這些資訊採取行動。如允許用戶從合約中提取所有資金,這個例子就展示了合約為何容易受到重入攻擊。
想像一下,一個合約有以下四個提現步驟:
- 用戶調用合同,準備從合同中提取所有的資金。
- 合約檢查用戶在合約中是否有資金。
- 合約將用戶在合約中的資金發送給用戶。
- 合約自行更新用戶在合約中沒有資金。
重入漏洞允許惡意用戶在合同完全執行之前再次調用合同( “重入”)。在上面的例子中,攻擊者可以在第三步和第四步之間重新進入合約,並在用戶的餘額更新之前再次提取。通過重複這個過程,他們可以從合約中提取所有存在的資金。
這個原理被用來攻擊dForce,當合約認為用戶在持續增加imBTC抵押品(一種ERC777代幣)數量的時候–然後合約就會允許使用者從系統中借到更多資金。攻擊者將他們假的imBTC抵押品增加到遠遠超過2500萬美元,然後以借貸交易的方式提取出dForce中的所有流動資金。
通過可組合性(composability)進行駭客攻擊
區塊鏈上的智慧合約是基於去信任(permissionless)來和用戶以及其他智慧合約交互的。對於那些設計智慧合約的人來說,很難考慮到未來有人可能與他們的合約進行交互的每一種方式。其他人可以構建一種智慧合約,以一種原作者不希望看到的方式與合約進行交互。
一個用戶使用在dForce攻擊中基於ERC-777標準的相同漏洞,從imBTC-ETH Uniswap池中抽走了22萬美元。在Uniswap的案例中,攻擊者從ETH-imBTC代幣池中移出了ETH,但imBTC代幣餘額並沒有增加。這樣的操作通常會增加ETH的價格。
與dForce案例不同的是,Uniswap的開發團隊在這並沒有真正的責任,他們幾乎不可能阻止人們落入這種類型的陷阱。即使Uniswap團隊確保他們的交互介面不允許使用者將流動性添加到一個可能被耗盡的池中,他們也無法阻止其他交互介面建立在允許它的智慧合約之上。事實上,這種特殊的攻擊方式在多年前就已經被廣泛討論過。
最近6月18日針對Balancer的攻擊,就是一個類似的在特定市場中利用非標準程式設計模式的例子。STA是一種ERC20代幣,有一種額外的通縮模型,即從每次轉帳中抽取1%的費用。攻擊者使用智慧合約在單筆交易中自動執行多個操作將WETH與STA 代幣來回交換24次,耗盡了其中一個Balancer流動性池中的STA代幣,直到池中只剩下0.000000000000000001 STA(1個weiSTA)。Balancer池沒有意識到STA的通縮模型,並根據1 weiSTA為其資產設定了一個新的價格。之後攻擊者對池中的WETH、LINK、SNX和WBTC進行了交易。通過這次攻擊,使兩個池子的資金損失超過了50萬美金。
一天后,Balancer遭受了第二個漏洞問題,同樣是由於與其他智慧合約交互的意外行為造成的。Compound的代幣分發要求用戶通過與Compound的智慧合約交互來領取自己的COMP。想要同時獲得COMP和BAL(通過提供流動性賺取的Balancer代幣)的用戶要用COMP創建流動性池,這樣他們就有資格獲得這兩種代幣。
攻擊者意識到,Balancer流動性池中的資產所產生的新COMP並不屬於任何人,所以攻擊者可以進入一個池中,獲得這些可用的COMP代幣,然後再帶著比他們放入流動性池更多的錢離開。就像現在發現的漏洞情況一樣,攻擊者利用閃電貸來最大化自己的資本,然後獲取最大收益。
利用區塊鏈的獨特屬性來進行攻擊
第三類攻擊涉及利用區塊鏈本身的屬性。
一個長期遭受此類問題困擾的協議是Synthetix。從2019年9月到2020年2月,這個協議的套利機器人不斷地在預言機更新之前運行。在Synthetix中,交易不是買賣雙方通過匹配進行交易,而是針對預言機提供的價格回饋進行交易,流動性由SNX代幣持有者提供。
當Synthetix的預言機在鏈上發佈價格回饋時,機器人會通過支付高額的交易費用,在預言機有機會更新價格之前被納入乙太坊區塊之中。因為這種搶佔先機的套利行為,Synthetix的交易量在單日最高達到了6900萬美元,而如今沒有套利機會的Synthetix平均交易量僅為150萬美元。
在3月12日(”黑色星期四”),資金庫(vault)的所有者在MakerDAO清算中意外損失830萬美元,交易費用也是造成這次意外的原因之一。當MakerDAO的資金庫(用戶存放抵押品並生成Dai的地方)的抵押品不足時,它們的抵押品(如ETH)就會被拍賣,籌集DAI並償還被清算資金庫的債務。通常情況下,拍賣中的中標者(keepers)會用DAI來換取金庫中的ETH,然後這些DAI會被銷毀掉。一旦債務被還清,資金庫的原主人就會收到剩餘的ETH。
3月12日的時候由於ETH價格突然下跌超過50%,很多資金庫進入清算程式。與此同時,乙太坊的網路變得非常擁堵,gas飆升至400gwei或正常價格的20倍,這導致大多數keepers無法即時報價。有一位keeper持續觸發清算,並以0美元的競價贏得了可用的ETH。
將來存在的治理攻擊?
隨著專案從開發團隊的集中控制轉向代幣持有者社區的去中心化治理,治理攻擊的問題可能會變得更加普遍。理論上,區塊鏈可能成為一個通過鏈上買選票來實現賄賂的絕佳工具。
買選票可以用於敵意收購,讓有敵意的一方購買另一個專案的多數投票權(代幣)更便宜。例如,一個借貸協定可以向另一個借貸協定的代幣持有者提供折扣,讓他們出售另一協議的代幣來換取協議自己的代幣。
敵意收購的例子已經發生在Steemit上。當這個社交媒體平臺背後的團隊將Steemit出售給Tron時,社區試圖讓Tron擁有的代幣投票權失效,但這種努力最終被火幣和幣安等大型交易所的投票權所消除。
隨著DeFi中工具的改進,攻擊者的“工具箱”也變得越來越高級。閃電貸讓任何擁有必要專業知識的人都可以攻擊其中的一個系統,並獲得更多的資本來實現利潤最大化。
如果說從COMP和BAL代幣發行中可以學到一件事,那就是無論什麼激勵方案,只要是有利可圖,總會有人去鑽空子。