BNO项目攻击事件分析 admin 102857文章 87评论 2023年7月21日01:31:34评论52 views字数 1213阅读4分2秒阅读模式 1 事件背景 2023年7月18日,Beosin Alert发出预警,BSC链上的BNO项目遭到攻击,损失约50万美元。 攻击交易为https://bscscan.com/tx/0x33fed54de490797b99b2fc7a159e43af57e9e6bdefc2c2d052dc814cfe0096b9 2 事件分析 攻击者用有id为13和14的Ocean NFT,并将这两个nft发送到攻击合约: 调用PancakeSwap cow-bno交易对的swap函数进行闪电贷,借出286449979562297806480711bno,这个数量是交易对中bno的余额减1: 进入闪电贷的回调函数pancakeCall: 将两个nft授权给pool合约,依次调用stakeNFT、pledge、emergencyWithdraw、unstakeNft: 可以看到调用pledge时向pool合约发送了286449979562297806480711bno,调用emergencyWithdraw时全部取了回来: 而在调用unstakeNft的时候,除了将两个nft返还,还额外发送了3743027038091722541135bno给攻击合约: 重复这个过程,可以一直从pool合约中抽取bno。 stakeNft可以存储Nft到pool合约,在调用函数的同时,会调用updatePool更新池子状态: 在updatePool中,会根据用户存放的nft数量,总的存款量,计算出一个附加值: 在调用emergencyWithdraw时会将用户的总存款返还,并将allstake和rewardDebt置0: 但显然,这个函数忘记了nft附加值这个东西,此时用户的存款已经全部取回,函数并没有对nft附加值进行操作。 这个时候再调用unStakeNft来取回存放的Nft,会调用pendingFit计算用户获取的利润,并发送给用户: 在计算利润时,会使用,所以就算把所有存款取回,依然还有存放nft的额外利润: 按照正常的逻辑,用户使用rePledge来取回存入的资产,这时候,函数会正常更新rewardDebet: 在调用unStakeNft计算利润的时候,由于两次计算rewardDebet的时候allStake和nftAddition都没有发生变化,所以计算出的userreward为0。无法取出更多token: 3 复现 这里重复循环调用直到池子中的bno被抽干,攻击成功: 完整POC:https://github.com/wangbar0133/neicun_poc#bno 4 影响 攻击者将获取到的bno代币通过pancakeCall换取到约50万UBSD并将其所得存放在地址0xdc109426972ae14d5B3D7e91B47D42fF1fd3C8cc 中: 同时bno项目方已在尝试与攻击者联系: 原文始发于微信公众号(山石网科安全技术研究院):BNO项目攻击事件分析 点赞 http://cn-sec.com/archives/1894214.html 复制链接 复制链接 左青龙 微信扫一扫 右白虎 微信扫一扫
评论