根據THORChain 4 月1 日發布的2022 年第一季度財資報告,儘管受到市場持續低迷和高度不穩定的地緣政治因素的雙重影響,該鏈的收入仍實現了增長。公開數據顯示,2022年第一季度THORChain實現收入21.7億美元。被譽為“跨鏈版UniSwap”的THORChain憑藉獨特的優勢在跨鏈交易市場站穩腳跟,獲得了投資者的廣泛認可。
在所有這些光鮮亮麗的背後,THORChain 也深受黑客攻擊的困擾。自在以太坊上推出以來,該鏈經常遭受安全漏洞,這一事實令人對其安全性產生懷疑。 4 月11 日,THORChain 發布關於網絡釣魚攻擊的推文,警告用戶不要與 [DeTHOR] 或錢包中的其他未知代幣,這再次引發了對其安全問題的擔憂。
CoinEx安全團隊在為CoinEx產品構建完善的安全體系的同時,還對區塊鏈空間的安全事件進行跟踪,幫助用戶從技術安全的角度更好地了解不同項目的安全性,降低投資風險。為了提高區塊鏈領域的安全標準,CoinEx安全團隊對THORChain(RUNE)的安全風險進行了分析。團隊希望THORChain 能夠通過優化相關智能合約代碼來注意和緩解以下風險。此外,這篇文章也是對用戶的一個警告,提醒他們要提高資產安全意識,避免資產損失。
THORChain (RUNE) 的安全性如何?
CoinEx安全團隊通過分析THORChain(RUNE)的合約代碼和邏輯,發現以下風險:
首先,讓我們看看THORChain (RUNE) 的合約代碼:
https://etherscan.io/address/0x3155ba85d5f96b2d030a4966af206230e46849cb#code
我們可以看出RUNE 是一個非常標準的ERC-20 代幣。需要注意的是,除了ERC-20 接口之外,THORChain (RUNE) 還提供了一個額外的接口:
根據transferTo(如上圖所示),THORChain(RUNE)使用tx.origin,這是其存在安全風險的原因之一。在這裡,我們應該解釋一下tx.origin 和msg.sender 的區別:
下圖描述了當普通地址調用智能合約時會發生什麼:
在這種情況下,msg.sender = account.address,並且tx.origin = account.address,這意味著msg.sender 與tx.origin 相同。
下面是一個賬戶調用合約A,合約A 調用合約B 的情況:
當合約A 調用合約B 時(如上圖),我們可以看出msg.sender 等於合約A 中的tx.origin。
但是,在合約B 中,msg.sender = contractA.address,而tx.origin = account.address。因此,tx.origin 就像一個全局變量,遍歷整個調用棧,返回最初發送交易的賬戶地址。這是關鍵問題:迄今為止,幾乎所有已知的針對THORChain (RUNE) 的攻擊都與tx.origin 相關。
現在讓我們看看攻擊者如何通過tx.origin 竊取用戶的RUNE 令牌:
攻擊一:從羊群中偷走一隻山羊
以太坊上的地址分為外部地址和合約地址。通過外部地址將ETH 轉入這兩類地址是有本質區別的。這 官方文檔 of solidity 指出,合約地址必須在進行轉賬之前實現接收以太幣功能。
根據tx.origin 的特性,黑客可能會構建攻擊合約:
當攻擊合約收到用戶的ETH 轉賬時,它會“從羊群中偷羊”——合約將在此過程中竊取用戶的RUNE 代幣。
攻擊二:內攻
內部攻擊是一種特殊類型的攻擊。當試圖通過內部攻擊竊取用戶的RUNE 時,黑客需要有一個中等令牌。此外,代幣還必須調用第三方合約。根據以太坊上RUNE的轉賬記錄,部分攻擊者通過AMP Token轉賬入侵RUNE。
AMP Token 使用ERC-1820 標準來管理Hook 註冊,並在每次轉賬時檢查Hook 是否註冊。如果Hook 已註冊,則將調用該Hook。
AMP Token 的合約代碼顯示,轉賬的最終實現是:_transferByPartition。同時,涉及到transferHook 的調用有兩個:_callPreTransferHooks(傳輸前)和_callPostTransferHooks(傳輸後)。特別地,_callPreTransferHooks 是針對from 地址,而_callPostTransferHooks 是針對to 地址(即接收地址)。
對於普通用戶來說,從自己那裡竊取代幣是沒有意義的。因此,攻擊者可能會利用_callPostTransferHooks。現在讓我們看看_callPostTransferHooks 的代碼。
IAmpTokensRecipient(recipientImplementation).tokensReceived()
我們可以看出,攻擊者可以利用的唯一回調是IAmpTokensRecipient(recipientImplementation).tokensReceived()
接下來,我們將說明如何在進行AMP 令牌傳輸時使用此調用來傳輸用戶的RUNE。
第1步: 需要調用合約(如下圖):
第2步: 部署合約獲取攻擊地址。
第3 步: 調用ERC-1820合約接口(setInterfaceImplementer)註冊接口。
ERC-1820 地址: 0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24
合約接口: setInterfaceImplementer(address toAddr, bytes32 interfaceHash, address implementationer)
特別地,toAddr 是AMP 傳輸的接收地址,
interfaceHash為AmpTokensRecipient的hash:
0xfa352d6368bbc643bcf9d528ffaba5dd3e826137bc42f935045c6c227bd4c72a
interfaceHash 是AmpTokensRecipient 的哈希值:
0xfa352d6368bbc643bcf9d528ffaba5dd3e826137bc42f935045c6c227bd4c72a
Implementer 是第2 步得到的Attack Address。
第4步: 引誘用戶將AMP 轉移到toAddr 以觸發回調,同時竊取他的RUNE。
攻擊3:網絡釣魚攻擊
顧名思義,在網絡釣魚攻擊中,攻擊者承諾提供令人難以置信的好處來引誘用戶執行某些合約操作。在這裡,我們將介紹一種常見的網絡釣魚攻擊。
第1步: 攻擊者發行一個ERC-20 代幣,並可能將其寫入任何涉及簽名的合約接口中。
第2步: 在Uniswap 或任何其他交換上創建交易對;
第3 步: 向所有持有RUNE 代幣的用戶/地址提供空投;
釣魚攻擊的前期工作基本就是通過以上這些步驟完成的。接下來,攻擊者只需要等待用戶進行掉期交易,用戶一旦執行諸如批准、轉移等操作,就有丟失其RUNE 的風險。
此外,為了進一步驗證THORChain合約代碼的安全風險,CoinEx與業內知名的兩家安全機構慢霧和PeckShield的安全團隊進行了討論。經慢霧和PeckShield證實,上述安全風險確實存在。
到目前為止,我們已經介紹了幾種類型的攻擊,以及用戶面臨的安全風險。
項目組應該如何優化合約代碼,讓自己更安全,保護用戶資產?
唯一的答案是謹慎使用tx.origin。
面對看似不可避免的攻擊,普通用戶如何降低風險並保護其資產? CoinEx 安全團隊提出以下建議:
- 對於第1 次攻擊:進行轉移時,跟踪估計的Gas 消耗量。對於普通的ETH 轉賬,21,000 的Gas 費已經綽綽有餘。如果氣體消耗量遠遠超過該數字,請小心。
- 對於第2 種攻擊:通過採用不同的錢包來隔離您的代幣。您可以將不同的令牌存儲在不同的地址中。當涉及到交易所提供的熱錢包地址時,需要格外小心。
- 第3 次攻擊:貪婪是萬惡之源。不要盲目參與任何空投活動。
安全一直是區塊鏈領域最關心的問題。包括項目團隊和交易所在內的各方在項目運營過程中應優先考慮安全,保障用戶資產安全,共同推動區塊鏈行業健康發展。