2020 年 10 月 26 號,據慢霧區訊息 Harvest Finance 專案遭受閃電貸攻擊,損失超過 400 萬美元。以下為慢霧安全團隊對此事件的簡要分析。
1. 攻擊者透過 Tornado.cash 轉入 20ETH 作為後續攻擊手續費
2. 攻擊者透過 UniswapV2 閃電貸借出鉅額 USDC 與 USDT
3. 攻擊者先透過 Curve 的 exchange_underlying 函式將 USDT 換成 USDC,此時 Curve yUSDC 池中的 investedUnderlyingBalance 將相對應的變小
4. 隨後攻擊者透過 Harvest 的 deposit 將鉅額 USDC 充值進 Vault 中,充值的同時 Harvest 的 Vault 將鑄出 fUSDC,而鑄出的數量計算方式如下:
amount.mul(totalSupply()).div(underlyingBalanceWithInvestment());
計算方式中的 underlyingBalanceWithInvestment 一部分取的是 Curve 中的 investedUnderlyingBalance 值,由於 Curve 中 investedUnderlyingBalance 的變化將導致 Vault 鑄出更多的 fUSDC
5. 之後再透過 Curve 把 USDC 換成 USDT 將失衡的價格拉回正常
6. 最後只需要把 fUSDC 歸還給 Vault 即可獲得比充值時更多的 USDC。
7. 隨後攻擊者開始重複此過程持續獲利
其他攻擊流程與上述分析過程類似
參考交易雜湊:
0x35f8d2f572fceaac9288e5d462117850ef2694786992a8c3f6d02612277b0877
總結:此次攻擊主要是 Harvest Finance 的 fToken(fUSDC、fUSDT...) 在鑄幣時採用的是 Curve y池中的報價(即使用 Curve 作為喂價來源),導致攻擊者可以透過鉅額兌換操控預言機的價格來控制 Harvest Finance 中 fToken 的鑄幣數量,從而使攻擊者有利可圖。