北京时间2022年6月7日,CertiK审计团队监测到Osmosis漏洞被利用,导致了约500万美元的资产受到损失。
此次事件起因于函数MaximalExactRatioJoin中存在的代码漏洞。
该函数由CalJoinPoolShares调用,根据输入的代币数量计算份额。函数MaximalExactRatioJoin的漏洞导致一旦用户通过JoinPool提供流动性,CalJoinPoolShares就会向用户提供远大于其原本应给的LP份额。
推特公告链接:?
https://twitter.com/osmosiszone/status/1534470729797976064
攻击步骤
证监会市场二部副主任吴奇超:基于区块链的场外市场基础设施基本搭建完成:金色财经报道,证监会市场二部副主任吴奇超表示,经过近三年探索与实践,证监会构建了物理分散、逻辑统一的“中央监管链﹣地方业务链”双层链架构的区域性股权市场新型金融基础设施,区块链建设工作进展顺利并逐步覆盖全市场,基于区块链的场外市场基础设施基本搭建完成,在数据规范治理、穿透式监管、各方资源整合、创新应用服务等方面取得了积极成效,为区域性股权市场高质量发展和数字化转型打下良好基础。[2023/8/12 16:21:41]
该次攻击中有多人恶意进行多笔交易,以下分析以攻击者①中两个被利用的交易为例。
①攻击者调用JoinPool()将29.95USDC和26.03OSMO的流动性添加至GAMM池,铸成的LP份额为8.79GAMM-678。
Bitfinex CTO谈及“Luna崩盘事件”:Tether 30天内支付了200亿美元储备金:2月9日消息,Bitfinex首席技术官Paolo Ardoino近期接受专访时谈到,2022年Luna的崩盘让Tether的储备受到了考验。Ardoino称:“就加密行业的法定货币而言,Tether是最大的门户。很多人想赎回Tether,并在48小时内赎回了70亿美元。那是我们储备金的10%。”
为了作为比较,Ardoino提到了美国华盛顿互惠银行(WaMu)是如何在10天内支付了其储备的11%(167亿美元)后破产的。这使得银行无法进行日常活动。然而,美国房价的下跌及其客户群大多较为贫穷,也导致了该银行的破产。
WaMu在10天内支付了11%的准备金,但Tether必须在2天内支付10%。根据Ardoino的说法,支付持续了一个月零三天,在此期间Tether支付了25%的储备金,超过200亿美元。还有一个例子就是,FTX上60亿美元的提现激增是导致该加密货币交易所破产的部分原因。(Techpoint)[2023/2/9 11:56:47]
②之后,攻击者从678池中调用ExitPool(),使用之前的份额移除流动性。
Memories of Qilin by Emily Xie系列NFT近24小时交易额增幅超100%:金色财经报道,OpenSea数据显示,Memories of Qilin by Emily Xie系列NFT近24小时交易额为337ETH,增幅达136%,24小时交易额排名位列OpenSea第二。[2022/11/6 12:21:58]
③由于对剩余代币的份额计算错误,攻击者能够提取约为存款金额1.5倍的代币。
④攻击者多次重复以上攻击步骤,以获取更大的利润。
漏洞分析
此次事件漏洞的根本原因在于对剩余代币的份额计算错误。
一旦用户在x/gamm/keeper/msg_server.go中通过Msg.JoinPool信息调用函数JoinPool。
FaceDAO将对持有twit代币的用户对进行空投:据官方消息,FaceDAO宣布,作为新一代社交媒体平台,将对持有twit代币的用户进行空投。[2022/10/29 11:56:08]
该函数即会调用x/gamm/keeper/pool_service.go第95行的函数JoinPoolNoSwap()。
在函数JoinPoolNoSwap()中,通过调用函数getMaximalNoSwapLPAmount()在第192行计算出shareOutAmount的所需流动资金后,函数JoinPoolNoSwap()将在osmosis/x/gamm/pool-models/balancer/amm.go第286行调用pool.JoinPool()。
Multichain与KardiaChain达成跨链合作:据官方消息,跨链路由协议Multichain与KardiaChain达成跨链合作,支持4种ERC-20资产(BNB、USDC、WETH、WBTC)在KardiaChain和包括以太坊、BNB Chain在内的7条区块链之间安全快速低手续费的跨链交易。
东南亚区块链生态系统KardiaChain拥有50多万用户;Multichain作为跨链基础设施,目前已与56条主流公链合作,支持超过2400种资产跨链。[2022/7/8 2:00:19]
然后函数pool.JoinPool()将在第252行调用函数pool.CalcJoinPoolShares(),并且在执行pool.CalcJoinPoolShares()时在第283行调用cfmm_common.MaximalExactRatioJoin()。
函数cfmm_common.MaximalExactRatioJoin()将在添加流动性时计算usedAmount,它将份额比例与用户投入的代币数量相乘。
然而,所需的流动资金应该等于minShareRatio*池中的总流动资金。通常情况下,总流动性大于一个用户存入的代币,也就是usedAmount小于预期。这里需要注意的是返回值remCoins记录了流动性增加后的剩余代币。usedAmount比预期的要小,因此导致remCoins的值比预期的要大。
在执行函数cfmm_common.MaximalExactRatioJoin()后,这些剩余的代币remCoins将通过调用函数pool.calSingleAssetJoin()在第300-310行被用来向资金池添加更多的流动性。然而,由于remCoins的数量比预期的要大,所以提供给用户的份额将比预期的多。
资产去向
Osmosis已官放宣布发现该漏洞,并正在进行修复。被盗资金与CEX账户有关,并已通知执法部门。Osmosis还宣布,利用Osmosis漏洞的四个人已经被确认,其中两人将归还资金;另外两人Osmosis正在进行联系,等待进一步沟通。
Osmosis表明,所有损失都将得到弥补。这些资金将来自其战略储备,而不是社区的资金池。另外被盗的资金将大概率被追回。
漏洞交易
该次攻击中有多人恶意进行多笔交易,我们以其中一人的一次交易作为示例:
攻击者①:https://www.mintscan.io/osmosis/account/osmo1hq8tlgq0kqz9e56532zghdhz7g8gtjymdltqer
相关的漏洞交易?
JoinPool
https://www.mintscan.io/osmosis/txs/573EFD7828573B06FF6C13DFEDC3B2FFC281D4F78854D9B9F676528490C3396B
ExitPool
https://www.mintscan.io/osmosis/txs/E789B8FF7A42F27A0AC352C5C1281EA27996B6F22C5B24478A9B85C5919DE637
攻击者②:
https://www.mintscan.io/osmosis/account/osmo1tg70tuzekpd376dpqr68yx5a7r709w6x8jtxha
相关的漏洞交易?
JoinPool
https://www.mintscan.io/osmosis/txs/380A10103F53296A1CE663FDA5CF79DA904E0EC175C866C5FDFB106A934C64BD
ExitPool
https://www.mintscan.io/osmosis/txs/D70852934B81194DA6C776F2DA90AF095A19F7018894350E19A369FF5A1EC810
写在最后
如果文件x/gamm/pool-models/internal/cfmm_common/lp.go在审计范围内,可通过审计发现这一风险因素。
CertiK在此提醒大家,除了审计之外,新增的代码也需要在上线前及时进行相应测试。
来源:金色财经
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。