CertiK:Osmosis漏洞被利用,500万美元损失事件分析

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

北京时间2022年6月7日,CertiK审计团队监测到Osmosis漏洞被利用,导致了约500万美元的资产受到损失。

此次事件起因于函数MaximalExactRatioJoin中存在的代码漏洞。

该函数由CalJoinPoolShares调用,根据输入的代币数量计算份额。函数MaximalExactRatioJoin的漏洞导致一旦用户通过JoinPool提供流动性,CalJoinPoolShares就会向用户提供远大于其原本应给的LP份额。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

推特公告链接: 

https://twitter.com/osmosiszone/status/1534470729797976064

攻击步骤

该次攻击中有多人恶意进行多笔交易,以下分析以攻击者①中两个被利用的交易为例。

① 攻击者调用JoinPool()将29.95 USDC和26.03 OSMO的流动性添加至GAMM池(本例中为池ID 678),铸成的LP份额为8.79 GAMM-678。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

② 之后,攻击者从678池中调用ExitPool(),使用之前的份额移除流动性。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

③ 由于对剩余代币的份额计算错误,攻击者能够提取约为存款金额1.5倍的代币。

④ 攻击者多次重复以上攻击步骤,以获取更大的利润。

漏洞分析

此次事件漏洞的根本原因在于对剩余代币的份额计算错误。

一旦用户在x/gamm/keeper/msg_server.go中通过Msg.JoinPool信息调用函数JoinPool()。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

该函数即会调用x/gamm/keeper/pool_service.go第95行的函数JoinPoolNoSwap()。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

在函数JoinPoolNoSwap()中,通过调用函数getMaximalNoSwapLPAmount()在第192行计算出shareOutAmount的所需流动资金后,函数JoinPoolNoSwap()将在osmosis/x/gamm/pool-models/balancer/amm.go第286行调用pool.JoinPool()。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

然后函数pool.JoinPool()将在第252行调用函数pool.CalcJoinPoolShares(),并且在执行pool.CalcJoinPoolShares()时在第283行调用cfmm_common.MaximalExactRatioJoin()。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

函数cfmm_common.MaximalExactRatioJoin()将在添加流动性时计算usedAmount(需要的流动性),它将份额比例与用户投入的代币数量相乘(第90行)。

然而,所需的流动资金应该等于minShareRatio * 池中的总流动资金。通常情况下,总流动性大于一个用户存入的代币,也就是usedAmount小于预期。这里需要注意的是返回值remCoins记录了流动性增加后的剩余代币。usedAmount比预期的要小,因此导致remCoins的值比预期的要大。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

在执行函数cfmm_common.MaximalExactRatioJoin()后,这些剩余的代币remCoins将通过调用函数pool.calSingleAssetJoin()在第300-310行被用来向资金池添加更多的流动性。然而,由于remCoins的数量比预期的要大,所以提供给用户的份额将比预期的多。

CertiK:Osmosis漏洞被利用,500万美元损失事件分析

资产去向

Osmosis已官放宣布发现该漏洞,并正在进行修复。被盗资金与CEX账户有关,并已通知执法部门。Osmosis还宣布,利用Osmosis漏洞的四个人已经被确认,其中两人将归还资金;另外两人Osmosis正在进行联系,等待进一步沟通。

Osmosis表明,所有损失都将得到弥补。这些资金将来自其战略储备,而不是社区的资金池。另外被盗的资金将大概率被追回。

漏洞交易

该次攻击中有多人恶意进行多笔交易,我们以其中一人的一次交易作为示例:

攻击者①:https://www.mintscan.io/osmosis/account/osmo1hq8tlgq0kqz9e56532zghdhz7g8gtjymdltqer

相关的漏洞交易

如有疑问联系邮箱:微信:ETH_88889
*本文转载自网络转载,版权归原作者所有。本站只是转载分享,不代表赞同其中观点。请自行判断风险,本文不构成投资建议。*