本次攻擊的核心在於cheapSwap 函數中未進行K 值檢查,導致攻擊者可以通過在一次兌換過程中進行多次兌換操作以獲得額外的代幣。
By:Kong@慢霧安全團隊
圖片
據慢霧區消息,幣安智能鏈(BSC) DeFi 項目Impossible Finance 遭遇閃電貸攻擊。慢霧安全團隊第一時間介入分析,並將結果分享如下:
攻擊細節分析
Impossible Finance 的DEX 架構參考了Uniswap v2,但在Pair 的實現上有所不同。 Impossible Pair 分別實現了cheapSwap 與swap 兩個接口。 cheapSwap 函數限制了只由Router 合約可進行調用,swap 函數則是任意用戶都可調用進行代幣兌換操作。本次攻擊事件的根本原因正是出在這種特殊的代幣兌換架構上,接下來我們對此次攻擊進行具體分析:
首先攻擊者利用閃電貸從PancakeSwap 中藉出大量WBNB,並最終將其兌換成IF (Impossible Finance 代幣) 。
圖片
隨後攻擊者創建了一個由自己控制的代幣AAA (BBB),並與上一步驟中獲得的IF 代幣添加流動性。
圖片
之後攻擊者通過Router 傳入自定的兌換路徑(AAA -> IF -> BUSD) 將AAA 代幣兌換成BUSD 代幣,而問題正是出現在此兌換過程中。通過鏈上記錄我們可以很容易的發現攻擊者在將AAA 代幣兌換成IF 代幣的過程中進行了兩次兌換操作:
圖片
為什麼在一次兌換過程中會進行兩次兌換操作呢?
通過分析具體的內部調用流程我們可以發現,攻擊者在Router 合約調用AAA 合約的transferFrom 函數將AAA 代幣轉入Pair 合約的過程中,同時調用了一次Pair 合約的swap 函數(即在transferFrom 函數實現了正常轉賬與swap 調用的邏輯)。然後再通過項目設計預期的cheapSwap 再進行一次正常的代幣兌換操作。
圖片圖片
圖片
通過以上分析我們可以知道攻擊者在一次代幣兌換過程中分別通過調用swap 函數與cheapSwap 函數進行兩次代幣兌換操作,最終收到了額外的BUSD 代幣。那麼既然是進行兌換操作,理論上每次兌換操作都將導致K 值的變化,最終使得用戶無法獲得預期的代幣。
但通過分析Impossible Pair 的swap 函數與cheapSwap 函數的具體邏輯,我們發現一個驚人的情況:在swap 函數中進行了K 值檢查,而在cheapSwap 函數卻未進行K 值檢查而直接進行了update 操作。這就導致了攻擊者進行了多次兌換操作獲得了額外的BUSD。
圖片
圖片
攻擊流程
1、攻擊者先通過PancakeSwap 閃電貸借出WBNB,並將WBNB 兌換成IF 代幣。
2、創建惡意的代幣合約AAA(BBB),並在Impossible 中添加了AAA 代幣與IF 代幣流動性。
3、通過AAA -> IF -> BUSD 路徑進行AAA 代幣到BUSD 代幣的兌換,並在AAA 代幣轉入Pair 合約兌換成IF 代幣的過程中進行了一次IF 代幣與BUSD 的兌換操作,隨後再進行正常的cheapSwap 操作。最終獲得了額外的BUSD 代幣。
4、之後重複以上操作進行獲利。
總結
本次攻擊的核心在於cheapSwap 函數中未進行K 值檢查,導致攻擊者可以通過在一次兌換過程中進行多次兌換操作以獲得額外的代幣。慢霧安全團隊建議DeFi 協議在參考其他項目的基礎上進行創新的過程中應該充分的對其新的模型進行檢查驗證以避免此類安全事故的發生。
參考交易:
https://bscscan.com/tx/0x0220704a99ddfb982d26e65cc337f26b77dc057930b7aa1d848cc48ec77984a8
展開全文打開碳鏈價值APP 查看更多精彩資訊