2024 年 5 月 15 日,Sonne Finance 遭受攻击,项目方损失超过 2 千万美元。

作者:SharkTeam

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,即抵押了 2wei 的 soVELO,借贷额为 0,兑换率 (exchangeRate) 为 17,735,851,964,756,377,265,143,988,000,000,000,000,000,000

exchangeRate 计算如下:

抵押 1wei 的 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

抵押 1wei 的 soVELO 可借贷的 WETH 数量如下:

1 * exchangeRate * soVELOPrice / soWETHPrice = 763,916,258,364,900,996,923

约 763 WETH。仅需 1wei 的 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

即 1wei 的 soVELO 抵押物即可。

实际上 2wei 的 soVELO 抵押物,在借贷时只用到了 1wei

(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 * 1e18 / exchangeRate = 1.99999436 

在计算时,因为计算采用了截断取整而不是四舍五入,实际计算的所需抵押物为 1wei 的 soVELO。

实际抵押物为 2wei 的 soVELO,其中 1wei 用于上面的借贷 265WETH,剩下的 1wei 用于赎回 35M VELO

(5)将借贷的 265 WETH 以及赎回的 35M VELO  转账给攻击合约

3.  反复 3 次(共 4 次)创建新合约,重复攻击。

4. 最后,偿还闪电贷。

二、漏洞分析

以上攻击过程中利用了 2 个漏洞:

(1)捐赠攻击:向 soVELO 合约直接转账(捐赠)VELO Token,改变了 exchangeRate,使得攻击者可以在只有 1wei soVELO 的抵押物的情况下,借贷出约 265 WETH

(2)计算精度问题:利用计算过程中的精度损失以及被修改的 exchangeRate,在只抵押了 1wei soVELO 的情况下,可以赎回 35M VELO 

三、安全建议

针对本次攻击事件,我们在开发过程中应遵循以下注意事项:

(1)项目在设计和开发过程中,要保持逻辑的完整性和严谨性,尤其存款、质押、更新状态变量以及计算过程中乘除法计算结果的取舍问题,要尽可能多考虑一些情况,使得逻辑完整,没有漏洞。

(2)项目上线前,需要由第三方专业的审计公司进行智能合约审计。

免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。