ccryptoo 1 1649844857
新聞

CoinEx 安全團隊:揭秘 THORChain(RUNE)安全風險

被譽為「跨鏈版 UniSwap」的 THORChain 在以太坊發行以來,安全事件頻傳引起市場對其安全性的質疑。CoinEx 安全團隊對此進行了風險剖析,期望能引起項目方重視,同時警醒用戶增強資產安全意識。
(前情提要:DeFi 安全|THORChain第二起駭客攻擊!4,000 ETH 損失官方承諾全額返還

 

(本文為廣編稿,由 CoinEx 撰著、提供,不代表動區立場。 )


4月 1 日,THORChain 官方公佈了 2022 年 Q1 財報,在 2022 年初期持續性低迷的市場行情和高度不穩定的地緣政治雙重因素影響下,THORChain 營收實現了正增長。

從公開數據顯示 THORChain 第一季度收入 2.17 億美元。被譽為「跨鏈版 UniSwap」的 THORChain 憑藉自身的產品獨特性成功躋身跨鏈交易市場,受到投資者的青睞。

延伸閱讀:Thorchain|想成為跨鏈的 Uniswap ,原生代幣 RUNE 的價值捕獲模式為何?

看似光鮮的背後,THORChain 也飽受駭客盜幣之苦。自 THORChain 在以太坊發行以來,安全事件頻發引起市場對 THORChain 安全性的質疑。

4 月 11 日,THORChain 官方推特發布一則注意網路釣魚攻擊的貼文,警告用戶不要與錢包的 [DeTHOR] 或其他未知 Token 進行互動,再次引發用戶對 THORChain 安全問題的擔憂。

ccryptoo 1 1649844857

CoinEx安全團隊在專注自身產品的安全體系建設以外,同時保持對區塊鏈行業安全事件持續性關注,希望從技術安全的視角幫助用戶更好地了解不同項目的安全性,減輕項目投資風險。

出於促進行業安全規範的角度出發,CoinEx 安全團隊對近期關注度較高的項目 —— THORChain(RUNE)進行了安全風險剖析。期望能夠引起項目方重視並進行合約程式碼的優化,同時警醒用戶增強資產安全意識,規避資金損失風險。

THORChain(RUNE)的安全性如何?

CoinEx 安全團隊經過對 THORChain(RUNE)合約程式碼及邏輯進行分析,總結 THORChain(RUNE)可能存在的風險:

首先,透過查看 THORChain(RUNE)的合約程式碼:

https://etherscan.io/address/0x3155ba85d5f96b2d030a4966af206230e46849cb#code 

我們可以看到這是一個相對標準的 ERC-20 Token。值得注意的是,除了標準的 ERC-20 標準介面,THORChain(RUNE)還額外提供了一個接口:

ccryptoo 1 1649844858

如上圖所示,在 tranferTo 我們可以看到 THORChain(RUNE)使用了 tx.origin,這是導致 THORChain(RUNE)風險存在的因素之一。在這裡,我們需要解釋下 tx.origin 與 msg.sender 的區別:

下圖是普通地址直接調用合約的情況:

ccryptoo 1 1649844858 1

這種情況下,智能合約裡:msg.sender = account.address, tx.origin = account.address。 msg.sender 和tx.origin 是一樣的。

接下來,我們再觀察下地址調用合約,合約再調用合約的情況如何:

ccryptoo 1 1649844859

如上圖所示,在合約再調用合約的情況下,我們看到對於合約 contractA, 其 msg.sender 和 tx.origin 沒有區別都是 account.address。

但是對於 contract B,結果顯示 msg.sender 等於合約 A 的地址,而 tx.origin 則為 account.address。因此, tx.origin 相當於一個全局變量,它遍歷整個調用棧並返回最初發送交易的帳戶地址。這就是問題的關鍵所在,截至目前為止,THORChain(RUNE)已知的駭客攻擊事件幾乎都是因為 tx.origin。

接下來,讓我們看看攻擊者是如何透過 tx.origin 的特性盜取用戶的 RUNE 代幣:

第一種方式:順手牽羊

以太坊上地址分為:外部地址和合約地址。通過外部地址給兩種類型的地址轉帳 ETH 有著本質的區別。透過查看solidity 的官方文檔,我們知道要給合約地址轉帳合約地址必須實現 receive 方法。

結合 tx.origin 的特性,攻擊者可以構造一個 Attack 合約:

ccryptoo 1 1649844859 1

透過 Attack 合約,只要用戶給該合約轉帳 ETH,在轉帳過程中,Attack 合約就會順手牽羊,把用戶的帳上持有的 RUNE 同步順走。

第二種方式:珠聯「幣」合

「珠聯『幣』合」則相對比較特殊,攻擊者若透過本方式盜取用戶的 RUNE 不僅需要一個媒介 Token,還需要該 token 有機會調用第三方合約。藉由觀察以太坊上 RUNE 的轉帳記錄,發現有攻擊者通過 AMP token 的轉帳盜取用戶 RUNE 的記錄。

AMP Token 使用 erc1820 協議進行 hook 註冊管理,每次 transfer 時都會有檢測是否有註冊 Hook。如有,則調用對應的 Hook 回調。

透過查看 AMP Token 的合約程式碼,我們發現 transfer 最終執行的是:_transferByPartition,其中有兩處涉及 transferHook 的回調。一個是轉帳之前:_callPreTransferHooks,一個是轉帳之後:_callPostTransferHooks。

_callPreTransferHooks 是針對 from 地址,而 _callPostTransferHooks 則針對的是 to 地址,即接收 token 的地址。

對普通用戶而言,薅自己的 token 並沒有任何意義。因此,對攻擊者而言,可以操作的是_callPostTransferHooks。讓我們來查看 _callPostTransferHooks 的程式碼:

ccryptoo 1 1649844860

注意看,唯一可能被利用的回調 IAmpTokensRecipient(recipientImplementation).tokensReceived()

下面將詳細介紹如何利用該回調在轉帳 AMP Token 的同時轉走用戶的 RUNE。

第一步:需要一個回調合約,如下所示:

ccryptoo 1 1649844861

第二步:部署第一步的合約得到地址 Attack Address。

第三步:調用 erc1820 合約介面 setInterfaceImplementer 註冊介面。

  • erc1820地址:0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24
  • 合約接口:setInterfaceImplementer(address toAddr, bytes32 interfaceHash, address implementer)

其中:toAddr 為轉走 AMP 的接收地址,interfaceHash 為 AmpTokensRecipient 的 hash:
0xfa352d6368bbc643bcf9d528ffaba5dd3e826137bc42f935045c6c227bd4c72a

Implementer:為第二步部署得到的 attack address

第四步:引誘用戶向 toAddr 轉 AMP 觸發回調,同時轉帳用戶的 RUNE。

第三種方式:投懷送抱

「投懷送抱」顧名思義是攻擊者透過贈送用戶一些可觀的福利從而引誘用戶進行合約操作。下面將介紹一種常見的方式。

第一步:攻擊者發行一個 ERC-20 token,他可以寫入任何涉及到簽名的合約接口中。

ccryptoo 1 1649844862第二步:在 Uniswap 或者其他 swap 創建交易對。

第三步:給所有持有 RUNE token 的用戶地址進行空投;

通過以上三步驟,前期的「投懷送抱」工作基本完成,接下來只需等待用戶去 swap 交易,用戶只要進行 approve、transfer 等操作都有 RUNE 丟失的風險。

此外,為進一步核實 THORChain 合約程式碼的安全風險問題,CoinEx 安全團隊與行業兩家知名安全機構慢霧安全團隊及派盾安全團隊進行了討論,經慢霧安全團隊和派盾安全團隊驗證後,認為以上提到的安全風險確實存在。

CoinEx 安全團隊建議

那麼,項目方該如何優化合約代碼以提高項目的安全性,確保用戶資產安全呢?

無他,唯有慎用 tx.origin。

另一方面,作為普通用戶面對防不勝防的盜幣方式時,該如何規避風險保護自我資產。對此,CoinEx 安全團隊建議:

1. 針對第一種盜幣方式:在轉帳時需要注意預估的 gas 消耗。普通的 ETH 轉帳,21,000 的 Gas 消耗足矣,若發現 Gas 消耗遠超於 21,000,則需要加強警惕。

2. 針對第二種盜幣方式:建議進行錢包隔離。不同的 token 存放在不同的錢包地址,尤其是交易所的熱錢包地址,更應多加小心。

3. 針對第三種盜幣方式:貪婪是萬惡之源,切勿盲目參與空投活動。

安全是區塊鏈行業更古不變的話題,無論是項目方、交易所還是所有的行業參與者都應當將安全作為項目運營的重中之重,承擔起保護用戶資產安全的責任,共同推動行業良性發展。

📍