12月30日,鏈必應-區塊鏈安全態勢感知平台輿情監測顯示,Sashimi Swap(生魚片)項目於北京時間12月30日17:06遭受攻擊,總損失近20萬美元(近127萬人民幣) 。關於本次攻擊,成都鏈安技術團隊第一時間進行了事件分析。

#1 事件概覽

據悉,SashimiSwap 是一種基於AMM 和交換池的多鏈部署去中心化交易協議,同時部署在三條鏈上:Ethereum、HECO 和BSC,利用平台流動性池中的資金執行自動交易策略。黑客如何攻擊,我們細細解答。

#2 事件具體分析

交易Hash:

0xd6a816cc291b24267c03c23c730a84a2699f32a7cf714c8cbe3e47321c76b08f

黑客地址:

0xa8189407A37001260975b9dA61a81c3Bd9F55908

攻擊合約:

0x2ccc076d1de2d88209f491c679fa5bde870c384a

首先黑客先通過DVM的pair合約借出399.639個WETH,為後面攻擊做準備。

然後創建了三個token,分別是:

A代幣地址:

0xf1b43f4e14650ac8c4bb009d9b56eb77c1ae87cd

B代幣地址:

0x7a77073c1191f2d2fd31a71c758d44f3de0af831

C代幣地址:

0xbacbd121f37557e5ea1d0c4bb67756867866c3fe

用於後面創建交易對。

然後分別添加流動性:

首先用1個“B代幣”和1個“C代幣”進行1:1添加流動性。

再用1個WETH代幣和1個“C代幣”進行1:1添加流動性。

攻擊者把閃電貸借出的WETH兌換為uni,放進自己的“錢包”,第一次獲利。

攻擊者接著再把1個WETH和1個“B代幣”進行1:1添加流動性, 把247個WETH代幣和247個“A代幣” 進行1:1添加流動性,此時黑客已經花掉了400個WETH代幣,那麼下一步準備獲利。

緊接著,黑客直接調用swapExactTokensForETHSupportingFeeOnTransferTokens函數後獲利成功。黑客的兌換路徑為:A => WETH => B => C => WETH。

#3 事件复盤

我們閱讀了代碼,發現swapExactTokensForETHSupportingFeeOnTransferTokens函數存在一個嚴重的邏輯漏洞,都是以第一個pair記錄的WETH做計算。那麼就可以把第一個pair中的WETH兌換到其他pair中,從而獲利amountOut = balanceBefore.sub(balanceAfter)。

黑客再移除流動性,得到WETH,再用得到的WETH重複獲利兩次,最後歸還閃電貸攻擊貸出的WETH代幣。攻擊者最終獲利:6,261.304個uni,4,466,096Sashimi,63,762個usdt。近20萬美元。