如何通過恆定乘積黑掉SushiSwap?簡析SushiSwap第二次被攻擊始末
慢雾科技
2021-01-27 09:58
本文约1933字,阅读全文需要约8分钟
SushiSwap 再次遭遇攻擊,此次問題為DIGG-WBTC 交易對的手續費被攻擊者通過特殊的手段薅走。

背景

背景

二級標題

背景

二級標題

二級標題

二級標題

SushiMaker 是什麼

恆定乘積的公式很簡單,在不計算手續費的情況下,恆定乘積的公式為

攻擊流程

攻擊流程

也就是說每次兌換,其實都是遵循這個公式,及交易前後K 值不變,在兌換的過程中,由於要保持K 值不變,公式的形式會是這個樣子其中X 代表賣掉的代幣,Y 代表要購買的代幣,那麼每次能兌換到的代幣數量會是這個樣子(具體的推導過程就不演示了:D)攻擊流程

二級標題

攻擊流程

其中,bridgeFor 函數的邏輯如下:

總結

總結

根據bridgeFor 的邏輯,我們不難發現,如果沒有手動設置過特定幣種的bridge,那麼默認的bridge 是WETH,也就是說,在未設置bridge 的情況下,默認是將手續費兌換成WETH。而DIGG 這個幣,就是正好沒有通過setBridge 設置對應的bridge 的。

但是這裡還有一個問題,就是在swap 的過程中,如果這個交易對不存在,兌換的過程是失敗的。本次攻擊中,DIGG-WETH 這個交易對一開始並不存在,所以攻擊者預先創建一個DIGG-WETH 的交易對,然後添加少量的流動性。這個時候如果發生手續費兌換,根據前面說的恆定乘積的特性,由於DIGG-WETH 的流動性很少,也就是DIGG-WETH 中的WETH 上限很小,而SushiMaker 中的要轉換的手續費數量相對較大,這樣的兌換會導致巨大的滑點。兌換的過程會拉高DIGG-WETH 交易對中WETH 兌DIGG 的價格,並且,DIGG-WETH 的所有DIGG 手續費收益都到了DIGG-WETH 交易中。通過觀察DIGG-WETH 交易對的流動性情況,流動性最大的時候也才只有不到2800 美元的流動性,這個結果也能和公式的推導相互驗證。

總結

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

總結

https://www.sushiswap.fi/pair/0xf41e354eb138b328d56957b36b7f814826708724

本次攻擊和SushiSwap 第一次攻擊類似,都是通過操控交易對的兌換價格來產生獲利。但是過程是不一樣的。第一次攻擊是因為攻擊者使用LP 代幣本身和其他代幣創建了一個新的交易對,並通過操縱初始流動性操控了這個新的交易對的價格來進行獲利,而這次的攻擊則利用了DIGG 本身沒有對WETH 交易對,而攻擊者創建了這個交易對並操控了初始的交易價格,導致手續費兌換過程中產生了巨大的滑點,攻擊者只需使用少量的DIGG 和WETH提供初始流動性即可獲取巨額利潤。

https://mp.weixin.qq.com/s/-Vp9bPSqxE0yw2hk_yogFw

慢雾科技
作者文库