BNO项目攻击事件分析



1

事件背景

2023年7月18日,Beosin Alert发出预警,BSC链上的BNO项目遭到攻击,损失约50万美元。
BNO项目攻击事件分析
攻击交易为https://bscscan.com/tx/0x33fed54de490797b99b2fc7a159e43af57e9e6bdefc2c2d052dc814cfe0096b9



2

事件分析

攻击者用有id为13和14的Ocean NFT,并将这两个nft发送到攻击合约:
BNO项目攻击事件分析
调用PancakeSwap cow-bno交易对的swap函数进行闪电贷,借出286449979562297806480711bno,这个数量是交易对中bno的余额减1:
BNO项目攻击事件分析
进入闪电贷的回调函数pancakeCall:
BNO项目攻击事件分析
将两个nft授权给pool合约,依次调用stakeNFT、pledge、emergencyWithdraw、unstakeNft:
BNO项目攻击事件分析
可以看到调用pledge时向pool合约发送了286449979562297806480711bno,调用emergencyWithdraw时全部取了回来:
BNO项目攻击事件分析
而在调用unstakeNft的时候,除了将两个nft返还,还额外发送了3743027038091722541135bno给攻击合约:
BNO项目攻击事件分析
重复这个过程,可以一直从pool合约中抽取bno。
stakeNft可以存储Nft到pool合约,在调用函数的同时,会调用updatePool更新池子状态:
BNO项目攻击事件分析
在updatePool中,会根据用户存放的nft数量,总的存款量,计算出一个附加值:
BNO项目攻击事件分析
在调用emergencyWithdraw时会将用户的总存款返还,并将allstake和rewardDebt置0:
BNO项目攻击事件分析
但显然,这个函数忘记了nft附加值这个东西,此时用户的存款已经全部取回,函数并没有对nft附加值进行操作。
这个时候再调用unStakeNft来取回存放的Nft,会调用pendingFit计算用户获取的利润,并发送给用户:
BNO项目攻击事件分析
在计算利润时,会使用,所以就算把所有存款取回,依然还有存放nft的额外利润:
BNO项目攻击事件分析
按照正常的逻辑,用户使用rePledge来取回存入的资产,这时候,函数会正常更新rewardDebet:
BNO项目攻击事件分析
在调用unStakeNft计算利润的时候,由于两次计算rewardDebet的时候allStake和nftAddition都没有发生变化,所以计算出的userreward为0。无法取出更多token:
BNO项目攻击事件分析
BNO项目攻击事件分析



3

复现

BNO项目攻击事件分析
这里重复循环调用直到池子中的bno被抽干,攻击成功:
BNO项目攻击事件分析
完整POC:https://github.com/wangbar0133/neicun_poc#bno



4

影响

攻击者将获取到的bno代币通过pancakeCall换取到约50万UBSD并将其所得存放在地址0xdc109426972ae14d5B3D7e91B47D42fF1fd3C8cc 中:
BNO项目攻击事件分析
同时bno项目方已在尝试与攻击者联系:
BNO项目攻击事件分析
BNO项目攻击事件分析
BNO项目攻击事件分析


原文始发于微信公众号(山石网科安全技术研究院):BNO项目攻击事件分析

版权声明:admin 发表于 2023年7月20日 下午6:08。
转载请注明:BNO项目攻击事件分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...