Defrost_Finance重入漏洞分析
https://twitter.com/PeckShieldAlert/status/1606276020276891650
攻击交易: 0xc6fb8217e45870a93c25e2098f54f6e3b24674a3083c30664867de474bf0212d 攻击合约:0x792e8f3727cad6e00c58d478798f0907c4cec340 攻击账号:0x7373dca267bdc623dfba228696c9d4e8234469f6 被攻击合约:LSWUSDC 0xff152e21c5a511c478ed23d1b89bb9391be6de96
分析交易过程,分析攻击方的获利点:
1) 攻击者先通过JLP获取闪电贷作为启动资金; 2) 攻击者再调用LSWUSDC合约的flashloan函数,获取194263946117单位USDC,这步骤将减少LSWUSDC合约中的USDC数量,将影响shares大小; 3) 攻击者将贷款获取的资金重新投入合约,将获取远超出正常值的shares; 4) 因为LSWUSDC合约不是基于恒定乘积的AMM池子,而是通过 onWithdraw(address(receiver),amount); onDeposit(address(receiver),amount + fee,0); 来确保回收贷款的; 5) 攻击者调用LSWUSDC合约的redeem函数,返回shares获取USDC资产368503793484单位; 6) 归还JLP的闪电贷,离场;
通过代码具体查看下漏洞原因:
因为攻击者先通过闪电贷获取USDC后,合约中的totaStake值将变小,使得存入时what值变大,即shares变大,可用于后续按比例取出USDC。
如果是使用恒定乘积公式的AMM池子存在重入问题,那会导致怎样的攻击方式呢? 在这种场景下,攻击者可以直接将贷款获得的代币再重新投入池子,因为这样就可以满足x*y = k的校验,但是池子会返给攻击者相应的lp代币作为存款证明。整个过程相当于使用池子的钱存入池子,而攻击者获得存款证明后,最终可凭此取出代币。具体案例可参考DFX Finance。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!