解讀智能合約:Harmony的跨鏈橋是如何被盜一億美金的?
十四君
2022-07-11 10:11
本文约4195字,阅读全文需要约17分钟
2022年6月24日,由Layer1公鏈Harmony開發的,以太坊與Harmony間的資產跨鏈橋Horizon遭到攻擊,損失金額約為1億美元。這到底是怎麼回事?

內容概要

二級標題

內容概要

二級標題

  • 內容概要

  • 二級標題

  • 2022年6月24日,由Layer1公鏈Harmony開發的,以太坊與Harmony間的資產跨鏈橋Horizon遭到攻擊,損失金額約為1億美元。

這到底是怎麼回事?

Horizon合約審計報告解讀

一級標題1、跨鏈橋技術原理

跨鏈,顧名思義是不同區塊鏈之間資產信息如何轉移的問題,也稱之為互操作性,而目前有超50種跨鏈解決方案,其方案定義是多種多樣的。

二級標題

《來自iosg-

二級標題

跨鏈橋方案一覽,誰能匯聚多鏈流動性

  • 二級標題

  • 1.1、跨鏈方案有哪些?

  • 概括來講,要實現資產價值在另一條鏈上恆定,有兩種大路徑按”價格”錨定和按”物理”錨定

乍一聽複雜,其實按價格錨定就是在各公鏈上的USDT這種穩定幣,他與美元1:1錨定,因此也屬於跨鏈資產的一種。

拋開各類穩定幣更直觀一種跨鏈方案則是物理錨定,即流動性總量是恆定的,其方案也很多(公證人、側鏈、中繼鏈、哈希鎖定等),咱們重點講公證人模式。

合約鎖定鑄造型:各類官方橋通用方案polygon/arbitrum/avax/celer,以及今天的主角harmony

圖片描述

圖片描述

二級標題

圖片描述

二級標題

《流動性總量與交易量,來自o3swap官網》

二級標題

  • Harmony開發的Horizon橋是非常標準的公證人鎖定鑄造型。

  • 因此其核心的操作就是

  • 是由於區塊鏈上的合約具有不可更改特性,如果不留後門的話,甚至一旦部署將無任何方式可以影響他的運作,正如無聊猿官方自己將所有權限轉入0地址,放棄所有權後,無任何方式可以進一步鑄造出新的猴子,其流動性總量將被鎖死。

同理的,不同公鏈之間雖然合約不同,但如果在以太坊上用合約鎖住10個ETH,在另一條公鏈上也以同樣有公信力的合約,來釋放10個wETH,這樣一來其實全局上流動性是固定的,只要wETH可以隨時轉回以太坊並兌換得到ETH,那wETH就可以被認為是具有了ETH的等同價值。

公證人:負責發現A鏈Lock鎖定事件後,去B鏈Mint鑄造出錨定代幣,轉入目標地址。

圖片描述

圖片描述

一級標題

圖片描述

一級標題

Horizon鏈橋TVL圖,來自dune

一級標題

2、Horizon橋的合約審計報告解讀

一次事故對很多Web3項目而言,做不到100%安全就基本等於0的價值,因此為了檢查合約的安全性,一般會測試模擬多種攻擊場景,通過checklist進行安全審查,以確保合約安全

開發或許幾天而已,但要足夠可靠則流程多且昂貴(一般報價按時間衡量10W刀起步)

審計報告的核心信息是:風險名稱、漏洞描述、風險等級、安全建議、修復狀態及審計結果等

而Horizon橋的合約審計報告是老牌審計公司PeckShield進行的,發現了5個漏洞風險是不是很難想像區區3行代碼都能有bug?

可看前文:

其實鎖定token的邏輯很簡單,就是用戶制定金額和目標地址,在授權代扣權限後,合約將USDT轉入此合約鎖定,並發出一個locked事件,讓鏈下的公證人可以得知資產已經被鎖定了。

但是如果是”通縮型“的token呢?進行safeTransferFrom 的過程中amount變少了怎麼辦?這就會出現鎖倉額低於B鏈釋放額的風險

【源碼解讀】你買的NFT到底是什麼?

可看前文:【源碼解讀】你買的NFT到底是什麼?

