Hotcoin Research:详解币安投
SharkTeam:Sonne Finance攻击事件分析
2024 年 5 月 15 日,Sonne Finance 遭受攻击,项目方损失超过 2 千万美元。
SharkTeam 对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
一、攻击交易分析
攻击者:0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
攻击合约:0x02fa2625825917e9b1f8346a465de1bbc150c5b9
目标合约:0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
攻击交易:0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0
攻击过程如下:
1. 闪电贷 35, 569, 150 VELO,并将这些 VELO Token 转移(transfer)至 soVELO 合约中
因为是直接转账(捐赠),没有铸造 soVELO Token。因此,soVELO 合约中,totalCash 增加了 35, 569, 150 VELO, soVELO 的 totalSupply 不变。
2. 攻击者新建合约0xa16388a6210545b27f669d5189648c1722300b8b,在新合约中对目标合约发起攻击,攻击过程如下:
(1)向新合约中转入 2 soVELO
(2)将 soWETH 和 soVELO 声明为抵押物
(3)从 soWETH 借贷 265, 842, 857, 910, 985, 546, 929 WETH
从以上 borrow 函数的执行过程中,根据 getAccountSnapshot 函数的返回值,发现:
对于 soWETH 合约,新合约余额为 0 ,借贷额为 0 ,兑换率(exchangeRate)为 208, 504, 036, 856, 714, 856, 032, 085, 073
对于 soVELO 合约,新合约余额为 2 ,即抵押了 2 wei 的 soVELO,借贷额为 0 ,兑换率(exchangeRate)为 17, 735, 851, 964, 756, 377, 265, 143, 988, 000, 000, 000, 000, 000, 000
exchangeRate 计算如下:
抵押 1 wei 的 soVELO,可以借贷不超过 17, 735, 851, 964, 756, 377, 265, 143, 988 VELO,而借贷 265, 842, 857, 910, 985, 546, 929 WETH,至少需要抵押 265, 842, 857, 910, 985, 546, 929 soWETH,
soWETH 的价格:soWETHPrice = 2, 892, 868, 789, 980, 000, 000, 000 ,
soVELO 的价格:soVELOPrice = 124, 601, 260, 000, 000, 000
抵押 1 wei 的 soVELO 可借贷的 WETH 数量如下:
1 * exchangeRate * soVELOPrice / soWETHPrice = 763, 916, 258, 364, 900, 996, 923
约 763 WETH。仅需 1 wei 的 soVELO 抵押就足以支持本次借贷。
借贷 265, 842, 857, 910, 985, 546, 929 WETH(约 265 WETH)换算成抵押物 soVELO,至少需要抵押的 soVELO 数量为:
265, 842, 857, 910, 985, 546, 929 * soWETHPrice / soVELOPrice / exchangeRate = 0.348
即 1 wei 的 soVELO 抵押物即可。
实际上 2 wei 的 soVELO 抵押物,在借贷时只用到了 1 wei
(4)赎回标的资产,即 35, 471, 603, 929, 512, 754, 530, 287, 976 VELO
exchangeRate = 17, 735, 851, 964, 756, 377, 265, 143, 988, 000, 000, 000, 000, 000, 000
赎回 35, 471, 603, 929, 512, 754, 530, 287, 976 VELO 需要的抵押物 soVELO 的数量为
35, 471, 603, 929, 512, 754, 530, 287, 976 * 1 e 18 / exchangeRate = 1.99999436
在计算时,因为计算采用了截断取整而不是四舍五入,实际计算的所需抵押物为 1 wei 的 soVELO。
实际抵押物为 2 wei 的 soVELO,其中 1 wei 用于上面的借贷 265 WETH,剩下的 1 wei 用于赎回 35 M VELO
(5)将借贷的 265 WETH 以及赎回的 35 M VELO 转账给攻击合约
3. 反复 3 次(共 4 次)创建新合约,重复攻击。
4. 最后,偿还闪电贷。
二、漏洞分析
以上攻击过程中利用了 2 个漏洞: