加密预测市场Polymarket成长
Sonne Finance 攻击分析
作者:ZAN Team 的 Cara(X 账号@Cara6289)和 XiG(X 账号 @SHXiGi)
2024 年 5 月 15 日,Sonne Finance 在 Optimism 链上遭受攻击,损失高达 2 千万美元。
攻击发生后,X 上 @tonyke_bot 用户发推表示,其用约 100 美元保护了 Sonne Finance 的代币抵押池(也称为 market,类似于 Compound 中的 cToken)中剩余的约 650 万美元。
(https://twitter.com/tonyke_bot/status/1790547461611860182)
Sonne Finance 项目方发现攻击之后,迅速暂停了 Optimism上的所有 markets,并表示 Base 上的 markets 是安全的。
(https://twitter.com/SonneFinance/status/1790535383005966554)
攻击简述
Sonne Finance 是 Optimism 上的一个 fork 了 Compound V2 的去中心化借贷协议,供个人、机构和协议访问金融服务。Sonne Finance 协议将用户的 token 资产聚合起来,形成了借贷流动性池,为用户提供了一个类似银行的借贷业务。与 Compound 一样,协议参与者们可以将其持有的 token 抵押到 Sonne Finance 的借贷流动性池中,同时获得凭证 soToken(与 cToken 一样)。而 soToken 是一种生息资产凭证,随着区块的推进会产生一定的收益,同时还会获得 SONNE token 激励。而参与者凭借着手里的 soToken 还能从 Sonne 借贷资产池中借出其他 token,例如参与者可以抵押一定数量的 USDC 获得 soUSDC 凭证,随后借贷出WETH用于经一步的流通。Sonne Finance 协议中的抵押借贷可以是多对多的资产关系,在抵押借贷的过程中,协议会自动计算参与者地址的健康度(Health Factor),当健康度低于 1 时,该地址的抵押品将支持被清算,而清算者也能获得一定的清算奖励。
用户存入的 underlying token 与铸造的 soToken 的数量关系,主要与一个叫做 exchangeRate 的变量有关,这个变量粗略可以用来表示每个 soToken 价值多少 underlying token。exchangeRate 的计算公式如下:
在上述公式中,totalCash 是指 soToken 持有的 underlying token 的数量,totalBorrows 是指某 market 中被借出去的 underlying token 的数量,totalReserves 是指总储备金数量(其中包含借款人支付的利息),totalSupply 是指铸造的 soToken 的数量。
在赎回时,用户可以指定想要赎回的 underlying token 的数量redeemAmount,来计算需要销毁掉的soToken的数量redeemTokens,计算方式大概为「 redeemTokens = redeemAmount / exchangeRat 」,注意这里并没有对精度损失做处理。
本次攻击事件的本质是 market (soToken) 被创建出来时,攻击者进行了第一笔抵押铸造的操作,以少量 underlying token 铸造了很少的 soToken,导致 soToken 的「 totalSupply 」数值太小。攻击者继而利用了 Solidity 合约精度损失这个漏洞,再搭配直接往 soToken 合约发送 underlying token(不会铸造 soToken,也就意味着「 totalSupply 」不变,「 totalCash 」变大),而不是抵押 + 铸造的方式存入 underlying token。这样的操作使得合约中「 totalCash 」 变量变大,但是「 totalSupply 」 保持不变,从而导致 exchangeRate 变大。最终攻击者在赎回 underlying token 时,需要销毁的 soToken 少于抵押时铸造的 soToken,攻击者利用赚取的 soToken 去其他的 soToken(比如 soWETH、soUSDC)中借出 underlying token WETH、USDC,最终获利高达 2000 万美元。
攻击中涉及的关键地址
攻击准备交易:
https://optimistic.etherscan.io/tx/0x45c0ccfd3ca1b4a937feebcb0f5a166c409c9e403070808835d41da40732db96
攻击获利交易:
https://optimistic.etherscan.io/tx/0x9312ae377d7ebdf3c7c3a86f80514878deb5df51aad38b6191d55db53e42b7f0
攻击 EOA 相关地址:
0x5d0d99e9886581ff8fcb01f35804317f5ed80bbb
0xae4a7cde7c99fb98b0d5fa414aa40f0300531f43
攻击者(合约)相关地址:
0xa78aefd483ce3919c0ad55c8a2e5c97cbac1caf8
0x02fa2625825917e9b1f8346a465de1bbc150c5b9
underlying token(VELO Token V2):
0x9560e827af36c94d2ac33a39bce1fe78631088db
漏洞合约(soVELO,类似于 Compound 的 cToken):
0xe3b81318b1b6776f0877c3770afddff97b9f5fe5
X 上 @tonyke_bot 用户救援交易:
https://optimistic.etherscan.io/tx/0x816f9e289d8b9dee9a94086c200c0470c6456603c967f82ab559a5931fd181c2
攻击流程分析
前情提要