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 的铸币数量,从而使攻击者有利可图。