據慢霧區情報,2023 年4 月13 日,去中心化收益聚合平台Yearn Finance 遭到攻擊,攻擊者獲利超千萬美金。慢霧安全團隊以簡訊的形式分享如下:
相關信息
Yearn 的yUSDT 合約設計存在aUSDT、dydx 頭寸、iUSDC 與cUSDT 儲備,用戶在deposit/withdraw 時會根據上述儲備餘額計算用戶所能獲得的份額/所需存款的數額。
攻擊核心點
此次攻擊的原因在於攻擊者利用yUSDT 合約被錯誤設置了fulcrum 地址,從而操控yUSDT 合約中的穩定幣儲備餘額,通過在yUSDT 中存入USDT,以獲得大量的非預期的yUSDT 代幣進行獲利。
具體細節分析
1、攻擊者首先通過閃電貸借出大量的DAI、USDC 和USDT,接著通過Curve 的ySwap 將DAI 和USDC 換成USDT,以消耗yUSDT 合約中的aUSDT 儲備。
2、接著攻擊者為Aave Pool v1 上存在負債的用戶還款,目的是增加Aave Pool v1 中的USDT 數額,以便yUSDT 中的aUSDT 能夠順利被贖回。
3、緊跟著調用yUSDT 合約的deposit 函數進行USDT 存款,得到相對應的yUSDT 代幣。為後續通過withdraw 清空yUSDT 中aUSDT 儲備做準備。
4、為了確保withdraw 時能夠清空yUSDT 中aUSDT 儲備,攻擊者調用iUSDC 合約的mint 函數鑄造iUSDC 後,將iUSDC 直接轉給yUSDT 合約,為yUSDT 合約增加儲備深度。
5、隨後攻擊者調用yUSDT 合約的withdraw 函數進行取款,由於此時provider 指定為AAVE,因此yUSDT 會通過Aave Pool v1 贖回USDT 給提款人。
6、由於攻擊者在之前通過iUSDC 增加了合約中的儲備,因此在此次提現中可以將yUSDT 裡的aUSDT 儲備全部清空。
7、此時yUSDT 合約中的aUSDT、dydx 頭寸與cUSDT 儲備都被操控為0 了。最後,為清空iUSDC 儲備,攻擊者調用yUSDT 合約的rebalance 函數,進行儲備更新。
8、由於此時yUSDT 中只剩餘iUSDC,因此合約的新provider 將會被指向iUSDC,導致Rebalance 函數會先進行_withdrawAll 操作,再通過餘額獲取的方式更新儲備。
9、而在_withdrawAll 操作中會燃燒掉iUSDC 以獲得USDC 代幣,但在更新儲備時獲取的是yUSDT 合約中USDT 的餘額。因此fulcrum 儲備被錯誤的指向了iUSDC,導致此時yUSDT 合約儲備被操控為0。
10、攻擊者為確保能通過存款獲得大量的yUSDT,向yUSDT 合約中轉入1 wei 的USDT。
11、最後,攻擊者調用yUSDT 的存款函數,存入10,000 枚USDT,獲得1,252,660,242,850,000 枚yUSDT,並通過curve 將yUSDT 換成大量的yDAI、yUSDC、yTUSD。
總結
本次攻擊事件是由於Yearn Finance 的yUSDT 合約錯誤的配置導致的。慢霧安全團隊建議在對協議進行配置時,應仔細檢查所有參數是否符合預期並進行充分的測試以確保協議的安全。