“不可思議” 的被黑之旅 —— Impossible Finance

買賣虛擬貨幣

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


免責聲明:

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

推荐阅读

;