慢霧:詳解 DeFi 協議 bZx 兩次被黑始末

買賣虛擬貨幣

本文作者:yudan@慢霧安全團隊

前言

今早,bzx 疑似遭遇第二次攻擊,不同的是本次的物件是 eth/susd 交易對,但也許有人會有疑問,susd 不是對標 usd 的穩定幣嗎?這都能被攻擊?攻擊手法具體是怎樣的?帶著這樣的疑問,針對此次事件,慢霧安全團隊接下來將覆盤這兩次攻擊過程。

在第一次攻擊中,攻擊者結合 flash loan 和 compound 中的貸款,對 bzx 實施攻擊,主要分成以下幾步:

  1. 從 dydx 借了 10000 個 eth
  2. 到 compound 用 5500 eth 借了 112個 btc 準備拋售
  3. 到 bzx 中用 1300個 eth 開 5 倍槓桿做空,換了 51.345576 個 btc,而這裡換取的 btc 是透過 kyber network 來獲取價格的,然而 kyber network 最終還是呼叫 uniswap 來獲取價格,5 倍槓桿開完後兌換回來的 51 個 btc 實際上是拉高了 uniswap 中 btc/eth 的價格,換取價格是 1/109,但是實際上大盤的價格不會拉到這麼多
  4. 用從 compound 借來的 112 個 btc 來在 uniswap 中賣掉,由於第三步中 bzx 中的 5 倍槓桿已經把價格拉高,所以這個時候出售 eth 肯定是賺的,然後賣了 6871 個 eth
  5. 歸還 dydx 中的借貸

第二次攻擊與之前稍有不同,但核心都在於控制預言機價格,並透過操縱預言機價格獲利。

注: 下文中出現的 weth 是 eth 的 token 化代幣,可統一認為是 eth。與 eth 之間的兌換比例是 1:1

細節剖析

本次發生攻擊的交易雜湊為:

0x762881b07feb63c436dee38edd4ff1f7a74c33091e534af56c9f7d49b5ecac15

透過 etherscan 上的分析,我們看到這筆交易中發生了大量的 token 轉賬。

這麼多轉賬交易中,攻擊者一共購買了 20 次 susd,最終獲利離場,那麼攻擊者具體是怎麼操作的呢?我們使用區塊瀏覽器 bloxy.info 來做進一步分析。

1、賽前準備

和第一次一樣,首先攻擊者需要從 flash loan 借入一定的金額開始本次的攻擊,第一次攻擊是從 dydx 借入 10000 eth,這次,攻擊者選擇從 bzx 本身支援的 flash loan 下手,借入 7500個 eth。

2、發球

在完成從 bzx 的借入之後,攻擊者開始透過 kyber 進行 susd 的買入操作,第一次使用了 540 個 eth 購買了 92,419.7 個 susd, 這個操作令 weth/susd 的價格瞬間拉低,捧高了 susd 的價格。這次的交易兌換的比例大概為 1:170,而 kyber 最終是透過 uniswap 來進行兌換的,所以此時 uniswap 的 weth/susd 處於低位,反過來,susd/weth 升高。

在完成第一次的 540 個eth的兌換之後,攻擊者再次在 kyber 進行 18 次小額度的兌換,每次使用 20 個 eth 兌換 susd,從 etherscan 我們能夠看到,每一次的兌換回來的 susd 金額在不斷減少。

這表明 susd/weth 的價格被進一步拉昇,這加劇了 uniswap 中 susd/weth 的價格,此時價格已經達到頂峰了,大概是 1:157。

在完成以上兩步操作之後,攻擊者已經完成狩獵前的準備,隨時可以開始攻擊。

3、一桿進洞

在完成對 susd/weth 的拉昇後,攻擊者此時需要採集大量的 susd,為後續兌換 weth 做準備。為了達成這個目的,攻擊者向 synthetix 發起 susd 的購買,透過向 synthetix 傳送 6000 eth 購買 susd,直接把 synthetix 中的 susd 買空,synthetix 合約返還 2482 個 eth 給攻擊者。

完成了上面的操作後,攻擊者直接對 bzx 發動總攻,直接用之前操作得來的一共 1,099,841 個 susd 向 bzx 兌換 weth,此時由於 bzx 兌換還是要去查詢 uniswap 的 susd/weth 的價格,而這個價格已經被攻擊者人為拉得很高了,此時兌換,就能透過 1,099,841 個 susd 換取大量的 weth, 此次交易一共用 1,099,841 個 susd 換取了 6792 個 weth,此時攻擊已經完成。

4、歸還借貸

完成了對 bzx 的攻擊之後,將 7500 eth 歸還給 bzx, 完成閃電貸流程,從 bzx 來,再回到 bzx 去,還使 bzx 遭受了損失。

賽後覆盤

透過分析攻擊者的攻擊手法,我們統計下攻擊者在攻擊過程中的支出和收入情況。

收入

7500 => bzx 閃電貸
+
2482 => synthetix 返還
+
6792 => 使用 susd 在 bzx 兌換 weth
=
16774 eth

支出

540 + (20*18) => 拉高 susd/weth 價格
+
6000 => 買空susd
+
7500 => 歸還bzx閃電貸
=
14400 eth

總的收益為: 16774 - 14400 = 2374 eth

防禦建議

兩次攻擊的主要原因還是因為 uniswap 的價格的劇烈變化最終導致資產的損失,這本該是正常的市場行為,但是透過惡意操縱市場,攻擊者可透過多種方式壓低價格,使專案方造成損失。針對這種透過操縱市場進行獲利的攻擊,慢霧安全團隊給出如下建議:

專案方在使用預言機獲取外部價格的時候,應設定保險機制,每一次在進行代幣兌換時,都應儲存當前交易對的兌換價格,並與上一次儲存的兌換價格進行對比,如果波動過大,應及時暫停交易。防止市場被惡意操縱,帶來損失。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;