ChainSwap 跨鏈黑客攻擊事件及原因分析

作者:李尼,Molin

鏈聞 “讀懂跨鏈資產橋 Chainswap 超 20 個項目被盜背後的原因” 一文對跨鏈項目 Chainswap 黑客攻擊事件做了分析和解讀,而本次黑客攻擊影響到超過 20 個 DeFi 項目,代幣都被盜取。

作為專業跨鏈橋開發團隊,這裡我們又深入研究了項目方的代碼並複盤和還原了黑客攻擊的過程。這裡提供一篇更加詳細深入的分析報告和並對跨鏈交易的安全提出一些我們的建議。

Chainswap 項目對跨鏈資產控制安全的設計採用的是以下 4 個思路:(本文內容對這些設計思路簡稱為 “原設計”)

  1. 沒有採用多方安全計算 MPC 對跨鏈資產的鑄造(Mint)進行控製而採用了更為簡單,中心化程度高的多方簽名(多簽,Multi-sig)進行控制
  2. 透過過給予一些受控地址(白名單地址)做多籤來實現跨鏈資產的鑄造
  3. 在 2. 多簽沒有實施的情況下,只能採用單點簽名(即單個地址即可以簽名鑄造)。考慮到單地址可能會出現惡意白名單地址(沒有透過公開查到項目方如何確定的第一批白名單地址)或地址私鑰丟失,只能給予每個地址每天一定的鑄造額度(Quota),一旦額度用完,該地址就不能再繼續鑄造
  4. 透過限制可簽名地址,或者叫對白名單地址進行中心化的管控,即可簽名地址權限控制客觀評價,該設計安全性上除了犧牲了去中心化的特點外,也應該不會出現問題。但是很遺憾,黑客事件還是發生了,為什麼呢?我們分析了其代碼,發現發現以上 4 大安全的設計無一得到實現

讓我們還原黑客攻擊的過程:
首先,針對其中一筆黑客交易進行分析。
在瀏覽器中可以看到,在這一比交易中,合約從 0x0 地址鑄幣 1,000,000 個 RAI 代幣(rai.finance) 到黑客地址。

BSC 網絡 txHash: 0x0f994b6262972d18a37f94630a251d6cb7efd44b23d7c168410e2613be1118d4

在這筆交易中,黑客調用的合約地址是:0x0e128fb9f266f0cfedeb3b789f6fd4af50d51b84

該合約是 chainSwap 項目 github 中的 Factory.sol 合約
(代碼地址:https://github.com/chainswap/contracts/blob/master/Factory.sol)

調用的函數是:
MappingToken(is MappingBase) 合約的 receive 函數:

輸入的參數為:

可解析為:
fromChainId : 1
to : 0xeda5066780de29d00dfb54581a707ef6f52d8113 (HackerAddress)
nonce : 0
volume : 1000000e18
Signature :
000000000000000000000000b9d6aa3d7b5d87ca8512151d9c1f3bf60f8d4c71
000000000000000000000000000000000000000000000000000000000000001b
e219bb1937a2048f5f943d977c5db2c5c49c0072100ed83a721a2bc016315329
7dafdfbc7b2aa59df90c4f61716f2b74d045c185dded7512396e0e4032884a97

這些代碼是什麼意思呢?用描述性語言翻譯一下就是:
從合約代碼中可以看到,receive 接口使用多方簽名(“多簽”)的方式進行簽名驗證,但從黑客提交的交易訊息可以看到,此多簽功能並未啟用,實際上使用的是 “單簽”。即單一簽名驗證通過即可完成跨鏈代幣的鑄造(mint)。原設計 2 並沒有實施。
同時,合約中未限制簽名人地址,只要簽名合法,任何人都可通過驗證。原設計 4 沒有實施。

更要命的是:任何一個新地址,都有 1,000,000 的可用額度:
透過 Myetherwallet 錢包查詢合約,可得到當前此簽名人的額度為:1000000e18

用 myetherwallet 查詢筆者自己的地址,也查到了 1000000e18 的可用額度:

代碼中的這個寫法逆了天了,相當於突然任何地址都有了幾乎是無限鑄造的權利!
下圖是使用 remix.ethereum.org 讀取的數值:

同樣顯示任何的地址都有 1e24 的可用額度。
分析合約源代碼,可以看到以下內容:
在 5 月 2 日的一次代碼修改中(https://github.com/chainswap/contracts/commit/b09ec89395978557fb1871900793bae9871b1a1c),開發人員增加代碼將原本需要權限的額度分配功能改為自動分配無限額度:

根據此段代碼邏輯,當一個全新的地址查詢可用額度時,會返回一個默認額度,也就是上文提到的 1000000e18。這導致所有的新地址,均可自己簽名,調用 receive 方法完成鑄幣操作。黑客正是利用此漏洞,完成了大量的鑄幣操作。原設計 3 完全失效。

從我們局外人角度,對最終原因分的分析:

項目方一開始的設計思路並沒有什麼問題,並且第一版在 Github 中看到代碼也實現了設計的初衷:只是單簽,但是透過給這麼多地址(沒法確認是白名單地址還是跨鏈用戶地址)每天由管理員主動發放額度來防止意外。
不過由於每天給若干地址主動授權額度需要通過發交易實現,一是操作比較繁瑣;二是以太坊每天發若干交易還是需要花費不少 gas 的,所以項目方某個 boss 覺得不需要這樣搞了(開玩笑):工程師你們修改一下變成不限制額度就得了,多好? !然後工程師就真的把額度的限制取消了,卻沒有看到前半部分代碼是沒有對可簽名地址做設置,換句話說就是:任何人(地址)都突然擁有了無限的鑄造跨鏈資產的權利,好比一家銀行一天突然打開了金庫大門,任何人都可以進來大搖大擺的隨便把保險箱裡的現金拿走!結果就是原安全設計 2、3、4 都徹底崩塌。

最後我們再次提醒做跨鏈賽道的項目方,一定要想清楚到底要用什麼方法來實現安全管控。同時也要客觀評價自身工程能力是否能安全的實現設計思路。比如 Wanchain 一直不用中心化程度高的多簽方案而是採用多方安全計算 MPC,也是防止出現單點故障(single point of failure)的可能。隨著跨鏈賽道越來越熱,需求也越來越大,同時被黑客盯上的可能也越大。這裡建議用到跨鏈的 DeFi 項目也可以考慮採用中心化的方案完全由項目方託管資產,用中心化機制保證資產安全,而不是一味的追求 “去中心化”,但是自身功力又達不到,最後搞成了 “畫虎不成反類犬” 的局面。


關於 Avalanche

Avalanche 雪崩協議是新一代的、革命性的共識協議;Avalanche 雪崩公鏈正是基於雪崩共識打造的、對開發者最為友好的、可定制化的、高速安全可靠的高性能公鏈。

Avalanche 鏈上交易完成速度飛快、擁有最多數量的驗證節點,同時糅合了 PoS 共識的優點,保證所有鏈上活動的安全性。雪崩協議具有極速、低費用和綠色環保的特點。支持智能合約的應用如果想超越對手,都可通過部署在雪崩協議上獲得卓越競爭力。不可置信?現在就試用一下雪崩協議上的應用吧。

雪崩官網:https://avax.network
雪崩繁中群:https://t.me/avalanche_tw
雪崩中文 Facebook 專頁:https://www.facebook.com/Avalanche.TW
雪崩中文 Medium:https://medium.com/@avaxtw
更多生態項目:https://twitter.com/AVATAR_AVAX

加密貨幣屬於高風險投資,本網站內容均不構成任何投資建議與責任。

掌握虛擬貨幣、區塊鏈大小事