慢霧:詳解 DeFi 協議 bZx 二次被黑

買賣虛擬貨幣
前言今早,bZx 疑似遭遇第二次攻擊,不同的是本次的物件是 ETH/sUSD 交易對,但也許有人會有疑問,sUSD 不是對標 USD 的穩定幣嗎?這都能被攻擊?攻擊手法具體是怎樣的?帶著這樣的疑問,針對此次事件,慢霧安全團隊接下來將覆盤這兩次攻擊過程。在第一次攻擊中,攻擊者結合 Flash loan 和 Compound 中的貸款,對 bZx 實施攻擊,主要分成以下幾步:1. 從 dYdX 借了 10000 個 ETH2. 到 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 個 ETH5. 歸還 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. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;