攻击者执行题案中的第五笔交易,设置提案中规定的借贷因子。
攻击者从VolatileV2AMM-USDC/VELO池子中闪电贷出数值为「35,469,150,965,253,049,864,450,449」的VELO代币,这会触发攻击者的hook函数。在hook函数中,攻击者继续执行攻击操作。
攻击者将自己持有的VELO代币发送给soVELO合约,以进一步增大exchangeRate。目前soVELO合约中一共有数值为「35,471,703,929,512,754,530,287,976」的VELO代币(攻击者三次转入的VELO代币和)。
攻击者创建新的合约 0xa16388a6210545b27f669d5189648c1722300b8b,在构造函数中,将持有的2个soVELO代币转给新创建的合约0xa163(以下称为攻击者0xa163)。
攻击者0xa163以持有的soVELO代币,从soWETH中借出数值为「265,842,857,910,985,546,929」的WETH。
攻击者0xa163调用soVELO的「redeemUnderlying」函数,指定赎回VELO代币的数值为「35,471,603,929,512,754,530,287,976」(几乎是所有攻击者此前转入或者抵押进soVELO合约的VELO代币数量),此时需要根据公式「redeemTokens=redeemAmountIn/exchangeRate」来计算赎回所需要销毁的soVELO代币的数量。
从「exchangeRateStoredInternal」函数可以看出,由于此时_totalSupply是2不是0,因此需要计算exchangeRate的值,通过公式「exchangeRate=(totalCash+totalBorrows-totalReserves)/totalSupply」计算出,目前的exchangeRate为「17,735,851,964,756,377,265,143,988,000,000,000,000,000,000」,这个值远远大于设置的初始exchangeRate「200,000,000,000,000,000,000,000,00」。
根据新的exchangeRate计算出的「redeemTokens」的值为「1.99」,由于Solidity向下取整的特性,「redeemTokens」的值最终为1。也就意味着攻击者0xa163使用数值为1的soVELO代币,赎回了此前存入的几乎所有的VELO代币。同时攻击者0xa163也赚取了从soWETH中借出的数值为「265,842,857,910,985,546,929」的WETH。
soVELO.redeemUnderlying:
soVELO.exchangeRateStoredInternal:
攻击者0xa163将借到的WETH和赎回的VELO代币全部转给了上层攻击者,然后自毁。
攻击者调用soWETH的「liquidateBorrow」函数,用来清算前面新创建的合约0xa163借贷的部分资产,目的是拿回锁定住的数值为1的soVELO代币。目前攻击者只持有数值为1的soVELO代币。
攻击者调用soVELO的「mint」函数,再一次抵押铸造soVELO代币,目的是凑够数值为2的soVELO代币,然后再次执行上述第3-8步,获利其他的undeylyingtoken。
攻击者执行数次第9步的操作,还掉闪电贷,获利离场。
攻击发生后,X上@tonyke_bot用户在交易0x0a284cd中,通过抵押1144个VELO代币到soVELO合约中,铸造了0.00000011个soVELO。这样操作之所以能够阻止攻击者进一步攻击,是因为这笔交易改变了soVELO中totalSupply的大小和持有的VELO代币的数量totalCash,而totalSupply增长对于计算exchangeRate产生的影响大于totalCash增长产生的影响,因此exchangeRate变小,从而导致攻击者进行攻击时,无法再利用精度损失赚取soVELO,导致攻击无法再进行。
攻击者攫取非法收益后不久便将资金进行了转移,大部分资金转移到了以下4个地址当中,有的是为了换个地址继续攻击,有的是为了洗钱:
0x4ab93fc50b82d4dc457db85888dfdae28d29b98d
攻击者将198WETH转入了该地址,然后该地址采用了相同的攻击手法,在下列交易中获得非法收益:
攻击结束后,该地址将上述非法所得转给了 0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb。
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
攻击者将724277USDC、2353VELO转入了该地址,并将USDC兑换成了Ether。随后立即将部分资金转入了Stargate跨链桥,剩下大部分非法资金残留在该地址中:
0xbd18100a168321701955e348f03d0df4f517c13b
攻击者将33WETH转入了该地址,并采用peelchain的方式尝试洗钱,洗钱链路如下:
0xbd18100a168321701955e348f03d0df4f517c13b -> 0x7e97b74252b6df53caf386fb4c54d4fb59cb6928 -> 0xc521bde5e53f537ff208970152b75a003093c2b4 -> 0x9f09ec563222fe52712dc413d0b7b66cb5c7c795。
0x4fac0651bcc837bf889f6a7d79c1908419fe1770
攻击者将563WETH转入了该地址,随后转给了 0x1915F77A116dcE7E9b8F4C4E43CDF81e2aCf9C68,目前没有进一步行为。
攻击者本次洗钱的手段相对来说较为专业,手法呈现多样性趋势。因此对于我们Web3参与者来说,在安全方面要持续不断地提高我们的反洗钱能力,通过KYT、AML等相关区块链交易安全产品来提高Defi项目的安全性。
精度损失需重视。精度损失导致的安全问题层出不穷,尤其是在Defi项目中,精度损失往往导致严重的资金损失。建议项目方和安全审计人员仔细审查项目中存在精度损失的代码,并做好测试,尽量规避该漏洞。
建议类似于Compound中cToken这种market的创建和首次抵押铸造操作由特权用户来执行,避免被攻击者操作,从而操作汇率。
当合约中存在关键变量依赖于「this.balance」或者「token.balanceOf()」的值时,需要慎重考虑该关键变量改变的条件,比如是否允许直接通过给合约转原生币或者代币的方式改变该变量的值,还是只能通过调用某特定函数才能改变该变量的值。
以上就是$100如何撬动$650万?Sonne Finance攻击分析的全部内容,望能这篇$100如何撬动$650万?Sonne Finance攻击分析可以帮助您解决问题,能够解决大家的实际问题是非常好学习网一直努力的方向和目标。