當然harmony最後肯定是修改優化了,採用轉移前後兩次讀取balance的方法來算出實際鎖定額。

【源碼解讀】你買的NFT到底是什麼?

二級標題

【源碼解讀】你買的NFT到底是什麼?

為了安全的Mint,其實標準協議是禁止向0地址mint的,如果lockToken 的時候目的轉入地址recipient 填寫為0地址,則會B鏈上鑄造失敗,造成鎖入此合約但無跨鏈效果,如果此金庫合約沒有預留合適的轉出方法則會永久鎖定。

2.3、高風險點

圖片描述

在原先程序裡,Mint鑄造資產unlock解鎖釋放,都是只能指定公證人進行。

圖片描述

這也正是本次中招的原因,harmony是最終將公證人改了多簽錢包,但只不過只改成3個,其中2個私鑰被盜就可以橫行無忌。PeckShield對Horizon橋的審計報告

區塊鏈瀏覽器使用指南見:

二級標題

  • wallet1:0x0d043128146654C7683Fbf30ac98D7B2285DeD00

  • wallet2:0x9E91ae672E7f7330Fc6B9bAb9C259BD94Cd08715

  • wallet3:0x58f4baccb411acef70a5f6dd174af7854fc48fa9

當我們在看Etherscan的時候,到底在看什麼?

  • MultiSigWallet:0x715cdda5e9ad30a0ced14940f9997ee611496de6

  • 二級標題

  • 當我們在看Etherscan的時候,到底在看什麼?

  • 二級標題

3.1、關鍵信息

攻擊者錢包

跨鏈橋相關地址

ETH的金庫地址:0xF9Fb1c508Ff49F78b60d3A96dea99Fa5d7F3A8A6

ERC20金庫地址:0x2dccdb493827e15a5dc8f8b72147e6c4a5620857

被盜公證人地址:0x812d8622c6f3c45959439e7ede3c580da06f8f25

3.2、盜取過程分析

盜取13100個Ether,詳情見交易Link(附錄引用)

執行的是確認某個交易ID(多簽投票中的一環)

公證人確認->等待確認的公證人數量達標->解鎖金庫資產轉入目標地址

在多簽合約合約代碼裡邏輯可以看出,這個函數會進行notConfirmed 判斷,因此只有系統之前設置過的公證人地址可以調用

後續會執行executeTransaction 方法,再調用isConfirmed 方法做判斷,如果認證這筆交易的管理員數量達到2位,就會內部調用EthManager 合約的unlockEth 方法,最終將ETH發送至攻擊者錢包。

至此很明顯,除了私鑰被盜,如此簡單明了的合約不會有什麼特別的犯錯可能性了。

4、思考總結

4.2、如何更安全?

雖然馬上harmony開出了100W美金,提出黑客歸還資產並承諾不追究責任,但即使黑客歸還且官方不追究也會有其他社會團隊做公訴,因此黑客的最佳路線只有想盡一切辦法為被盜資產脫敏。

截至6 月29 日,攻擊者已將大約35,000 個以太坊(約合3900 萬美元)轉移到Tornado Cash,這是一種常見的混幣器,雖然區塊鍊是賬本公開,任何交易均可被追踪,但是混幣器猶如為100個人集合交易,並不能準確得出哪筆資金最終落到哪個人手裡。

要優化可採用分佈式託管的方法,託管給MPC (Multi-Party Computation)公證人網絡,不超過一定比例的節點同時作惡即可保證安全

引用:

iosg-即使公證人稀少也可以參考雪崩橋採用的SGX可信計算技術

引用:

Avalanche Bridge:用英特爾SGX保護跨鏈資產

引用:

https://etherscan.io/tx/0x27981c7289c372e601c9475e5b5466310be18ed10b59d1ac840145f6e7804c97

本質上還是對安全重要性的淡漠,在跨鏈橋的開源代碼中寫的執行計劃,2年前就實現了可用的鏈橋,卻遲遲不進一步優化。

https://docs.harmony.one/home/general/bridges/horizon-bridge/audit

引用:

https://medium.com/avalancheavax/avalanche-bridge-secure-cross-chain-asset-transfers-using-intel-sgx-b04f5a4c7ad1

十四君
作者文库