Defrost Finance 攻击事件分析
事件背景
2022 年 12 月 23 日,AVAX 上的 Defrost Finance 项目发生了重入攻击(V2),黑客获得了 173,000 美元。紧接着,在2022 年 12 月 24 日,项目方进行了 rugpull(V1),损失估计超过 1200 万美元。
12 月 26 日,Defrost Finance 称参与 V1 黑客攻击(rugpull)的黑客已经退还了资金。
攻击地址交易信息
重入
攻击交易:0xc6fb8217e45870a93c25e2098f54f6e3b24674a3083c30664867de474bf0212d
攻击者地址:0x7373Dca267bdC623dfBA228696C9d4E8234469f6
攻击合约地址:0x792E8f3727cad6e00c58d478798F0907c4cEC340
受害者合约地址:0xfF152e21C5A511c478ED23D1b89Bb9391bE6de96
rugpull
修改预言机交易之一:0x6307fdc4c7cce0c06a477db59a6ad378eb674cf1c902bd1b3748408926b2582d
铸币交易:0x69e9088b9fa395e8a4fca360c74ea86039510422a0fbbb98cae6872da14e8de2
开发人员地址:0x3cd5854fe3a13707b7882d8290d3cae793a7751a
清算者地址:0x6F31EB634ABa6921fBf15fc9aA6E08f11348f64f
项目方合约地址:0x5a733eb741bc080abae9bf3adaed9400416932f0
攻击详细过程
重入
- 攻击者部署攻击合约,利用 JoePair 中的 swap 函数,自行传入 calldata 来对 LSWUSDC 的 flashloan 进行调用
- 在攻击合约中重写 onFlashLoan 函数,并在其中对 LSWUSDC 的 deposit 进行调用,重复铸币
- 将两次铸币的金额全部取出,归还闪贷的金额后,剩下的 173,637 为收益
rugpull
- 项目方调用 setOracleAddress 函数,为大量代币的 Collateral Vault 手动设置恶意预言机
- 调用 joinAndMint 函数,铸造假的抵押代币
- 恶意清算
攻击原因分析
重入
在代码中,由于deposit 和 flashloan 函数缺少防止重入的措施,导致了攻击者可以通过onFlashLoan进行重入:攻击者通过恶意合约重入到了deposit,而_deposit 函数和 flashloan 函数中都会对 onDeposit 函数进行调用,而这个函数会进行铸币操作,也就导致了攻击者可以重复铸币,获取超额利润
rugpull
项目方发现了攻击发生后,意外的修改预言机地址,而清算逻辑是依托预言机来获取价格,这就导致了项目方使用liquidate函数进行了恶意清算
setOracleAddress 函数中,使用完全中心化的方法(多重签名)来判断是否可以更改预言机