PancakeHunny 閃電貸 LP 池操控攻擊分析


背景

2021 年 10 月 20 日 UTC 時間上午 9 點,PancakeHunny 平台遭遇閃電貸智能合約攻擊,攻擊者通過操縱 PCS 上的 WBNB/TUSD 的流動性從而操縱了兌換比例,實現了 HUNNY 鑄幣合約的大量鑄幣,完成攻擊。

最終攻擊者獲利 230 萬美元(64.2 萬是穩定幣 + 435.31 ETH),並且大量鑄造 HUNNY 代幣,將 HUNNY 的價格從 0.3 拋售到 0.1 美元。​

這一操作的 TxHash 從 bscscan 上可以找到:0x1b698231965b72f64d55c561634600b087154f71bc73fc775622a45112a94a77。​下面我們來復盤一下整個攻擊手法和流程。

代碼中的根本原因

可以查看合約 VaultStrategyAlpacaRabbit,這個合約是可升級合約的原合約地址。目前該合約仍舊由線上 TUSD 單幣池合約地址進行代理轉發(也就是線上還沒有進行更換),但是目前官方已經發現了問題,已經關閉了該池的鑄幣(那其實還不如直接存 Alpaca Finance)。​我們在 VaultStrategyAlpacaRabbit 合約中,可看到以下代碼:

在上述代碼中,黃色高亮的一行就是此次攻擊的根本原因。原因就是因為這個 swap 的 Path 最終選用的是 [ALPACA, WBNB, TUSD] ,然而 TUSD/WBNB 的 LP Token 其流動性僅有 2 美元(這是目前的情況,可以查看 PCS 的流動性數據),於是攻擊者就通過閃電貸放大資金量,從而控制這組 LP Token 的兌換匯率,從而進行攻擊。​

接下來我們來分步驟解析這個過程:​

  • 攻擊者利用閃電貸,借出 270 萬 TUSD,並且全部通過 [TUSD, WBNB] 的 Path 兌換成了 WBNB。根據 AMM 的恆定乘積公式 x×y=k ,由於大量的 TUSD 進入到了 TUSD/WBNB Lp 池中,所以通過十分少量的 WBNB 沿着相反的 Path 就能兌換出大量的 TUSD。
  • 第二步,攻擊者會將一筆可觀的 TUSD 數額放入 TUSD 單幣池中,讓其占據了該池 99% 的收益。此時因為步驟一操控了 Lp 池,大量的 TUSD 會被兌換出來。
  • 第三步,攻擊者會調用 getReward() 方法,這個方法會調用 _withdrawStakingToken() 方法,其中會返回 withdrawAmount 這個變量。
withdrawAmount = _stakingToken.balanceOf(address(this)).sub(stakingTokenBefore); 

它會通過 _stakingToken 也就是我們的 TUSD 總量來計算。而 withdrawAmount 就是用來傳入到 minter 中,其價值的 30% 為總量負責鑄造 HUNNY 代幣的數量控制變量,從而造成大量的 HUNNY 被鑄造。

  • 攻擊者拋售大量的 HUNNY 完成此次經濟攻擊。

復盤

攻擊者完成本次攻擊,是與以往的 BUNNY 攻擊有所區別的,BUNNY 中的錯誤實在是太低級了,使用了賬戶余額的代幣數量來鑄造 BUNNY 。雖然 HUNNY 通過使用增量變量的方式避免了 BUNNY 的漏洞,但對於 LP Token 市值太低容易操縱這一環節沒有戒備心,從而導致了經濟漏洞。​

反思:在制作機槍池的時候,如果有 Minter 進行鑄造操縱,一定要慎之又慎,來驗證每一步用到的數量關系,再進行代碼編寫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM