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 的鑄幣數量,從而使攻擊者有利可圖。