本次攻擊事件是由於 Yearn Finance 的 yUSDT 合約錯誤的配置導致的。
(前情提要:Yearn Finance遭駭逾 1,000 萬美元!Aave急喊:沒漏洞、不受影響)
據慢霧區情報,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 合約錯誤的配置導致的。慢霧安全團隊建議在對協議進行配置時,應仔細檢查所有參數是否符合預期並進行充分的測試以確保協議的安全。
參考連結:
https://etherscan.io/address/0x5bac20beef31d0eccb369a33514831ed8e9cdfe0
(本文由作者 慢霧科技 授權,屬作者之觀點不代表動區立場。)
📍相關報導📍